TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

PythonでAlphaZero Shogiを実装する

次の技術書典のネタとしてPythonでAlphaZero Shogiの完全コピーを実装しています。

github.com

自己対局と学習がようやく動くようになりました。

入力特徴と出力ラベルと探索の仕様はAlphaZero Shogiと完全に一致させました。

入力特徴
  • 先手の駒 14
  • 後手の駒 14
  • 繰り返し数 3
  • 先手の持ち駒の数 7
  • 後手の持ち駒の数 7
  • 手番 1
  • 手数1
  • 履歴8局面
出力ラベル
  • 移動方向×移動距離 64
  • 桂馬の動き 2
  • 移動方向×移動距離(成り) 64
  • 桂馬の動き(成り) 2
  • 駒打ち 7

高速化

Pythonで作成する目的は、本にする上で強化学習の仕組みを理解できるように実装するためです。
それでも、そこそこの速度で動かないと少し試すにも時間がかかりすぎるので、分かりやすさを損なわない程度に、できる限り高速化も行っています。

cshogi

Pythonで速度を出すために将棋ライブラリとして先日日記に書いたcshogiを使っています。
python-shogiと比べて、ビットボードの演算をC++で行っているので、指し手生成が高速になっています。

ハッシュ

ゾブリストハッシュの実装もcshogi側で実装しました。

推論のバッチ処理

dlshogiで行っているのと似た方法で、複数エージェントを同時に対局させて、GPUによる推論をバッチ処理しています。
Pythonはスレッドによる並列化はGILがあるためほとんど効果がありませんが、この方法で疑似的に並列化することでPythonでもそこそこ並列化の効果がでます。

教師あり学習対応

CSAフォーマットの棋譜を使って教師あり学習もできるので、強化学習しない場合でもそこそこ強い将棋AIが作れるようになっています。


ということで、技術書典に向けて執筆始めます(まだ1ページも書いていない・・・)