TadaoYamaokaの開発日記

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

将棋AIの進捗 その34(終盤力の強化)

前回の日記からしばらくぶりですが、その間SENetの学習を続けていました。

自己対局中の詰み探索の深さ

ディープラーニングMCTS系は終盤に弱点があるので、dlshogiでは自己対局中にルート局面でdf-pnによる詰み探索を行い、詰みが見つかった場合は、ゲームを打ち切り勝ち負けを正確な報酬として与えて学習している。
詰みの手順を学習しなくなるが、終盤の局面の価値評価が正確になる。
対局時は、ルート局面で並列で詰み探索を行っているので、詰みの手順は覚えなくても良いと割り切っている。

しかし、対局時のMCTSのシミュレーション中のノードでは、詰みの手順覚えていないため、中間ノードで詰みの絡む局面での方策の誤差が大きくなっている心配がある。
そこで、詰みの絡む局面での方策の精度を上げるために、新しい試みとして自己対局中の詰み探索の深さを、ランダムで浅くするということを行っていた。

しかし、これは失敗で、方策と価値の精度の両方とも、以前よりも低くなってしまった。
詰みが見つかった場合と、自分で詰みの局面を探索した場合の学習データが混じったいことで、悪影響があったのかもしれない。

ということで、数か月分のSENetの学習をやりなしている。
現状、SENetなしの場合を超えていないので、SENetはボツにする可能性が高い。

終盤力強化の別のアプローチ

以前から終盤力強化の別のアプローチとして、マルチエージェント学習が使えないかと思案していた。
しかし、複数エージェントを学習する分、マシンパワーが必要になるため躊躇していた。

USIエンジンをエクスプロイターとする

効果的に終盤の弱点を突くエージェントと対局を行えば、なにも学習するエージェントを複数作らなくてもよい。
そこで、αβ探索系のソフトを一定数リーグに加えることを試すことにした。
αβ探索系のソフトは終盤が強いという特徴があるので、終盤の弱点を防ぐことが期待できる。
また、別のエージェントを学習しなくてよいので、マシンパワーも節約できる。

なお、AlphaStarの論文では、このような弱点を突く役割のエージェントをエクスプロイター(搾取者)と呼んでいた。
AlphaStarではエクスプロイターも学習するので、膨大なマシンパワーが必要となっている。

任意のソフトをエクスプロイターとして使えるように、USIエンジンを呼び出す形で実装した。
USIエンジンとの対局で学習局面を生成 · TadaoYamaoka/DeepLearningShogi@10d862a · GitHub

強さの計測にも使える

この方法のもう一つのメリットとして、自己対局中にUSIエンジンに対する勝率も計測できるという点がある。
今まではマシンパワー不足のために、他のソフトと対局しての強さの測定は、不定期に行っていた。
この方法だと、常時強さの監視が可能になる。

デメリット

デメリットとしては、USIエンジンを複数並列で実行するため、CPUパワーが必要になる点がある。
現在10コアのCPUと3GPUのPCで学習を行っており、現状でもCPUがボトルネックになっている。
ということで、コア数を増やすため3970xをポチってしまった。

Aperyを使用したテスト

テストのために、USIエンジンとしてAperyを使用して、1スレッド1手500msでリーグに混ぜて学習させてみた。
局面の生成速度は、1GPU、64並列で、

エクスプロイターなし 26.39 nodes/sec
エクスプロイター(8つ)あり 21.92 nodes/sec

となった。
4コアのPCでの測定なので、CPUネックで速度が落ちていそうである。

勝率は、少ししかテストしていないが、3勝6敗であった。
初期局面集をつかっているので、偏っている可能性はある。

1手1秒とすると、0勝9敗となった。
自己対局中は800シミュレーションしか行っていないので、1手1秒は強すぎるようだ。
思考時間は500msくらいがよさそうである。

まとめ

まだほとんどテストしていないため、この方法で終盤に強くなるかは確認できていない。
新しいCPUが届いたら、本格的に学習をさせてみるつもりである。

対局中にディープラーニングとαβを組み合わせて、終盤を強化する方向性もある思うが、将棋AIを作り始めた動機がディープラーニングで強い将棋ソフトが作れるかだったので、対局時はαβは使わないという方向でアイディアを試していきたいと思っている。