強化学習の勉強をしていてアルゴリズムを実装して試してみたいが、CartPoleとか学習させても面白くないのでせっかくなので将棋で試せるようにしてみたくなった。
ということで、cshogiをOpenAI Gymインターフェースに対応させてみた。
Gymインターフェース
公式の説明の通りいくつかのインターフェースを実装するだけなので、特に難しいことはなかった。
https://github.com/openai/gym/blob/master/docs/creating-environments.md
別にこのインターフェースを使わなくてもよいのだが、標準的なインターフェースに従っている方が、一般的な強化学習の枠組みに沿うので理論との整合性がとりやすくなると思う。
DQNサンプル
試しにPytorchのチュートリアルのDQNを将棋に適用してみた。
ソース:
cshogi_gym/dqn.py at master · TadaoYamaoka/cshogi_gym · GitHub
Google Colabでの実行結果:
https://colab.research.google.com/drive/1d7bo0vbhnzxiESBYTjwRhbQYB2ohH984
将棋での考慮点
学習間隔
チュートリアルでは1ステップごとに学習が行われるが、将棋では終局まで報酬がないため1エピソード完了時に学習するようにした。
バッチサイズ
学習はリプレイバッファからサンプリングして行うが、1バッチに終端の報酬が1つは含まれないと学習が進まないため、バッチサイズは最大手数と合わせて512とした。
行動空間
元のチュートリアルのCartPoleは、行動空間が2次元だが、将棋の場合は最大593で、状態により可変となる。
可変では扱いにくいため、dlshogiと同じように無駄な手も含めて移動先座標+移動方向で固定次元で出力するようにして、gatherで合法手のみに絞るようにした。
ミニマックスを考慮したQ学習
Q学習の学習則は以下の式だが、1ステップ後(s')は、相手の局面のための符号を反対にする必要がある。
詰み探索
詰みの手順も学習させてもよいが終局まで長引くため短い手数の詰み探索を行うようにした。
そのため、cshogiにAND/ORのよる高速な詰み探索を実装した。