TadaoYamaokaの開発日記

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

【dlshogi】dlshogiモデルでNNUEの評価値を付け替える その2

前回、NNUE系で生成した教師データの評価値をdlshogiのモデルで推論した評価値に付け替えることを試した。

今回は、方策についてもモデルの推論結果に付け替えることを検討する。

方策の付け替え

NNUE系で生成した教師データは、最善手のみが記録されているが、モデルの推論結果はすべての差し手について確率が出力される。
最善手1手のみよりも、すべての差し手の確率を使用した方が、情報量が多いため学習の効率が良い。
よって、方策は差し手の確率を使用することにする。

教師データフォーマット

hcpe形式の教師データは差し手1手のみしか記録できないため、hcpe3のキャッシュフォーマットを使用する。

hcpe3形式でも記録できるが、局面の入力特徴量を作成するのに棋譜の再生を行う必要があるため、モデルで推論する際に、バッチ処理が行いにくい。
キャッシュフォーマットは、局面単位に記録しているので、バッチ処理が行いやすい。

方策のフィルタ

方策は、非合法手も含む2187次元のベクトルになる。
すべての差し手を記録するとデータ量が膨大になる。
そのため、合法手でフィルタして、最善手から勝率の低下が一定範囲、かつ上位N件のみを記録することにする。

以下の実験では、50%低下、10件までとする。

加重平均

教師データの評価値を付け替える手法は、加重平均の係数=1でモデル蒸留するのと行っていることは同じである。
モデル蒸留と同様に加重平均の係数も設定できるようにする。

精度評価

教師データ

前回同様、2020年にNNUE系で生成した教師データ65,267,650局面を使って検証する。
キャッシュを作成する際に、同一局面の平均化を行うので、訓練データ数は、63,965,555局面になる。

学習条件

前回と同じ条件とする。

  • バッチサイズ: 4096
  • エポック数: 8
  • 評価値と結果の加重平均の係数(val_lambda): 0.333
  • 学習率: 0.04から1エポックごとに半減
  • オプティマイザ: MomentumSGD
  • 同一局面は平均化
  • モデル: ResNet 20ブロック256フィルタ
  • 評価値の付け替えに使用するモデル: dlshogiの40ブロック512フィルタのモデル

加重平均の係数を、1、 0.95、 0.9、0.5、0に変えて比較する。
1.0は付け替えを意味して、0は付け替えないこと(元の教師データのまま)を意味する。

また、価値のみを付け替えた場合とも比較する。

学習結果

テストデータに、2017年~2018年6月のfloodgateのR3500以上の棋譜からサンプリングした856,923局面(重複なし)を使用して、評価した結果は以下の通り。

係数 方策損失 価値損失 方策正解率 価値正解率
1 1.6132 0.5088 0.4848 0.7311
0.95 1.5841 0.5044 0.4906 0.7338
0.9 1.5987 0.5062 0.4864 0.7319
0.5 1.5955 0.5063 0.4840 0.7312
0 1.6446 0.5151 0.4732 0.7272
価値のみ 1.6454 0.5093 0.4725 0.7294

今回計測した係数では、0.95のときに方策損失、価値損失が最小になった。

前回と同様に価値のみを付け替えた場合と比較して、方策も付け替えた場合、方策、価値ともに精度が向上している。

まとめ

NNUE系で生成した教師データの評価値に加えて方策もdlshogiのモデルで推論した方策に付け替えて学習することで精度が向上するか検証した。
結果、方策も付け替えることで、方策、価値ともに精度が上がることを確認できた。

勝敗項についても、元の教師データの値を使わない方がよいか追加で検証したい。