勾配降下法、モメンタム法、nesterovの勾配加速法をアニメーション化した。


勾配降下法

勾配降下法を使うとパラメータの値を逐次的に更新していくことによって一番尤もらしいパラメータの値を求められる。
関数$E(\theta)$のパラメータ$\boldsymbol{w}$の更新式は以下の通り。

{\mathbf{w}^{t + 1} \gets \mathbf{w}^{t} - \eta \frac{\partial E(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}
}

この更新を繰り返すことによって、パラメータの値を探索していいく。場合によっては更新を何千回と繰り返さなければならないこともあるため、これを効率化するテクニックが無数に存在する。本記事では、シンプルな勾配降下法に加え、これらのテクニックを使った際のパラメータが更新されていく様子をアニメーション化した。

初期値の設定

関数: $f(x, y)={x^2 + 3y^2}$
初期座標: $(x, y) = (9, 9)$
学習率: $\eta=0.1$
終了条件: $x, y$の勾配がいずれも$0.01$未満になったら終了。

普通の勾配降下法

まずは、単純に勾配を取る普通の勾配降下法。100回で収束した。

モメンタム法

更新式は以下のようになる。

{\mathbf{w}_{t + 1} \gets \mathbf{w}_t - \eta \frac{\partial E(\mathbf{w}_t)}{\partial \mathbf{w}_t}} + \gamma \Delta \mathbf{w}_t

モメンタム法は、前回の更新の方向に慣性をつけることによって、学習を速めるテクニック。勾配が急な場所では、どんどん加速していくイメージ。$\gamma$の値は0から1の範囲で設定する。今回は0.9とした。

確かに慣性がかかっているのが見て取れる。58回で収束した。いい感じ。

Nesterovの加速勾配法(Nesterov's Accelerated Gradient Method)

更新式は以下の通り。


\bar{\mathbf{w}_t} =  \mathbf{w}_t + \gamma \Delta \mathbf{w}_t
 \\

{\mathbf{w}_{t + 1} \gets \mathbf{w}_t - \eta \frac{\partial E(\bar{\mathbf{w}_t)}}{\partial \bar{\mathbf{w}_t}}} + \gamma \Delta \mathbf{w}_t

Nesterovの加速勾配法は、モメンタム法を発展させた手法であると言える。$\boldsymbol{x}_t$の地点におけるモメンタム法の更新を①慣性による移動と②$\bar{\mathbf{w}_t}$の勾配による移動の2段階に分けることができる。Nesterovの加速勾配法はこれに対し、まず慣性によって$\bar{\mathbf{w}_t}$に移動し、$\bar{\boldsymbol{w}_t}$の勾配によって2段階目の移動をするという仕組みである。これによって、慣性がつきすぎるのを防ぎ、更新スピードを速めることが可能となっている。

43回で収束した。モメンタム法以上にいい感じ。

AdaGrad

{h_{0} = \epsilon\\
h_{t} = h_{t−1} + \nabla E(\mathbf{w}^{t})^{2}\\
\eta_{t} = \frac{\eta_{0}}{\sqrt{h_{t}}}\\
\mathbf{w}^{t+1} = \mathbf{w}^{t} - \eta_{t} \nabla E(\mathbf{w}^{t})
}

adagradは、$h_0=\eta$にepochごとに重みの2乗を足していき、その平方根で$\eta_{0}$割った数を学習率とする。これによって、学習率が毎回下がっていく。

は、初期学習係数$\eta_0$と$h_0=\epsilon$を決める必要がある。
Chainerにおけるデフォルトのパラメータは$\epsilon = 10^{-8}, \eta_{0} = 0.001$となっている。

コード