コンテンツにスキップ

V14 d_model=256 実験結果

更新日: 2026-07-19

概要

V14 unified policy/value modelの共通埋め込み幅をd_model=128から256へ拡張し、既存データによるbootstrap、V14 self-playデータによるfinetune、反復self-play trainを実施した。本稿はcycle 2のpromotion完了時点までを対象とする。cycle 3はd_model=256のcycle 2 Candidateから開始済みだが、結果はまだ含めない。

現時点の結論は次の通りである。

  • 256幅モデルは、ほぼ新規初期化された状態から既存データを学習し、実用的なvalidation指標まで回復できた。
  • cycle 2 CandidateはV13 cycle 10 Championとの同一デッキ対戦で、終了試合ベース65.44%の勝率を記録した。
  • policy指標は少し改善したが、value lossはself-play更新後に悪化した。validation total lossだけでは対戦性能を選べない。
  • 今回の対戦結果が示すのはV13 Championに対する相対性能であり、未知の相手を含む絶対性能はまだ確定していない。
  • 同一条件の128幅モデルとのcontrolled A/Bではないため、対戦性能の改善をモデル幅だけの効果とは断定できない。

評価範囲

本稿では、validation指標とCandidate対Championの直接対戦だけを評価に使用する。以前実施した対ルール評価は、対戦相手の品質と評価指標の信頼性が十分でないため、実験結果と結論から除外した。

モデル構成

項目 V13までの主構成 V14 256幅構成
d_model 128 256
Transformer layer数 4 4
attention head数 4 4
parameter数 約28.4M 61,166,915

parameter数はcheckpoints/policy_value_v14_256_finetuned_best.ptのmodel tensorを集計した実測値である。V13構成の約2.15倍になった。shared Transformerだけでなく、card、attack、object、history、deck、action encoderと各headの共通幅も256へ拡張される。

128幅checkpointからの移行は、性能を保存したまま幅だけを増やす変換ではない。205 tensorのうちshapeを保って読み込めたのは16 tensorで、189 tensorはshape不一致により新規初期化された。そのため、以下のbootstrap結果は256幅モデルの学習可能性を示すが、128幅モデルからの純粋な差分学習ではない。

学習設定

現在の標準training profileは次の設定である。

項目
config configs/v14/train-policy-gumbel-selfplay.yaml
optimizer AdamW
learning rate 1e-5
scheduler none
epoch 2
micro batch 16
gradient accumulation 4
effective batch 64
weight decay 0.01
gradient clip norm 1.0
training device MPS
self-play device CPU / fp32
self-play search Gumbel Sequential Halving ISMCTS

MPSでは長時間実行時のdriver memory増加へ対処するため、安定padding、定期checkpoint、process restartを使用する。詳細は2026-07-16 V14 256次元trainingのMPS OOM対策を参照する。

既存データによるbootstrap

データ

次の約171万recordを使用した。

  • V13 rule bootstrap filtered 10k
  • V13 iterative self-play cycle 1
  • V13 iterative self-play cycle 5
  • V13 iterative self-play cycle 10

validationにはV14 cycle 1から抽出した6,041 recordを使用した。

結果

指標 学習前 最良エポック1 改善量
validation total loss 2.881381 1.832472 1.048909
validation policy loss 1.440740 1.239512 0.201228
validation policy KL 1.132244 0.931016 0.201228
policy top-1 agreement 30.51% 50.28% +19.78pt
validation value loss 1.095099 0.498839 0.596260
aux prize loss 0.241012 0.091508 0.149504
integrated belief loss 0.104530 0.002613 0.101917

初期値の大半が新規初期化だったため改善幅は大きい。この結果から、256幅構成が既存record schemaを学習でき、policy/value/aux/beliefの各headを同時に収束させられることを確認した。

V14 cycle 1データによるfinetune

bootstrap checkpointを、cycle 1のtrain 116,418 recordで2 epoch追加学習した。

指標 学習前 最良エポック2 変化
validation total loss 1.832472 1.814381 -0.018091
validation policy loss 1.239512 1.201979 -0.037533
validation policy KL 0.931016 0.893483 -0.037533
policy top-1 agreement 50.28% 51.05% +0.77pt
validation value loss 0.498839 0.517988 +0.019149
aux prize loss 0.091508 0.091913 +0.000405
integrated belief loss 0.002613 0.002502 -0.000112

