Adam [1] を chainer で実装しました。
Adam の説明
少ない時間・空間計算量で高い性能を出すということで、深層学習の分野で最近よく使われている最適化手法です。
をパラメータに取る関数 の(期待値)最小化を考えます。 の に対する勾配を とします。
一番元となったアルゴリズムは SGD ( stochastic gradient descent ) です。
SGD は以下のようにパラメータを更新するものでした。
- とする
- をサンプルする
- 収束したら終了
- 2 に戻る
Adam では、 3 のステップを以下の処理に置き換えます。
ここで、 は に初期化されているものとし、 は要素ごとの掛け算を表します。
論文では、 程度を目安としています。
1, 2 については、 と (要素ごとの自乗) の指数移動平均を求めています。
過去の結果をできるだけ使いたいが、パラメータが変化したことで分布も変化するので、このような指数移動平均を使っているのだと思います。
また、こうすることで時間と共に が変化するような問題にもうまく適合するようになるようです。
3, 4 では、正規化のようなことをしています。
例えば、 が一定値 をとるものとすると、 となります。
5 が、 SGD における 3 に直接対応するものです。
は が極端に小さかったときに数値的な安定を保つためのものなのであまり深く考えなくても良いと思います。
の代わりに、移動平均を正規化した を使い、 で割って変化量を正規化しています。
で割っていることで、 を定数倍しても、 の変化量は変わりません。
また、変化量はおおよそ で抑えられます。
このようなスケールに対する不変性があるので、様々な問題に対して少ないハイパーパラメータのチューニングでうまく適合できるようです。
実装
Python 3.5.1 + chainer 2.0.0 を使って実装しました。
実験
MNIST の分類を 3 層の全結合ニューラルネットワーク行いました。
訓練データ、テストデータ共に、少ない反復回数で高い認識率を示しています。
最後に
何か間違いや質問などがあればお願いします。
最後まで読んでいただきありがとうございました。
参考文献
[1] Kingma, Diederik P. et al. (2015) Adam: A Method for Stochastic Optimization