TadaoYamaokaの開発日記

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

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

nodchip氏が、NNUEで生成した教師データの評価値をDL系モデルで推論した評価値に付け替えると、レーティングが大幅に向上したという実験結果を報告している。


dlshogiのモデルでも、同じ効果があるか検証してみた。
以前に、モデル蒸留で、方策の確率と評価値を加重平均することに効果があることは確認済みなので、今回は評価値のみを付け替えることで、どれくらいの効果があるかを検証した。

付け替え方法

hcpe形式の教師データに対して、dlshogiのモデルで推論して、評価値を付け替えるスクリプトを作成した。

DeepLearningShogi/dlshogi/utils/hcpe_re_eval.py at master · TadaoYamaoka/DeepLearningShogi · GitHub

評価値が詰み(30000以上)の場合は、付け替えずにそのままの値とする。

推論には、onnxruntimeを使用している。

GPUで実行するには、onnxruntime-gpuをインストールする。

pip install onnxruntime-gpu

NVIDIAのdockerイメージを使用している場合、CUDAとcuDNNのバージョンの組み合わせがonnxruntimeが要求する組み合わせと一致しないため、GPUで実行できない場合がある。
その場合、CUDAのバージョンを指定してインストールできる。
詳細は、公式サイトのバージョンごとのCUDAとcuDNNの組み合わせを参照して欲しい。

CUDA 12とcuDNN 8の組み合わせを使う場合:

pip install onnxruntime-gpu==1.18.0 --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/

また、TensorRTが使用できる場合は、「---tensorrt」オプションでTensorRTを使用するようにしている。
TensorRTを使用する場合は、実行時にモデルの最適化を行うために、結果に毎回誤差が生じる場合があるので注意が必要である。

教師データ

2020年にNNUE系で生成した教師データが65,267,650局面あったので、それを使って検証する。
2020年のモデルで、1手100万ノードで生成しているため、精度はかなり低い。

学習条件

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

学習結果

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

条件 方策損失 価値損失 方策正解率 価値正解率
付け替えなし 1.6432 0.5147 0.4734 0.7277
付け替えあり 1.6448 0.5090 0.4731 0.7299

評価値の付け替えを行うと、方策の精度は正解率が0.03%低下したが、価値の精度は正解率が0.2%改善している。
dlshogiのモデルで評価値を付け替えることで、価値の精度が向上することが確認できた。

まとめ

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

なお、dlshogiの学習では方策も学習するため、以前に実装した蒸留を行えば、教師データの評価値を付け替える必要はない。
今回は、評価値のみの付け替えにどれくらい効果があるかを検証した。