policyは改善したがvalueは悪化した。total lossはpolicy改善が上回って小幅に改善している。生成checkpointは checkpoints/policy_value_v14_256_finetuned_best.ptであり、cycle 2 self-playの初期modelとして使用した。

反復self-play train

Cycle 1の位置づけ

cycle 1はV13 Championを初期checkpointとして開始したarchitecture transitionであり、完成した256幅bootstrap checkpointから始めたcycleではない。promotion対象のattempt 2は次の結果でrejectされた。

評価 Candidate Champion
head-to-head勝率(終了試合) 48.91% 51.09%

また、当時はchunkごとのgame IDが重複し、split summary上は1,000試合が100 unique gameとして扱われた。record数はtrain 116,418、validation 6,041だったが、game単位splitの独立性に制約がある。このID問題はcycle 2より前に修正した。

したがってcycle 1は移行失敗とpipeline診断の記録として扱い、256幅モデルの現在性能はcycle 2を主要根拠とする。

Cycle 2のデータ

項目
初期checkpoint policy_value_v14_256_finetuned_best.pt
self-play games 1,000
train games 950
validation games 50
train records 116,751
validation records 6,537
history replay なし。cycle 1が未昇格だったため登録済み履歴がなかった。

サイクル2の学習試行

3条件を同じtrain/validation splitから学習した。attempt 2と3はpolicy target temperatureが異なるため、raw policy lossとKLをattempt間で直接順位付けする際には注意が必要である。

試行 最良エポック 教師分布の温度 検証損失 Policy損失 Policy KL Top-1 Value損失
1 1 1.00 1.670951 1.195540 0.898629 50.80% 0.386493
2 2 1.25 1.679269 1.207106 0.851829 50.98% 0.383088
3 1 1.50 1.678851 1.221238 0.810815 51.04% 0.369471

全attemptで、各attemptの学習前評価に対してpolicy lossとKLは約0.013から0.014改善した。一方、top-1はほぼ横ばいから最大+0.23ptで、value lossは約0.095から0.112悪化した。特にattempt 1では次の変化だった。

指標 学習前 最良エポック1 変化
validation total loss 1.571892 1.670951 +0.099059
validation policy loss 1.208431 1.195540 -0.012891
validation policy KL 0.911520 0.898629 -0.012891
policy top-1 agreement 50.81% 50.80% -0.01pt
validation value loss 0.274539 0.386493 +0.111954
aux prize loss - 0.086588 -
integrated belief loss - 0.002330 -

retry選択時のvalidation scoreだけではattempt 3が選ばれていたが、最終的なpromotion benchmarkではattempt 1をCandidateとして評価した。最終manifest、run ledger、latest aliasではattempt 1をcycle 2の正式結果として扱う。

Cycle 2 promotion結果

Candidateはcheckpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt、ChampionはV13 cycle 10のcheckpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.ptである。

Championとのhead-to-head

head-to-headとは、CandidateとChampionを同じ条件で直接対戦させ、どちらが相対的に強いかを測る評価である。ルールベースなど第三の相手に対する勝率ではない。

固定7デッキを使用し、CandidateとChampionへ同じデッキを渡した。各デッキでCandidateがplayer 0になる10試合と、player 1になる10試合を行い、先後の影響を均した。合計は7デッキ x 2方向 x 10試合 = 140試合である。

項目 結果
Candidate wins 89
Champion wins 47
unfinished 4
終了試合でのCandidate勝率 65.44%
95% confidence interval 57.12%から72.91%

勝率はunfinished 4試合を分母から除き、89 / (89 + 47) = 65.44%と計算する。52%の正式基準を明確に超えたため、cycle 2 Candidateはこの固定benchmark上でV13 Championより強いと判断した。最終statusは promotedで、cycle 3の初期modelに使用している。

この数値は「あらゆる相手に65.44%勝てる」という意味ではない。使用した7デッキとV13 Championに対する相対勝率である。

デッキ別結果

head-to-headは各デッキ20試合である。

