TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

将棋でディープラーニングする その6(BatchNormalizationを追加)

前回は、手番を入力特徴に加えても効果がないことを確認した。

今回は、ニューラルネットワークの畳み込み層の後にBatch Normalizationを追加して精度への影響を確認する。

Batch Normalizationを適用することで以下のメリットがある。

  • 学習を速く進行させることができる(学習係数を大きくすることができる)
  • 初期値にそれほど依存しない
  • 過学習を抑制する(Dropoutの必要性を減らす)

13層のCNNのどの層までBatch Normalizationを入れるのがよいかわからなかったので、1層目から順番にBatch Normalizationを入れる層を増やして測定した。
ベースの条件は以前の持ち駒のフィルターサイズを変更したバージョンとした。

測定結果

f:id:TadaoYamaoka:20170506093538p:plain
f:id:TadaoYamaoka:20170506093558p:plain
※横軸のラベルは、BNの後の数値がBatch Normalizationを入れた層数

測定結果を見ると、9層目までBatch Normalizationを入れた方がtrain loss、test accuracyともに精度が上がる。
10層目より深い層に入れると精度が落ちてくる。

また、Batch Normalizationを入れる程、学習時間が延びる傾向がある。学習の効率を上げるには必要以上に入れない方が良い。

この測定結果からは、9層目までBatch Normalizationを入れるのがよさそうだ。

9層目までBatch Normalizationを入れたことで、test accuracyは35%になった。

次回はBatch Normalizationを入れたことで学習率をどこまで増やせるか検証したい。

GitHubにソースを公開しました。
github.com

2017/5/7 追記

Batch Normalizationを活性化関数(ReLU)の後に入れた場合、どうなるか試してみました。
上記の測定は最適化手法をAdaGradにしていましたが、その後SGDに変更したので、SGDでBatch Normalizationを活性化関数の前に入れた場合と、後に入れた場合を比較します。
9層目までにBatch Normalizationを入れた条件での比較です。

train loss test accuracy
ReLUの前 2.09 0.40
ReLUの後 2.13 0.40

結果はほとんど変わりませんでした。