TadaoYamaokaの開発日記

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

将棋AIの実験ノート:Fixup Initialization 続き

以前にBatch Normalizationを使用しないFixup Initializationを試したことがある。

その際、Leela Chess Zeroでは、Batch Normalizationの統計情報に関連する問題が報告されていることに言及した。
Pawn promotion issues in T40 · Issue #784 · LeelaChessZero/lc0 · GitHub

将棋で具体的に問題になる局面があるか調べられていなかったが、最新のdlshogiでも水匠がすぐに見つける最善手を見つけるのに時間のかかる局面の指摘をもらったので、Batch Normalizationが問題になる局面かどうか調査を行った。

課題の局面


dlshogiは、▲8三馬が最善手になるのに、50万ノード以上探索が必要。

検証方法

以下の3つのモデルを同一の訓練データで学習して最善手が変わるか確認した。
訓練データには、dlshogiの自己対局で生成した2500万局面を使用した。
モデルサイズは10ブロック192フィルタ、バッチサイズは1024、学習率は0.01とした。

# モデルサイズ Batch Normalization 活性化関数 Fixup Initialization
1 ResNet 10ブロック192フィルタ あり Swish なし
2 ResNet 10ブロック192フィルタ あり ReLU なし
3 ResNet 10ブロック192フィルタ なし ReLU あり

Fixup Initializationを使う場合、活性化関数をSwishにすると学習ができないため、ReLUとしている。
Batch Normalizationを使う場合、活性化関数はSwishの方が精度が高くなるが、活性化関数の影響を排除するためReLUでも比較する。

精度

訓練データを1エポック学習した際の精度は以下の通り。
テストデータは、floodgateのR3500以上の棋譜からサンプリングした856,923局面(重複なし)を使用した。

# 方策損失 価値損失 方策正解率 価値正解率
1 1.8914645 0.5800246 0.4172188 0.6787168
2 1.9333075 0.5880046 0.4127659 0.6734275
3 1.9039329 0.5890524 0.4158906 0.6768700

想定通り、Batch Normalizationありで、活性化関数Swishの場合(#1)が、最も精度が高くなった。
活性化関数がReLUの場合は、Batch Normalizationを使う場合より、Fixup Initializationの方が精度が高い。
ただし、Batch Normalizationの精度はバッチサイズにもよるため、バッチサイズを増やすとBatch Normalizationを使った方がよくなる可能性はある。

課題局面の候補手

Multi PV5で確認した。

# 候補手1 候補手2 候補手3 候補手4 候補手5
1 5f6f P*2b 8i7g 9i9h 6g6f
2 9i9h 5f8c P*2b 2c3b 8i7g
3 5f8c 9i9h 2c3b P*2b 8i7g

Batch Normalizationありで、活性化関数Swishの場合(#1)、5つの候補手に、▲8三馬(5f8c)が現れていない。
Batch Normalizationありで、活性化関数がReLUの場合(#3)は、2番目の候補手になっている。
Fixup Initializationの場合(#3)は、1番目の候補手になっている。

Batch Normalizationだけではなく、活性化関数の影響も大きそうである。

方策の比較

課題局面での方策の値を比較した。

予想に反して、5f8cの値は、Fixup Initializationが一番小さくなっている。
課題の局面の方策ではなく、読み筋上の方策もしくは価値の値が影響しているようだ。

NPS

Fixup Initializationは、スカラー乗数とスカラーバイアスを、各畳み込み、活性化関数の前に追加しているため、必要な演算が増えるためNPSを確認した。
GPU 3090、2スレッドで50万ノード探索時。

# NPS
1 42349
2 45236
3 29547

活性化関数SwishとReLUでNPSの違いは少ない。
Fixup Initializationを使うと、NPSが大幅に低下している。
読み筋に王手の局面があるかによってもNPSが変わるため、初期局面でも比較した。

# NPS
1 62853
2 62969
3 54078

初期局面でもFixup Initializationを使うと遅くなっていた。

まとめ

dlshogiで最善手を見つけるのに時間のかかる局面について、Batch Normalizationの影響を、Fixup Initializationと比較して調査した。
結果、Batch Normalizationだけではなく、活性化関数の影響も大きそうであることがわかった。

また、Fixup Initializationを使うとNPSが大幅に低下することがわかった。
NPSが大幅に低下するので、Fixup Initializationは使えなさそうである。

今までテストデータに対する精度のみを見て、活性化関数をSwishにしていたが、少ない探索数では活性化関数の違いにより候補手が大きく異なり、ReLUの方がよい場合があることがわかった。
テストデータに対する精度の比較だけでなく、強さへの影響も調べなおした方が良さそうである。