Model側デッキ Candidate勝 Champion勝 Unfinished Candidate勝率
Mega Abomasnow official sample 16 4 0 80.0%
Mega Lucario ex 16 4 0 80.0%
Dragapult citytop 14 6 0 70.0%
Archaludon ex metal 13 7 0 65.0%
Garchomp ex Cynthia 12 8 0 60.0%
Starmie ex Archaludon counter 11 9 0 55.0%
Iono Bellibolt ex 7 9 4 43.8%

Iono Bellibolt exでは4試合がunfinishedだったため、H2H勝率は終了16試合を分母にした。

主要な傾向は次の通りである。

  • Mega AbomasnowとMega Lucarioでは、CandidateがChampionに対して80%勝った。
  • Dragapult、Archaludon、GarchompでもCandidateが60%以上勝った。
  • Starmieは55%で差が小さく、この試合数だけでは明確な優位を判断しにくい。
  • Iono Bellibolt exだけはCandidateが負け越し、unfinishedも4試合発生したため、優先的な局面診断対象である。

各デッキの予定20試合ではconfidence intervalが広い。Ionoは終了試合が16試合に限られるため、さらに不確実性が大きい。デッキ別の順位を確定値として扱わず、再現試験の優先順位付けに使う。

総合分析

確認できたこと

256幅モデルは学習不能にはなっておらず、V13 Championより強いCandidateを生成できた。特にcycle 2のhead-to-head差は偶然だけでは説明しにくい大きさで、256幅モデルを次cycleへ進める根拠として十分である。

policy lossとKLが小幅に改善し、head-to-headでも大きく勝ち越したため、更新が完全に壊れているわけではない。aux prizeとbelief headも低いlossを維持している。

残る問題

value lossは全attemptで悪化した。self-play validationに対するvalueの汎化、終局結果の分布変化、policy/valueの共有表現におけるgradient競合を切り分ける必要がある。total validation lossが悪化しても対戦性能が上がったことから、現行のloss重みとpromotion指標は同じ目的を直接測っていない。

デッキ別の改善は均一ではなく、Ionoでは負け越している。self-play相手への適応と、異なるデッキや未知の相手への汎化を区別して評価する必要がある。

まだ断定できないこと

今回の実験ではモデル幅のほかに、bootstrapデータ、Gumbel target、optimizer設定、学習回数、self-play局面分布も変わっている。したがって、65.44%のhead-to-head勝率をd_model=256だけの効果とは断定できない。

幅の純粋な効果を測るには、128幅と256幅を同じ初期データ、同じsplit、同じoptimizer step数、同じseedで学習し、固定benchmarkへ送るcontrolled A/Bが必要である。

次に確認すること

  1. cycle 3でcycle 2 Candidateからの改善が継続するか確認する。
  2. 負け越したIonoと差が小さいStarmieのCandidate対Champion traceを局面別に比較する。
  3. value loss悪化を、turn、終局理由、デッキ、勝敗、探索Qのconfidence別に分解する。
  4. 異なるseedで同じhead-to-head benchmarkを再実行し、65.44%の再現性を確認する。
  5. 128幅と256幅のcontrolled A/Bを実施し、parameter増加そのものの効果を測る。

分析方法

本稿では、training metricsのbest.metricsからbest epochのvalidation値を取得した。cycleごとの試合数、split、checkpoint chainはmanifestとsplit summaryを正とした。

head-to-head勝率は、CandidateとChampionの先後を入れ替えた両方向の結果を合算し、unfinishedを除く終了試合を分母にした。デッキ別結果もforwardでのCandidate勝利数とreverseでのCandidate勝利数を合算した。対ルール評価は分析対象に含めていない。

cycle 2のretry選択記録と最終promotion結果が異なるため、最終的なcheckpoint採用状態はmanifest、run ledger、promotion benchmarkを優先した。

保存した結果

  • logs/v14-256-bootstrap-metrics.json
  • logs/v14-256-finetuned-metrics.json
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806-cycle001.manifest.yaml
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806-cycle002.manifest.yaml
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806-cycle002.train-metrics.json
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806-cycle002.train-metrics_attempt002.json
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806-cycle002.train-metrics_attempt003.json
  • data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle002.split-summary.json
  • data/eval/promotion-gate/v14-gumbel-iterative-10k-20260714-005806-cycle002-attempt001/promotion-benchmark.jsonhead_to_head
  • logs/selfplay-train/v14-gumbel-iterative-10k-20260714-005806.ledger.yaml