AdaGrad
まずはAdaGradの更新式を見せよう。
\(
\begin{eqnarray}
g_{t+1}&=&g_t+(\nabla J(\theta_t))^2\\
\displaystyle\theta_{t+1}&=&\theta_t-\frac{\alpha}{\sqrt{g_{t+1}}+\epsilon}
\end{eqnarray}
\)
比較対象としてモーメンタムの更新式も載せておこう。
\(
\begin{eqnarray}
v_{t+1}&=&\beta v_t+\alpha\nabla J(\theta_t)\\
\theta_{t+1}&=&\theta_t-\alpha v_{t+1}
\end{eqnarray}
\)
AdaGradの方は勾配を2乗を足し続けてる。
そのあとに平方根を取ってるため、元のスケールに戻してるが、符号は正になる。
モーメンタムでは掛けていたのに足して、
割ってる点が大きな違い。
つまり、モーメンタムでは学習率を引き上げるために使用していたのに対して、
AdaGradでは学習率の抑制のために使用していることになる。
結果として、過去の勾配を累積し、徐々に学習率を落としていく。
そして、学習が進むと学習率が極端に小さくなる欠点がある。
勾配の2乗を累積するため、\(g_t\)は常に大きくなり続ける。
その結果、更新の幅がどんどん小さくなって、最後は動かなくなる。
シンプルな学習だとかなり早い収束をする可能性はある反面、
変にステップが掛かると更新しなくなっちゃうのが欠点ってことになる。
RMSprop
RMSpropは先ほどのAdaGradの改良版という位置づけになる。
AdaGradとRMSpropの両方の更新式は以下になる。
AdaGrad
\(
\begin{eqnarray}
g_{t+1}&=&g_t+(\nabla J(\theta_t))^2\\
\displaystyle\theta_{t+1}&=&\theta_t-\frac{\alpha}{\sqrt{g_{t+1}}+\epsilon}
\end{eqnarray}
\)
RMSprop
\(
\begin{eqnarray}
E[g^2]_t&=&\beta E[g^2]_{t-1}+(1-\beta)(\nabla J(\theta_t))^2\\
\displaystyle\theta_{t+1}&=&\theta_t-\frac{\alpha}{\sqrt{E[g^2]_t+\epsilon}}\\
E[g^2]&:&過去の勾配の2乗の指数移動平均\\
\end{eqnarray}
\)
Eの配列みたいなのがいるが、これは配列ではない。
一般的にE[ ]で表現されるのは期待値という意味合いになる。
\(E[g^2]\)は、それで一つの変数と思えばOK。
指数移動平均の処理を入れるためか、期待値という意味合いで\(E[g^2]\)と表記しているようである。
とすると、かなりAdaGradと似ていると言える。
違いは、今言ってた指数移動平均を取ってる部分。
AdaGradは学習が進むと学習率がほぼ0になってしまうのだが、
これは過去の勾配の二乗が累積し続けているせい。
ここを指数移動平均にすることで、過去の勾配の影響を減らして、現在の勾配の影響度を増やす意味になる。
プラトーや極小値近辺だと、勾配が小さくなるはずだから、
その状態でも学習が止まることは防げることになる。
この点がAdaGradからの改良点と言えるのだろう。
まとめ
- もう一個試す予定の最適化アルゴリズムAdamへ至る系譜を説明予定。
- AdaGradについて説明。
- 更新式をモーメンタムと比較。
- RMSpropについて説明。
- AdaGradの完了版であるため、AdaGradと更新式を比較。
MATLAB、Python、Scilab、Julia比較ページはこちら
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント