前回の記事「feature-devで将棋AIを作ってみました」を、「まだ強くはないのですが」という一文で締めくくりました。

その後しばらく手を入れ続けた結果、でたらめだった棋力がひとまず「人並み」と呼べる水準になりました。コードもかなり変わったので、GitHubも合わせて更新しています。


まず、バグが多かった

前回、AI Engineerエージェントにコードレビューをお願いしたら、ブロッカーが4件出てきました。「動いているけれど実用的ではない」という類の問題です。

これを一通り対応しました。

[B-1] MCTSの合法手生成が毎回走っていた

探索ツリーをたどるたびに合法手を生成し直していて、1手の思考で数千回単位で走る計算になっていました。ノードを展開したときに合法手をキャッシュする形に変えました。

[B-2] AI思考中に画面が固まっていた

UIのメインスレッドでMCTSを計算していたため、AIが考えている間ずっと画面が止まる状態でした。threading.Thread で別スレッドに分離しました。

[B-3] 訓練を再開するとoptimizerがリセットされていた

チェックポイントにモデルの重みしか保存していなかったため、再開のたびにAdamの内部状態が初期値に戻っていました。optimizer と scheduler も含めてフルで保存・復元するようにしました。

[B-4] 千日手を状態として区別できなかった

同じ局面の繰り返しをネットワークが認識できていなかった問題です。千日手フラグを状態チャンネルに追加しました(STATE_CHANNELS: 43→44)。


その後も、クラッシュが続いた

レビュー対応を終えても、学習中に突然落ちる問題が続きました。

原因を追ったところ、主に2つありました。

メモリリーク:MCTSのシミュレーション中に千日手チェック用の辞書を毎回コピーしていて、1ゲームで数百MBの一時オブジェクトが積み重なってOOMになっていました。MCTSの内部では辞書コピーをスキップするよう修正しました。

CUDAクラッシュ:学習後の非同期CUDAエラーが、次の自己対局の最初のカーネル起動で表面化するパターンでした。自己対局をCPU推論に分離することで回避しました。GPU は学習専用、自己対局はCPUという役割分担です。


棋譜を使った事前学習

ここが今回の一番の変化です。

AlphaZeroの方式は「棋譜を使わず自己対局だけで強くなる」のが特徴なのですが、最初のうちはAI同士がでたらめな手を指し合うだけで、まともな将棋になるまでに時間がかかります。

そこで、Floodgateの棋譜を使って事前学習させてみました。

Floodgateはコンピュータ将棋同士の対局を記録しているサイトです。CSA形式の棋譜が年別に公開されていて、手元には12万局以上あります。

# 事前学習の実行コマンド
python shogi_ai/pretrain.py shogi_ai/data/kifu --max-games 10000 --epochs 20

今回は10,000局・20エポックで試しました。


結果

でたらめだった棋力が、ひとまず「人並み」になりました。

棋譜学習前は、AIが完全にランダムに近い手を指していました。それが、学習後は定跡っぽい動き・駒の方向性・序盤の組み立てが一応できるようになった感じです。

なぜここまで変わったかというと、Floodgateの棋譜はコンピュータ将棋同士の対局なので、指し手の質がもともと高い。それを教師データにしているので、「どの方向に指すか」の方針を一気に学べたのだと思います。


まだ12万局のうち10,000局しか使っていない

手元の棋譜は全部で12万局以上あります。今回は1割も使っていません。

学習ロスはエポック11あたりで収束していたので、「データを増やせばまだ伸びる」状態だと思っています。次は5万局・10万局と増やして試してみる予定です。


コードの更新について

バグ修正・安定化・事前学習スクリプトをまとめてGitHubに反映しました。

margaret-research/shogi-ai

新しく追加したファイルは2つです:

  • training/csa_parser.py:CSA形式の棋譜を読み込むパーサー
  • pretrain.py:棋譜による事前学習スクリプト

--resume オプションで途中から継続学習もできます。

# 追加データで継続学習する場合
python shogi_ai/pretrain.py shogi_ai/data/kifu --max-games 50000 --epochs 10 --resume

「でたらめ→人並み」は一段階クリアした感じです。次は棋力をもう少し上げてから、自己対局の強化学習に戻ろうと思っています。