TadaoYamaokaの開発日記

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

将棋AIの進捗 その29(自己対局におけるノードの再利用)

先日の記事に書いたが、AlphaZeroは自己対局時にノードの再利用を行っている。
dlshogiでは、先手が探索した結果を後手が利用することになるため(逆も同様)、先手と後手の探索のバランスが崩れるため、ノード再利用を行わず各手番でハッシュをクリアしていた。

しかし、先日の記事で考察した通り、ルートノードをクリアすることで、ノードを再利用しても先手、後手の偏りはそれほど問題にならないと思われる。
そこで、実際にノードを再利用しない場合とする場合で、精度を比較してみた。

測定条件

  • dlshogiの最新の学習済みモデルを使用して、ノードを再利用なしの場合とありの場合で自己対局を行い教師局面を生成する
  • 生成する局面は、250万局面
  • 生成した教師局面を使用して、初期モデルから学習して、floodgateの棋譜との一致率を測定する
  • 初期局面集を使用して、4手までルートノード訪問数に応じた確率で手を選択
  • Momentum SGD(lr=0.001)
  • バッチサイズ1024

測定結果

train loss policy一致率 value一致率
ノード再利用なし 3.7723558 0.06413719 0.5564077
ノード再利用あし 3.214862 0.11954415 0.5857407

考察

ノード再利用ありの場合、policy、valueともに大幅に一致率が高くなった。
ノード再利用により、より深くまで探索できるようになったことから、より精度が高くなったと考えられる。
先手と後手の偏りが問題になるなら、valueの精度は落ちるはずだが、そのようなことは起きていない。
自己対局におけるノード再利用は精度向上に寄与することがわかった。

備考

初期モデルから学習するとlossがnanになったが、GradientClippingを追加することで学習できるようになった。

余談

ノード再利用の実装は、かなり苦労した。
再現性の低い条件で、再利用するノードが未展開になる場合があり、バグを見つけるのに1週間くらい費やした。
リリースビルドだと最適化されているため見たい変数の状況がわからず、デバッグビルドだと遅すぎて再現できないため、デバッグ情報なしで最適化オフでビルドして、再現させて状態を確認して、assertを追加してを何回か行って原因を特定した。

また、前回の記事に書いたCUDAのエラーが発生して、学習がうまくできない状況になった。これも結局、ノード再利用によって、既存のバグが顕在化したことが原因だった。