自己対局ループを立ち上げ、最初のモデル更新を通した
前回は、ルールベースの教師AIから方策(policy)と局面評価(value)を同時に学習する初期モデル(ブートストラップ)を構築した。
policy は「次にどの手を選ぶか」、value は「その局面から最終的に勝つか・引き分けるか・負けるか」を予測する。教師データ上では双方の損失が順調に減少し、学習が成立しているシグナルは得られていたものの、実際の対局においてどれほどの実力を持つのかは未知数だった。
そこで次のステップとして、このモデルをゲーム木探索アルゴリズムに組み込み、自己対局(self-play)によって生成した新たなデータをもとに後続モデルを再学習し、昇格戦を経てモデルを更新する強化学習ループを一通り開通させた。
本稿では、教師あり学習で得た初代モデルを探索プレイヤーとして仕立て、自己対局から挑戦者モデル(challenger)を学習し、最初のモデル昇格(promotion)を果たすまでの経緯をまとめる。
まずモデルを探索に接続する
ニューラルネットワーク単体で対局させる場合、方策ネットワークが最も高い確率を出力した着手をそのまま選ぶことになる。
一方、より深い読みを入れてプレイする際は、ネットワークの出力をPUCT(Predictor Upper Confidence bounds for Trees)探索へ組み込む。PUCTにおいて、方策(policy)は「どの候補手を優先して読むべきか」という事前確率(prior)として機能し、局面評価(value)は「読み進めた末端局面がどれだけ有望か」を評価する指標として用いられる。
今回の初期検証では、1手の決定につき32回のシミュレーションを実行する設定とした。
まず確認すべきは、このモデルが探索を伴うプレイヤーとして問題なく動作し、極めて基本的なベンチマークをクリアできるかどうかである。
同一の初期盤面を用い、先手・後手を入れ替えながら対局させた結果は以下の通りとなった。
| 対局カード | 成績 |
|---|---|
| ルールベース教師 vs ランダム着手AI | 200勝0敗 |
| モデル+PUCT vs ランダム着手AI | 200勝0敗 |
| モデル+PUCT vs ルールベース教師 | 111勝89敗 |
ランダムに着手する相手には200局すべてで勝利を収め、自己対局パイプラインを進めるための最低限の足切りラインはクリアできた。
一方、ルールベース教師AIとの対局は111勝89敗となった。先後を入れ替えた100ペア単位でのスコア率は0.555、95%信頼区間は [0.485, 0.625] だった。
点推定としてはモデル側が勝ち越しているものの、信頼区間は互角を示す0.5をまたいでいる。したがってこの段階では「教師AIを明確に超えた」とまでは判断せず、少なくとも同等クラスの実力で対局可能になったと慎重に評価した。
自己対局では探索結果を次の教師にする
ここからは、人間が設計したルールや固定の教師AIから学ぶのではなく、モデル自身が探索を通じて得たより深い着手判断を学習データへと昇華させていく。
自己対局の各手番では、現行モデル(incumbent)を用いてPUCT探索を実行する。
探索が完了すると、各合法手の訪問回数分布(visit distribution)が得られる。この分布を次世代の方策(policy)の教師信号として記録する。局面評価(value)については、その対局が最終的に勝利・引き分け・敗北のいずれで決着したか(WDL)を教師信号として割り当てる。
処理の大まかな流れは以下の通りである。
現行モデル(incumbent) ↓PUCTによる自己対局 ↓探索後の訪問回数分布 + 最終勝敗 ↓学習データセットへ追加 ↓現行モデルを初期値としてファインチューニング ↓挑戦者モデル(challenger) ↓現行モデルとの直接対局(arena) ↓昇格(promote)または棄却(reject)挑戦者モデルが現行モデルを統計的に有意な差で上回った場合にのみ、モデルの世代交代を行う。単にオフラインの学習損失が下がっただけでは決して本番モデルを置き換えない。
本番ループを回す前に、64局のパイロット測定を実施
自己対局では毎手ごとにPUCT探索を回すため、静的な教師データを生成するよりも計算負荷がはるかに高い。
そこで大規模なデータ生成に入る前に、32種類の初期盤面から先後を入れ替えた64局のパイロット実験を行い、実行スループットを計測した。
Apple M2のCPU環境で所要時間は88.02秒、合計3,816局面が得られた。1時間あたりの処理能力に換算すると、約2,618局/時、約156,000意思決定/時という計算になる。
得られた方策ターゲットの分布状況も確認した。
| 指標 | 測定結果 |
|---|---|
| 平均ゲーム手数(decisions) | 59.6手 |
| 方策ターゲットの正規化エントロピー | 0.3102 |
| 最多訪問手の平均選択確率 | 0.6450 |
| 最大手数(160 ply)に達した対局数 | 0局 |
探索後の訪問回数は特定の手への極端な一極集中(one-hot)にも完全な一様分布にも偏っておらず、探索によって複数の有望な手にバランスよく重みが配分されていることが確認できた。
このスループット測定をもとに、第1世代の自己対局規模を2,048局と決定した。
第1世代は教師ありデータをアンカーとして併用
初期の自己対局では、急激な方策崩壊(policy collapse)を防ぐため、前回作成した教師ありデータをアンカーとして残す手法をとった。
実際に投入したデータセットの比率は、既存の教師ありデータが約80%、新規の自己対局データが約20%という構成である。
自己対局フェーズでは1,024通りの初期盤面から先後を入れ替えた計2,048局を実行し、118,988局面を学習対象として抽出した。すべての対局が通常のゲーム終了条件を満たし、160手の上限に達した泥沼の対局は1局も存在しなかった。
挑戦者モデルは現行モデルの重みを初期値(warm start)とし、混合データセットを1エポック学習した。オプティマイザの更新回数は1,045ステップである。
第1世代の目的は、この段階で無理に過学習させて限界を攻めることではなく、自己対局から昇格判定に至るパイプライン全体が問題なく循環することの実証に置いた。
クラウド実行環境での教訓
当初はGoogle Colabの無料枠(T4 GPU)で世代更新を実行していた。
しかし長時間の自己対局の途中でクライアント側の約90分のタイムアウト制限に抵触し、セッション自体が切断されてしまった。自己対局ログ、学習中モデル、評価結果のいずれも回収できなかったため、この試行からは中途半端な推測を行わず、未完了の失敗として処理した。
その後、同一の実験設定をColab Pro(L4 GPU)上で再実行した。
こちらは最後まで安定して完走し、自己対局データの生成、モデルの追加学習、ONNX形式へのエクスポート、昇格対戦、結果の永続化とローカルでの検証までの一連のパイプラインが無事通過した。
全体の所要時間は約2時間39分だった。
興味深かったのは、L4の強力なCUDA環境であるにもかかわらず、自己対局のスループットが約873局/時にとどまった点である。
これは、Apple M2で測定したローカルCPUでの約2,618局/時と比べて明確に遅い。現在の探索エンジンは推論リクエストを十分にバッチ化できておらず、GPUの並列計算能力よりも1回あたりの推論レイテンシがボトルネックになっていたためだ。単にGPUを割り当てれば自動的に高速化されるわけではないという重要な知見が得られた。
挑戦者モデルが最初の昇格戦を通過
学習完了後、挑戦者モデル(challenger)と現行モデル(incumbent)を同一の32回シミュレーションPUCT探索で直接対戦させた。
100通りの初期盤面について席順を入れ替え、合計200局の対戦を実施した。
対戦結果は以下の通りである。
| 対戦結果 | 局数 |
|---|---|
| 挑戦者(challenger)の勝利 | 114局 |
| 引き分け | 3局 |
| 現行モデル(incumbent)の勝利 | 83局 |
勝率換算のゲームスコア率は0.5775を記録した。
昇格の可否は単に勝率が5割を超えたか否かで判断するのではなく、席順を入れ替えたペア単位で集計し、統計的な不確実性を加味して判定するプロトコルを敷いている。
今回の片側信頼限界の下限(one-sided lower bound)は0.5166となり、あらかじめ定めていた昇格基準値の0.5を無事にクリアした。
これにより、挑戦者モデルを新たな現行モデルとして正式に昇格させた。
教師あり初期化 ↓探索付き推論 ↓自己対局データ生成 ↓挑戦者モデルの学習 ↓ペア対局による昇格戦(arena) ↓正式昇格(promotion)強化学習システムの根幹をなすサイクルが、ここに初めて一周したことになる。
まとめと今後の展望
今回の1世代の昇格成功をもって、自己対局を回し続ければ青天井に強くなり続けると結論づけるのは早計である。
今回実証できたのは、教師あり学習モデルを出発点とし、探索によって新たなデータを自己生成し、そのデータを組み合わせて訓練した挑戦者モデルが、事前に設定した厳格な昇格基準を1回クリアできたという事実にとどまる。
初世代の昇格を達成することと、複数世代にわたって安定した実力向上を継続できることとの間には、依然として大きな技術的隔たりがある。
また、実行時間の大半を自己対局が占めている現状も浮き彫りとなった。推論をバッチ化できていない現在の探索構造ではGPUの恩恵を活かしきれないため、世代数やデータ量を拡大する前に、探索推論のスループット改善に取り組む価値は極めて大きい。
次は複数世代のループを連続して回し、昇格と棄却が繰り返される中で学習システム全体がどのように振る舞うかを検証していく。
この記事は、実装・実験記録をもとに、本文の大部分をLLMが執筆し、筆者が内容を確認・編集しています。