SGD(確率的勾配降下法)の改善

Python, ML04 January 2021

SGD(確率的勾配降下法)の欠点を補う方法が色々と考案されている。 それらの内容を簡単にまとめるためのメモ。

SGD(確率的勾配降下法)とは

ミニバッチごとにランダムな初期値をサンプリングし、勾配降下法を行う。 様々な初期値からスタートするため、大域的最適解(損失関数全体で最も損失の低い所)にたどり着く可能性が上がる。

数式

$$ g=\frac{\delta L(\theta)}{\delta\theta} $$
$$ \theta=\theta - g $$

デメリット

  • 大域的最適解に必ずしもいけない
  • 遠回りするかもしれない
  • 多少時間がかかる

Momentum(慣性)

名前の通り、過去の更新を見て次の更新を特定の方向に加速させる。

数式

$$ g=\frac{\delta L(\theta)}{\delta\theta} $$
$$ m=\eta g+\gamma m$$
$$ \theta=\theta - m $$

前のmが大きくなるほど大きくなる。

デメリット

  • 最適解を通り過ぎる可能性がある

NesterovのMomentum

Momentumのデメリットである、最適解を通り過ぎてしまう問題を軽減する。

数式

$$ g=\frac{\delta L(\theta - m)}{\delta\theta} $$
$$ m=\eta g+\gamma m$$
$$ \theta=\theta - m $$

***

mは勿論計算するまで分からないので、前回からの更新を元にこのまま進行するとこの値になると言うのを計算し近似する。

一般に、SGDと言うとNesterovのMomentumの事を言っている。(フレームワークでもSGDを指定するとこれになる)

AdaGrad

現在性能悪すぎて使われない。

  • 学習率を一定ではなく、パラメータごとに最適と思われるものに設定し、可変にしたい。
  • 勾配が急であるほど、学習率を下げて行きすぎないようにすると考える。

RMSProp

AdaGradでは必ず学習率を下げる方向にしか調整できなかったが、逆に上げる方向にも対応したのがこれ。 これも今は使われない。

Adam(Adaptive Moment Estimation)

RMSPropの改良。フレームワークに入ってるし、精度も出るのでよく使われる。 Adamよりも良いものがあるが、フレームワークとかになかったりするのでちょっと面倒。

勾配の平均と分散を考慮してMomentumを決定する

初期値の設定について

SGD(確率的勾配降下法)は初期値にかなり依存する考え方である。(最近はモデル自体の精度が上がったので、結構テキトーになった) ランダムで初期値を決めるよりも、もっと良い定義の方法があるはずと言う考えのもと、以下が使用される。

  • Heの初期化
  • Xavierの初期化(Glorotの初期化)

tags: Python, ML