Coursera Week10
はじめに
CourseraのWeek10を実施しましたので、私のメモを公開します。
Courseraってなんだ?という方はWeek1から御覧ください。
Learning With Large Datasets
m=1億を超えるようなデータセットの扱いについて。
まずは1億の中から1000件取り出してトレーニングしてみるのも一つの手である。
その判断にクロスバリデーション誤差が使える。
確率的最急降下法 Stochastic Gradient Descent
確率的最急降下法を使用すると巨大なトレーニングセットに対してスケールできるようになる。
今まで学習してきた最急降下法の場合、数億のトレーニングセットがある場合でも全件に対して処理を実行するため高コストである。
これをバッチ最急降下法という呼び方をしている。(機械学習屋界隈では。)
復習として線形回帰のコスト関数とバッチ最急降下法の式を示す。
線形回帰のコスト関数
$$
J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})^2
$$
バッチ最急降下法
j=0,,,,,n
$$
\theta_j = \theta_j - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}
$$
線形回帰のコスト関数の見方を変更する。
$$
J_{train}(\theta) = \frac{1}{m}\sum_{i=1}^m cost(\theta,(x^{(i)},y^{(i)}))
$$
$$
cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_\theta(x^{(i)}) - y^{(i)})^2
$$
次に確率的最急降下法の手順を示す。
1.データセットをランダムにシャッフルする。
2.m回のforloopの中で以下の処理を実施する。
$\theta_j = \theta_j - \alpha(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}$
特徴としては数億件のレコードを全てなめてから結果を出すのではなく、1つずつグローバル最小に進めて行くことになる。
そうすることでバッチ最急降下法より精度が低く、グローバル最小にたどり着いてとどまらずに近くをうろうろすることになる。
ただし、グローバル最小に極めて近い値がわかるので特に問題ではない。
ミニバッチ最急降下法 Mini-Batch Gradient Descent
バッチ最急降下法は$m$件すべてをなめる。
確率的最急降下法は1件ずつ処理する。
ミニバッチ最急降下法は任意の$b$件のデータをなめる。($b$は大体2~100程度。)
つまりミニバッチ最急降下法はバッチ最急降下法と確率的最急降下法の間を狙う方法である。
$b=10$の場合、10件ずつ増えるforloopの中で以下のような処理を実行する。
$\theta_j = \theta_j - \alpha\frac{1}{10}\sum_{k=i}^{i+9}(h_\theta(x^{(k)})-y^{(k)})x_j^{(k)}$
確率的最急降下法の収束のチェック
線形回帰の最急降下法の場合、$\theta$をプロットすることで収束しているかチェックすることができたが、巨大なトレーニングセットではそれはできない。
確率的最急降下法では$cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_\theta(x^{(i)}) - y^{(i)})^2$の値をプロットすることで収束しているか判断する。
プロットしてグラフ化した際に$\theta$が下がってきていればOK。
あまり変化がない場合でも件数を増やすことで実は$\theta$が下がっている場合もある。
明らかに$\theta$が増えている場合は分散しているので$\alpha$を小さくすることで調整する。
もし確率的最急降下法で明確なグローバル最小を求めたい場合、$\alpha$を少しずつ小さくすることで可能である。(少しずつ小さくするチューニングは大変なのであまりやらない。)
MapReduce
最急降下法を分割して計算する方法。
分割して求めた$\theta$の和とバッチ最急降下法で求めた値は等価である。
分割するメリットは複数のコンピュータに分散して計算することができることである。
複数のコンピュータだけでなく、1つのコンピュータの複数のCPUコアで分割するのもアリ。