Splendor AIのvalueが手番を見ていなかったので特徴量を追加した
Splendor をプレイする policy-value model を作っている。
前回は、教師データを取るゲーム数を 29,400 局から 58,800 局へ増やしても、value の予測誤差は少し改善したものの、対局の強さは伸びなかった。
次は value の学習方法を変えることを考えていたが、その前にモデルへ渡している局面情報を見直した。
すると、ゲームの状態には存在するのに、モデルの入力には入っていない手番情報があった。
value から見えていなかったもの
Splendor は先に 15 点以上へ到達した瞬間に終わるわけではない。同じラウンドで手数を揃えてから勝敗を決める。
実装上も、誰が最初のプレイヤーだったか、現在どちらの手番か、何手進んだかはゲーム状態に入っている。
しかし従来の global feature は、終局ラウンドに入ったかどうかと、各山札に何枚残っているかしか持っていなかった。
プレイヤー情報は「手番側」「相手側」の順に並べ直しているため、次の情報は消えていた。
- 今の手番プレイヤーが先手かどうか
- 現在が何手目か
これは value では問題になり得る。
例えば、盤面や得点がほぼ同じでも、今のプレイヤーが先手か後手かによって、15 点へ到達したあと相手にもう一度手番が回るかどうかが変わる。
モデルから見ると同じ入力なのに、本当の状態価値が異なる局面が混ざることになる。
機械学習的には、状態 s を特徴量 x = φ(s) へ変換するとき、異なる状態を同じ x に潰してしまう representation aliasing になる。
この場合、データを増やしても欠けた情報は復元できない。モデルは各状態の value ではなく、同じ入力にまとめられた状態の平均的な分布を学ぶことになる。
6個の特徴量を追加した
新しい入力では global feature を 4 個から 10 個へ増やした。
| 特徴量 | 値 |
|---|---|
| 手番側が先手か | 0 / 1 |
| game ply | game_ply / 160 |
| 得点差 | (自分 - 相手) / 22 |
| 購入カード枚数差 | (相手 - 自分) / 30 |
| 自分の 15 点までの距離 | (15 - 自分の得点) / 15 |
| 相手の 15 点までの距離 | (15 - 相手の得点) / 15 |
最初の2つは、従来の入力から完全に欠けていた情報になる。
残りは元の player feature から計算できるので、新しい情報そのものではない。ただ、得点差や15点までの距離はゲームのレース状況を直接表している。
購入カード枚数も入れた。Splendor では最終得点が同じ場合、購入したカードが少ない方が有利になるためである。
特に得点差は、以前から追加候補として考えていたものだったので、今回の特徴量に含めた。
モデル本体はほとんど変えない
この実験では、特徴量追加と大きな architecture 変更を同時に行わないことにした。
従来の model は global feature 4 個と 90 枚分の deck presence をまとめて global encoder に入力していた。
新しい model はここを、
94 inputs -> 100 inputsへ広げるだけにしている。
その後の attention block、state representation、policy head、WDL head は同じ構成を使う。
つまり、強くなった場合に「新しいネットワーク構造が効いた」のか「欠けていた状態情報が効いた」のか分からなくなるのを避けている。
同じ学習データで比較する
実験は8組の paired replicate で行う予定にした。
control は従来の特徴量、treatment は今回の10個の global feature を使う。
各組で使う条件は次の通り。
29,400 groups58,800 games419,840 training rowsmaximum 16,000 optimizer stepscontrol と treatment は、同じゲームだけでなく、学習へ残す decision row、policy target、terminal WDL target、row order まで同一にする。
初期パラメータも、形が同じ部分は揃える。treatment で追加された6入力列の重みだけを別の乱数系列から初期化する。
これで主な差を「6個の特徴量があるかどうか」に限定する。
checkpoint は 1,000 step ごとに残し、validation の joint loss が最も良いものを選ぶ。test の結果や対局結果を見て checkpoint を選び直すことはしない。
最終的には対局で判断する
まず未知の局面で WDL Brier が改善するかを見る。同時に policy KL が悪化していないことと、終盤から長い horizon まで value が壊れていないことも確認する。
offline の条件を通った場合だけ、32 simulation の PUCT を使った fresh arena へ進める。
この実験で知りたいのは、単に value loss が下がるかではない。
欠けていた手番情報と明示的なレース特徴を渡すことで、探索中に使える value になり、実際の対局で強くなるかを見たい。
現時点では feature extraction、model contract、実験条件の実装と preregistration までで、production training、test、arena の結果はまだない。
結果が出たら、次の記事で書く。
この記事は、実装・実験記録をもとに、本文の大部分をLLMが執筆し、筆者が内容を確認・編集しています。