TadaoYamaokaの開発日記

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

nnue-pytorchを試す その3

前回、nnue-pytorchでdlshogiの棋譜を学習して、floodgateの棋譜でテストを行うと、評価損失(val_loss)が上昇する事象が起きることを書いた。

いろいろ条件を変えて実験したところ、最適化をデフォルトのRanderから、Momentum SGDに変更すると評価損失(val_loss)が下がることがわかったため、精度と強さの比較を行った。

Momentum SGD実装

PyTorchのデフォルトのtorch.optim.SGDを使用し、パラメータはdlshogiの学習で使用しているものと同じ値(momentum=0.9、nesterov=True、weight_decay=0.0001)とした。

訓練データ

dlshogiの学習で使用したデータをqsearchでフィルタした約32億局面を使用した。

訓練条件

  • 標準NNUE(HalfKP)
  • バッチサイズ:8192(デフォルト)
  • 学習率:0.001、75エポックごとに0.3(デフォルト)
  • 1エポック:100,000,000ステップ(デフォルト)
  • エポック数:500

精度

オレンジがRanger
青がMomentum SGD

訓練損失(train_loss)

評価損失(val_loss)


考察

Rangerの方が訓練損失が下がっているが、評価損失は上昇している。
Momentum SGDは訓練損失の低下は遅いが、評価損失は下がっている。

Rangerは、訓練データに対して過学習しやすいことがわかる。
汎化性能はMomentum SGDの方が高い。

強さ

1手3秒で、互角局面集を使い連続対局を行った。
水匠5も加えたリーグ戦の結果は以下の通り。

ranger_e500 vs sgd_e500: 418-0-0 (100.0%)
Black vs White: 209-209-0 (50.0%)
ranger_e500 playing Black: 209-0-0 (100.0%)
ranger_e500 playing White: 209-0-0 (100.0%)
sgd_e500 playing Black: 0-209-0 (0.0%)
sgd_e500 playing White: 0-209-0 (0.0%)

ranger_e500 vs suisho5: 37-370-8 (9.9%)
Black vs White: 210-197-8 (51.6%)
ranger_e500 playing Black: 23-183-2 (11.5%)
ranger_e500 playing White: 14-187-6 (8.2%)
suisho5 playing Black: 187-14-6 (91.8%)
suisho5 playing White: 183-23-2 (88.5%)

sgd_e500 vs suisho5: 0-413-0 (0.0%)
Black vs White: 206-207-0 (49.9%)
sgd_e500 playing Black: 0-207-0 (0.0%)
sgd_e500 playing White: 0-206-0 (0.0%)
suisho5 playing Black: 206-0-0 (100.0%)
suisho5 playing White: 207-0-0 (100.0%)
考察

Momentum SGD(sgd_e500)は、Ranger(ranger_e500)と水匠5(suisho5)に対して1勝もしていない。
Momentum SGDは、floodgateの棋譜に対する損失が低く汎化できていそうであるが、対局すると非常に弱いことがわかった。

Rangerの方は、水匠5にも同一思考時間である程度勝てるようになった。
Momentum SGDより、Randerの方がfloodgateに対する損失は高いが強いということは、NNUE系は過学習した方が強いことを示唆していそうである。

Rangerと水匠5のレーティング差は、以下の通り。

   # PLAYER         :  RATING  ERROR  POINTS  PLAYED   (%)  CFS(%)    W    D    L  D(%)
   1 suisho5        :   195.0   27.9   374.0     415    90     100  370    8   37     2
   2 ranger_e500    :  -195.0   27.9    41.0     415    10     ---   37    8  370     2

White advantage = 33.29 +/- 26.85
Draw rate (equal opponents) = 3.32 % +/- 1.17

水匠5とは、390のレーティング差がある。
しかし、前回4.5億局面を100epochしたときよりも格段に強くなっている。
前回は、水匠5を1手100msにしても約440のレーティング差があった。

まとめ

nnue-pytorchの最適化をMomentum SGDにした場合の精度と強さを、デフォルトの最適化Rangerと比較した。
結果、Momentum SGDの方はfloodgateの棋譜に対して損失が低下し、汎化性能が高いようだが、対局すると非常に弱いことがわかった。
Rangerの方は、floodgateの棋譜に対して損失が上昇し、訓練データに対して過学習しているようだが、対局すると強いことがわかった。

今回dlshogiの学習で使用した約32億局面を使用し、500エポック学習したが、水匠5に対してはレーティング差はまだ390ある。
dlshogiのモデルを活用してNNUEを強くするという目標に対してはまだ工夫が必要である。

nodchip氏によると、tanuki-のNNUEの学習には80億局面を使用しているということなので、訓練データの数の不足が一因としてありそうである。
dlshogiの強化学習と同じ条件で80億局面を生成するのは現実的でないため、NNUE系で生成したデータでの事前学習が必要になりそうである。
別途、NNUE系で生成したデータでの事前学習を試したい。