ブレンドのアイデアを実際の対局エンジンに実装して評価を進めていきます。
dlshogiを改造して実装することにしました。昨日時点の最新版dlshogi cc722f5b2362b0364af063f008a5d922aa8c266eから分岐したこちらのブランチに実装していきます。 GitHub - select766/DeepLearningShogi: dlshogiの改造実験 https://github.com/TadaoYamaoka/DeepLearningShogi
やりたいことは、DNNの評価中に従来型エンジンで同じ局面を探索し、最善手と評価値を得て、それをDNNの出力にブレンドすることです。 まずはこのアイデアを極力シンプルに実装しました。C++力が低いので書き方が安定していないのはご了承ください。
実装概要
- dlshogi探索部でDNN評価すべき局面をキューに追加する際、その局面のsfen文字列も別のキューに追加
- dlshogiがDNNのバッチ評価を行う直前で外部評価プロセスにsfen文字列の集合を送信
- dlshogiがDNNのバッチ評価を行った直後に外部評価プロセスから評価結果を受信し、結果をブレンド(線形補間)
- 外部評価プロセスは、TCPでdlshogiと連携、USIプロトコルで従来型エンジン(やねうら王)と連携
- dlshogiから来た局面を、positionコマンドでやねうら王に送信、goコマンドで思考、infoコマンドで評価値を取得、bestmoveで最善手を取得
- dlshogiの探索スレッド1つ(=1 TCP接続)につき1つのやねうら王プロセスを起動
動かし方
dlshogiのブランチをビルド、将棋所に登録。オプションとして、Blend_Ratio_Policy
(外部エンジンのpolicyブレンド比率%(0ならDNNのみ))、Blend_Ratio_Value
(外部エンジンのvalueブレンド比率%(0ならDNNのみ))が追加されているので設定。
同じマシン上で、評価用プロセスを起動させておく。
python -m searchblend.searchblend path\to\YaneuraOu\YaneuraOu_NNUE_tournament.exe --options Threads:1,EvalHash:16,NodesLimit:1000
強さの評価
無改造のdlshogiだと手元の環境で2500nps程度出るのですが、今回の実装では1900nps程度まで低下しました。この原因は今後調査することとして、ブレンドそのものの効果を測定しました。ブレンド比率0の場合でもやねうら王の結果に0を掛けて捨てることによりnps低下による棋力低下を無視しています。dlshogiの評価関数にはGCT(電竜戦2020)を用いました。
従来型エンジンは、やねうら王4.89、elmo2019評価関数(NNUE)、エンジン設定はThreads:1,EvalHash:16,NodesLimit:1000
となっています。
ブレンド比率0のものを基準とし、互換局面集を開始局面とし、1手1秒で勝率を測定しました。
policy比率[%] | value比率[%] | 勝-負-分 |
---|---|---|
10 | 0 | 61-36-3 |
0 | 10 | 43-53-4 |
10 | 10 | 60-34-6 |
50 | 0 | 32-65-3 |
結果は、policyに10%だけ従来型エンジンの出力を足したものが最も強く、DNNだけの評価より強くなることがわかりました。policyを50%足すのは過剰のようで、弱くなりました。valueのブレンドについては有効性が確認できません。fail low/highが発生していても、とにかく最後のinfoメッセージの評価値を使っているのがまずい可能性もあります。評価値の利用はスケーリング等厄介な問題が多そうなので、深追いはしません。 今後は、nps低下を抑える実装を検討します。