TadaoYamaokaの開発日記

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

cshogiをOpenAI Gymインターフェースに対応させてみた

強化学習の勉強をしていてアルゴリズムを実装して試してみたいが、CartPoleとか学習させても面白くないのでせっかくなので将棋で試せるようにしてみたくなった。

ということで、cshogiOpenAI Gymインターフェースに対応させてみた。

Gymインターフェース

公式の説明の通りいくつかのインターフェースを実装するだけなので、特に難しいことはなかった。
https://github.com/openai/gym/blob/master/docs/creating-environments.md
別にこのインターフェースを使わなくてもよいのだが、標準的なインターフェースに従っている方が、一般的な強化学習の枠組みに沿うので理論との整合性がとりやすくなると思う。

将棋での考慮点

学習間隔

チュートリアルでは1ステップごとに学習が行われるが、将棋では終局まで報酬がないため1エピソード完了時に学習するようにした。

バッチサイズ

学習はリプレイバッファからサンプリングして行うが、1バッチに終端の報酬が1つは含まれないと学習が進まないため、バッチサイズは最大手数と合わせて512とした。

行動空間

元のチュートリアルのCartPoleは、行動空間が2次元だが、将棋の場合は最大593で、状態により可変となる。
可変では扱いにくいため、dlshogiと同じように無駄な手も含めて移動先座標+移動方向で固定次元で出力するようにして、gatherで合法手のみに絞るようにした。

ミニマックスを考慮したQ学習

Q学習の学習則は以下の式だが、1ステップ後(s')は、相手の局面のため\max _{a} Q\left(s^{\prime}, a\right)の符号を反対にする必要がある。
\displaystyle
\delta=Q(s, a)-\left(r+\gamma \max _{a} Q\left(s^{\prime}, a\right)\right)

詰み探索

詰みの手順も学習させてもよいが終局まで長引くため短い手数の詰み探索を行うようにした。
そのため、cshogiにAND/ORのよる高速な詰み探索を実装した。

棋譜の出力

lossだけ見ても面白くないので、自己対局結果が見られるようにKIFフォーマットで棋譜を出力するようにした。
そのため、cshogiに棋譜出力機能を実装した。

学習結果

とりあえず1000局学習させてみたが、1000局ではほとんど有効な手は学習しておらず、学習が進むとほとんど千日手になる。
Q学習は終端の報酬が徐々に開始状態の方向に波及していくが、将棋のように終端まで報酬がなく状態空間が広いと、序盤の学習には相当な時間がかかりそうに思うが、ディープなモデルでは局所的に有効な手を学んでいければそうでもないかもしれない。
DQNは、R2D2とか最新の価値ベースの手法に比べると相当効率の悪いアルゴリズムなので、DQNをベースラインとして他の手法も試してみたい。