TadaoYamaokaの開発日記

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

将棋AIの実験ノート:初期局面集の優先順位付きサンプリング

深層強化学習の手法に、Prioritized experience replay (PER)(優先順位付き経験再生)という方法がある。
リプレイバッファに蓄積した経験データに優先順位を付けて、優先順位が高いほどより多くサンプリングする手法だ。

優先順位の尺度には、TD誤差が用いられる。
現在のネットワークの予測と、nステップ後の\max _{a} Q\left(s^{\prime}, a\right)の差が大きいほど優先的にサンプリングする。
サンプリングしたデータの優先度は、その時点の推論結果によって更新される。

将棋AIへの応用

この考えを、dlshogiの学習に採用したいと思っているが、将棋AIでは、勝敗と探索後のルートノードQ値を学習しているため、一度付けた優先度を推論結果だけでは更新することができない。
そこで、優先順位を付けるのを初期局面のサンプリングに置き換えることで、似たような効果を得たいと考えている。
つまり、判断の難しい局面(=優先度が高い局面)を多く初期局面として対局することで、学習効果の高い棋譜を生成したい。

以前に、自己対局で優勢と判断した局面から負けた局面を抽出して、初期局面集に加えるということを行ったが、考え方は近い。
しかし、もう少し統計的に処理したい。

実現方式案

初期局面集に登録する局面には、勝敗結果とその時の探索結果のQ値を記録しておく。

初期局面集をロードする際に、|勝敗結果-Q値|を使用してsum-treeを構築する。
sum-treeはセグメント木の一種で、一度構築すると、優先度によるサンプリングがO(log(N))の計算量で行える。

優先度には、|勝敗結果-Q値|以外にも、序盤や入玉勝ちを重点的に学習したい場合にバイアスを掛けたりできる。
そのため初期局面集には、勝敗の理由(千日手入玉勝ち)や、手数も同時に記録しておくと良いだろう。

こうしておけば、過去の自己対局で生成した局面や、floodgateの棋譜などから適当にサンプリングして登録した初期局面集でも、適切な優先度に応じて初期局面として使用されるため、初期局面の作成に悩まずに済む。
とにかく数多く登録しておけばよい。

まとめ

まだ試しても実装もしていないが、とりあえず案だけ書いてみた。
教師局面のフォーマットを見直そうと考えているので、後で必要になりそうな情報も出力しておきたいため、とりあえず案だけ整理してみた形である。