Posted at

Cousera - Andrew Ng 先生の Machine Learning Week 2

More than 1 year has passed since last update.

前回 から一ヶ月近く経ってしまったその理由とは・・・


概要

変数が複数になった Linear Regression について学びました。


  • 複数の変数に対して最急降下法を使う場合に、Feature Scaling という手法を使うとよい

  • J(θ) の変化をプロットして Learning Rate を変えるとよい

  • Octave のチュートリアル

  • Octave で書いたプログラムの提出


所感

学習率や Feature Scaling の設定が思っていたより感覚的に行われていて面白かった。最急降下法は使いやすいツールなんだと感じました。


講義メモ


univariate linear regression

前回までのやつ

h_θ(x) = θ_0+θ_1x


Multivariate linear regression

今回のサンプルごとにn個データがあるバージョン

h_θ(x) = θ_0+θ_1x_1+θ_2x_2 ... θ_nx_n

行列で書くと

h_θ(x) = θ^Tx

このとき、

x_0 = 1

とおく


Feature Scaling


  • 最急降下法を早く収束させるテクニック

  • 値の幅が大きく異なると時間がかかる x1が0〜2000, x2 が1〜5 のようなとき

  • 同じ範囲(-1〜1)になるようスケーリングする

  • 1 に大した意味はなく、3 とか -2 とかなら問題ない

  • Andrew 先生的には -3 to 3 や -1/3 to 1/3 くらいなら問題ないらしい

  • x0以外について平均が0になるようにする

例: xi が 100 to 2000 なら

xi := (price - 1000) / 1900

このくらいにする


最急降下法が正しく動いてるか確認する方法


  • イテレーション回数を横軸にJを縦軸にしてJがちゃんと毎回下がっていっているか確かめる

  • 何回くらいで収束するかは分からない

  • J(θ)がとても小さい値しか下がらなくなったら停止するautomatic convergence testもできるが、そのとても小さい値を決めるのは難しいのでグラフをプロットして確かめるのがよい


αの決め方


  • グラフが増えていったら αが大きすぎる

  • お椀型のように下がって増えてのときも大きすぎる

  • 波打つように上がり下がりするときも大きすぎる

  • 十分に小さければ下がっていくが、収束に時間がかかる

  • 小さすぎると思う値から3倍ずつ大きくするか、大きすぎると思う値から1/3倍ずつ小さくするかでだいたいいい感じのαを見つけられる


polynomial regression

曲線にフィッティングできる

h_θ(x) = θ_0 + θ_1x

のような変数がxひとつしかないものでも、

h_θ(x) = θ_0 + θ_1x + θ_2x^2

のようにするとか、

h_θ(x) = θ_0 + θ_1x + θ_2\sqrt{x}

のようにすると曲線が作れる

データのグラフから洞察を得て仮説を作る (どう増えていくか、どういう曲線かとか)


Normal Equation 正規方程式

θ = (X^TX)^{-1}X^Ty

Jの傾き = 0 となる θ (それぞれのθの微分方程式を解いたもの) をまとめるとこうなる


Gradient Descent vs Normal Equation


  • α を決める必要がある / αはない

  • 多くの iteration が必要 / iteration は必要ない

  • n が大きいと機能する / n が大きいと計算量が莫大


    • -> n が 1000 くらいなら (現代のコンピュータなら) Normal Equation でよい

    • -> 10000くらいから悩む 10^6 なら Gradient Descent を使う




Octave と課題メモ

平均値を計算する mean と標準偏差を計算する std があり、(X - mean(X)) / std(X) とすると例の計算ができそうなのですが、std(X) にゼロが含まれていると NaN になってしまうので困りました。ところが 0 の場合は 1 で除算する zscore というそのものズバリな関数がありました。


コースの switch について

due date をしばらく過ぎると web の画面にクラスを切り替えるボタンが出てきて、押すと次の週のクラスに切り替わります。以降の期日が全部ずれてまたスケジュールを始めることができます。

公文式も進研ゼミも宿題を積み上げて結局辞めてしまった僕はこの仕組でモチベーションが保たれたのですごい良いと思いました。


Programming Assignment

この週の最後に宿題提出です。

Mutivariate linear regression を Octave で実装してサーバーに送信すると、機械的に採点され、必要な課題を達成すると完了となります。

Feature Scaling などは必須ではない課題になっており、とりあえず時間があったらやることにして置いておきました。


なぜ遅れたか

通勤時間で iPhone を使って進めていたのですが、iOS の Coursera アプリでキーボードに隠れて解答ボタンが押せないクイズがあったり、そもそもプログラミング課題ができないなどの問題があり、家での時間が取れずに終わらせずにいました。さらに Windows 10 に Octave をインストールしたのですが、頻繁に固まったりして結局 Mac でやるなどして無駄に時間を割いてしまいました。

ただ、課題自体はちゃんと授業を見返せば簡単で、Octave の使い方についても授業で詳細な説明があったので、特に Coursera 以外の資料を見なくてもこなすことができました。


遅れたもう1つの理由

5pb. ウィンターセールで買った CHAOS;HEAD NOAH が面白すぎて電車でずっと Vita を使っていたからでした。

はい。Week 3 に進んでまた動画で進められるので通勤勉強タイムを再開します!