Machine Learning (Andrew Ng) @ Coursera その2


第二回目の Machine Learning by Andrew Ng氏

今回は、線形回帰問題の解法として、最急降下法と正規方程式があるけど、
それらの特性について理解しようぜという話が主。


Feature scaling

最急降下法の収束スピードは各軸の値のスケールが近い方が速い。
スケールが揃っていないと、最急降下法における微分値が大きくなるケースが増えて(?)、
収束が遅くなる。
歪んだ楕円形を解消するため、各軸の数値をスケーリングすると収束特性が向上する。
この辺の数理的な背景については言及しないが、図的には納得の行く話。


覚えること:
 フィーチャーを同じ範囲に入るようにスケーリングすることで早く最急降下法が収束する。
 ( ⇔ より少ないイタレーション回数で収束する)

フィーチャースケーリングの一つとしては、Mean normalizationが便利
平均値で引いて、標準偏差でスケーリングするいわゆる標準化と呼ばれるよく知られた手法。


Gradient Descent in Practice Ⅱ

最急降下法が正しく動作していることのデバッギング方法は、
イタレーション回数を横軸とし、コスト関数の値をプロットすること。
コスト関数が凸で、ステップ長が十分小さければ単調減少するはず。

自動収束判定を行うには閾値を設定する必要があるけど、
それの決定は非常に難しい。
だから、割とコスト関数をプロットして大体の収束判定をグラフィカルに判断することも実務上はよくあること。

コスト関数が収束しないなーと思ったら、
単純に実装ミスか、イタレーションのパラメータ(ステップサイズ)が大きすぎるかを疑ったらよさげです。

収束には向かってるんだけど、コスト関数の収束が遅すぎるなぁと思った時は

こういうのも、図的なイメージが頭のなかに入っていれば、
コスト関数の挙動を見つつ何が原因かを相応できるんじゃないでしょうか。

Normal Equation

正規方程式の話は数学的な話はすっ飛ばして、
データが困難だったらこんな行列Xと教師セットから行列X,ベクトルyを当てはめて

pinv(X'*X)*X'*y すればおk

って感じでした。
ちなみに最急降下法では教師セットの各入力変数のスケールが合ってなかったら揃えてたわけだけど、
正規方程式使う場合は別に微分してイタレーションしてるわけじゃないので、必要なし。


理解すべきことは最急降下法と正規方程式の長所短所。

最急降下法は、
ステップサイズ選択面倒
イタレーションも面倒
でも、特徴数が大きくても問題なく動作する

正規方程式は、
ステップサイズの選択いらない
イタレーションいらない
ただし、逆行列の計算は次元が大きい時は、行列演算の負荷がクソ上がる
(逆行列の演算は O(n^3) オーダーで増加する)

ざっくりまとめると、
特徴数が大きい時は最急降下法使おうね、
小さい時は正規方程式が強いお。
大体特徴数が10^6程度を境界として使い分けましょう。
アルゴリズム・問題・フィーチャー数に応じて考えて使い分けられる人間になりましょ。

ということです。


Normal Equation Noninvertibility

正規方程式は逆行列計算してるけど、非正則行列とかどないすんのって議論。
至極もっともな話ですが、 (X'*X) が非正則になることなんて超まれなのですよという話。

Octaveさんはその辺しっかりやってくれちゃってる。
逆行列を計算する関数は pinv()と inv()があるんだけど、
pinv() は擬似逆行列を計算してくれてる p ぱ pseudo(擬似)の p です。

X'X は、なぜ非正則行列になることがまれと言い切れるのか。
起きる原因は

1.学習データが冗長な時。
  一次結合の関係性があるときに起きる 
  => 冗長なら削除すればこの問題は解決する。あるいは主成分分析でもすれやという話。

2.フィーチャー数が教師セット数よりも圧倒的に多いとき
  フィーチャー削れや、それか正規化せぇや
  という話。
  というか教師セットが少ない時にパラメータ数を増やす意味があまりない。

上記2つの問題は解決可能なので、学習問題をとく時はめったに非正則になりません。
気にせずpinv()使っていいです安心して下さい。


コメント

このブログの人気の投稿

Callback関数を知らん人がまず理解すべきことのまとめ。

C言語でBluetoothスタックを叩きたい人のBluetooth開発入門その1

C++プログラミング入門(1) // 倉庫番プログラムの実装