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 plygame_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 groups
58,800 games
419,840 training rows
maximum 16,000 optimizer steps

control と 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が執筆し、筆者が内容を確認・編集しています。