前回に続き、学習の改善を試します。
今回は、最適化手法を変えて収束性、精度を測定します。
最適化手法は、はじめAdamではうまく学習できなかったためAdaGradとしていました。
Batch Normalizationを入れたことで、Adamを含めた他の手法でも学習できるようになった可能性があるので試してみます。
手法は、SGD、AdaGrad、RMSprop、Adamを試しました。
学習率ははじめ大きめの値として、学習できない場合は1/10にして測定しました。
測定結果
手法 | 学習率 | train loss | test accuracy |
SGD | lr=0.1 | 2.85 | 0.34 |
SGD | lr=0.01 | 2.09 | 0.40 |
SGD | lr=0.001 | 3.38 | 0.29 |
AdaGrad | lr=0.1 | - | - |
AdaGrad | lr=0.01 | 2.58 | 0.38 |
AdaGrad | lr=0.001 | 2.71 | 0.35 |
RMSprop | lr=0.01 | 9.36 | 0.02 |
RMSprop | lr=0.001 | 3.23 | 0.31 |
Adam | alpha=0.01 | - | - |
Adam | alpha=0.001 | 2.73 | 0.34 |
※-は学習が進まないため中断
Adamなどの比較的新しい手法が良いと思っていたが予想に反して、SGD(lr=0.01)が一番収束が速く、精度が高くなった。
AlphaGoの論文でもモーメントは使用しないでSGDで学習したと記述されている。
学習率の初期値は0.003で8千万ステップごとに半分にしている。
上記の測定結果で良い結果となったSGDの学習率は0.01でAlphaGoの論文の値より大きいが、Batch Normalizationを入れているので、大きめの初期値でも学習できていると思われる。
測定結果を受けて、最適化手法はSGD(lr=0.01※Chainerのデフォルト)にすることにします。
GitHubにソースを公開しました。
github.com