TadaoYamaokaの開発日記

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

将棋AIの進捗 その26(自己対局による強化学習の経過2)

前回から時間が空いたが、自己対局による強化学習を続けている。

10ブロック、192フィルタのモデルの自己対局による学習が、79サイクル※回したところで飽和気味になったため、10ブロックのモデルからパラメータを転移して15ブロックのモデルで強化学習を行うことにした。
※1サイクルで、250万局面を生成(55サイクルまでは500万局面にしていた)

自己対局の速度比較

10ブロックの自己対局では43.1局面/秒で生成できていたが、15ブロックにしたことで37.30局面/秒になり、局面の生成速度は、79.6%に低下した。
250万局面の生成時間は、10ブロックは17時間12分、15ブロックは19時間56分となった。

モデル学習速度

10ブロックでは、250万局面×過去10サイクルの学習に、2時間45分だったところ、15ブロックでは、4時間4分となり、学習速度は、1.47倍になった。

自己対局とモデルの学習を合わせると、1サイクルあたり、

10ブロック 19時間57分
15ブロック 24時間42分

となった。

精度比較

70サイクルまで学習した10ブロックのモデルのパラメータを転移学習して、10ブロックのモデルで生成した71~80サイクルのデータを学習して、そこから自己対局を105サイクル(1サイクル目を81サイクルとしてカウント)まで行った結果、ほぼ飽和した。
floodgateのR3500以上の棋譜との一致率は以下のようになった。

モデル policy accuracy value accuracy
10ブロック 0.44010064 0.7129697
15ブロック 0.44107565 0.7058925

policyは一致率が高くなっているが、valueは大幅に低下してしまった。

バッチサイズの変更

valueの精度はバッチサイズを増やすと安定する傾向があるので、バッチサイズを256から1024に増やして、学習をやり直した。
99サイクルまで学習した結果、floodgateのR3500以上の棋譜との一致率は以下のようになった。

モデル policy accuracy value accuracy
10ブロック 0.44010064 0.7129697
15ブロック 0.44053894 0.7124748

policyの一致率はわずかに上がり、valueの一致率はほぼ同じになった。

強さの比較

10ブロックのモデルと、15ブロックのモデルで、同じ探索プログラムで1手3秒で100回対局を行い強さを比較した。
結果は、以下の通りとなった。

対局数100 先手勝ち47(47%) 後手勝ち51(51%) 引き分け2
selfplay079
勝ち62(62%) 先手勝ち30(30%) 後手勝ち32(32%)
selfplay099_b15
勝ち36(36%) 先手勝ち17(17%) 後手勝ち19(19%)

※selfplay079が10ブロック、selfplay099_b15が15ブロック
10ブロックのモデルの方が強いという結果となった。
15ブロックのモデルの精度の向上はわずかだが、探索速度は、初期局面で、

モデル プレイアウト/秒
10ブロック 5905
15ブロック 4214

となり、71.4%に低下している。
探索速度低下を補うには0.1%程度のモデルの精度向上では足りなかったようだ。

考察

モデルのブロック数を増やして、パラメータを転移学習する方法では、モデルの精度を上げることはできなかった。
転移は行わず初期値から生成済みの学習局面を学習させた方が良かったかもしれない。

15ブロックのモデルの検証にやり直しを含めて、2ヵ月かかっているので、再実験は一旦保留して、10ブロックのモデルの精度向上の方に取り組むことにする。
15ブロックのモデルで、バッチサイズを増やすと効果があったので、10ブロックのモデルでもバッチサイズを増やしてみる。

また、10ブロックのモデルと15ブロックのモデルを対局させた際、以下の局面で、詰み探索を入れているため先手が詰みを見つけている局面で後手は自分が優勢と考えていた。
f:id:TadaoYamaoka:20190204211758p:plain
先手側も詰み探索を除くと後手優勢と判断しており、終盤の詰みの読み漏れが起きていた。
詰みが絡む局面をうまく学習できていない可能性があるため、自己対局の対局打ち切りの閾値に問題があるのではないかと考えている。
自己対局のサイクルを早めるため、勝率の推定値が閾値を超えた(もしくは下回った)場合に対局を打ち切っているが、終盤の判断に誤りがある状態では、上記のように自分が詰んでいる局面で誤って自分の勝ちと判断して閾値を超えると、誤った学習を行い、それが強化されるという悪循環になる。

自己対局による強化学習では、学習の初期段階では自分自身の推定値で打ち切るのは問題がありそうである。
AlphaGo Zeroでは、一定数のゲームでは終局までプレイして勝率の推定値が正しいか検証を行っていた。
このプロセスは省いてはいけないのかもしれない。

対局打ち切り条件の変更

AlphaGo Zeroと同じように検証してもよいが、以前にDfPnによる高速な詰み探索を作成していたので、閾値による対局打ち切りを行わず、詰み探索で詰みが見つかるまで対局を行うように変更した。
GPUで計算中に詰み探索が完了するように、探索ノード数の上限を調整することで、自己対局による局面生成速度をほとんど落とすことなく詰み探索を組み込むことができた。
具体的な実装としては、1GPUにつき256エージェントの探索の推論要求バッチ処理しているため、詰み探索をエージェントにつき1スレッドで並列処理すると、以前に問題となった大群の問題が発生してしまうため、各エージェントの詰み探索の要求を1スレッドで順次処理するようにした。
エージェントごとに探索している局面と、何番目のプレイアウトを処理中かが異なるため、詰み探索を行うのは手番の切り替わりのタイミングのみなので、一度に詰み探索の要求が集中することは少ない。
そのため、1スレッドでもGPU計算中に詰み探索が完了するように調整できた。
探索ノード数を10万ノードに制限しているが、場合によっては20手以上の詰みも探索できていた。

これで、自己対局を回して、上記の局面のような誤った終盤の判断が改善するか様子を見たい。

余談

世界コンピュータ選手権申し込みました。
昨年よりは強くはなっていると思うので、なんとか1次予選は通過したいところです。