バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia4-backnumber/
はじめに
前回からAdamに至るまでの最適化アルゴリズムの系譜の説明をすることとなった。
今回はAdaGrad。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
最適化アルゴリズムいろいろ【再掲】

まずは説明予定の最適化アルゴリズムを再掲。
- AdaGrad
- RMSprop(Root Mean Square Propagation)
- AdaDelta
- Adam(Adaptive Moment Estimation)

今回は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乗を足し続けてる感じか・・・。
そのあとに平方根を取ってるから、元のスケールに戻してるとは思うけど・・・。
モーメンタムでは掛けていたのが、割ってる点が大きな違いかなぁ。

そうだね。
過去の勾配を累積し、徐々に学習率を落としていく。
そして、学習が進むと学習率が極端に小さくなる欠点がある。

勾配の2乗だから、\(g_t\)は常に大きくなり続けるのか。
その結果、更新の幅がどんどん小さくなって、最後は動かなくなるってことか。

そうそう。
まぁ、シンプルな学習だとかなり早い収束をする可能性はあるな。

でも、変にステップが掛かると更新しなくなっちゃうのが欠点ってことか。
まとめ

まとめだよ。
- AdaGradについて説明。
- 更新式をモーメンタムと比較。
- 更新幅は、最初は大きく、徐々に小さくなり、最終的には学習が進まなくなる欠点を抱えている。
バックナンバーはこちら。
Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
ゼロからはじめるPID制御
OpenCVによる画像処理入門
恋する統計学[回帰分析入門(多変量解析1)] 恋する統計学[記述統計入門]
Pythonによる制御工学入門
理工系のための数学入門 ―微分方程式・ラプラス変換・フーリエ解析
コメント