固定データを使った学習条件の比較¶
同じ初期checkpoint、train split、validation split、seedを固定し、Policy/Value学習のoptimizer設定だけを比較する。新しいself-playを生成せず、clipとlearning-rate schedulerの影響を分離するために使う。
比較条件¶
| 試行 | スケジューラー | 勾配クリップ | 目的 |
|---|---|---|---|
| A | cosine |
1.0 | 現行baseline |
| B | cosine |
5.0 | clip上限だけを変更 |
| C | none |
1.0 | schedulerだけを変更 |
epoch、learning rate、policy target temperature、seedは全attemptで同じ値を使う。
固定学習率と更新回数の比較¶
cycle内でlearning rateを変えず、batch sizeを64に固定して、learning rateとoptimizer更新回数を比較するprofileも用意している。
| 試行 | 学習率 | エポック数 | スケジューラー | 勾配クリップ |
|---|---|---|---|---|
| A | 1e-5 |
1 | none |
1.0 |
| B | 1e-5 |
2 | none |
1.0 |
| C | 2e-5 |
1 | none |
1.0 |
| D | 2e-5 |
2 | none |
1.0 |
| E | 3e-5 |
1 | none |
1.0 |
2 epochのattemptはepochごとにvalidationを実行し、val_lossが最小のepochをbest
checkpointとして保存する。これにより、更新回数を増やした効果と2周目の過学習を同じrunで確認できる。
実行¶
scripts/compare_train_optimizers.sh \
--run-name v14-cycle001-optimizer-abc \
--config configs/v14/train-policy-gumbel-selfplay.yaml \
--checkpoint checkpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.pt \
--train-input data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle001.train.jsonl \
--validation-input data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle001.validation.jsonl \
--device mps \
--seed 0 \
--resume
LRとepochを比較する場合:
scripts/compare_train_learning_rates.sh \
--run-name v14-cycle001-lr-epochs \
--config configs/v14/train-policy-gumbel-selfplay.yaml \
--checkpoint checkpoints/policy_value_v13_ismcts_iterative_10k_20260705-052512-cycle010_best.pt \
--train-input data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle001.train.jsonl \
--validation-input data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle001.validation.jsonl \
--batch-size 64 \
--device mps \
--seed 0 \
--resume
--dry-runを付けるとtrainを開始せず、選択したprofileのコマンドだけを表示する。--resumeはbest
checkpointとmetrics JSONが揃っているattemptをskipし、未完了attemptにtraining
stateがあればbatch途中から再開する。
生成物¶
checkpoints/experiments/<run-name>/
attempt-a-best.pt
attempt-a-final.pt
attempt-b-best.pt
attempt-b-final.pt
attempt-c-best.pt
attempt-c-final.pt
attempt-d-best.pt # learning-rate-epochs profileのみ
attempt-d-final.pt
attempt-e-best.pt
attempt-e-final.pt
logs/optimizer-comparison/<run-name>/
attempt-a.log
attempt-a-metrics.json
attempt-b.log
attempt-b-metrics.json
attempt-c.log
attempt-c-metrics.json
attempt-d.log # learning-rate-epochs profileのみ
attempt-d-metrics.json
attempt-e.log
attempt-e-metrics.json
manifest.json
comparison.json
comparison.md
判定¶
最初に全attemptのpretrain_val_*を比較する。差が1e-6を超えた場合は、初期条件が一致していないため比較を
invalid_baselineとする。
候補は次をすべて満たす必要がある。
validation_policy_kl_improvement > 0validation_policy_top1_agreement_improvement > 0validation_value_loss_improvement >= -0.01- report対象metricがすべてfinite
合格候補のうち、validation policy KL、top-1 agreement、value lossの順で優れたattemptを
recommended_attemptにする。これはtraining
metricによる候補絞り込みであり、Champion昇格を意味しない。選ばれたcheckpointは別途promotion
benchmarkで評価する。
選択したattemptの固定benchmarkとgate判定は、次の1 commandで連続実行できる。
pca promotion-run \
--run-name v14-cycle003-multi-head-attempt-m-vs-cycle002 \
--candidate-checkpoint checkpoints/experiments/v14-cycle003-multi-head-balance/attempt-m-best.pt \
--champion-checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--resume
既定では固定7
deckの先後入れ替え直接対戦、candidateとChampionのrule-pool評価を実行した後、criteria-mode=any、正式昇格52%、Training
Champion昇格50%で判定する。中断後に同じcommandを実行すると、条件が一致する完了済みbenchmarkを再利用してgateまで進む。
promotion-runは判定artifactを作るところまでを担当し、pipeline外のcheckpoint aliasやreplay
registryは変更しない。statusがpromotedになった外部実験を正式Championとして使う場合は、続けて次を実行する。
pca promote-checkpoint \
--run-name v14-gumbel-iterative-10k \
--run-id 20260714-005806-cycle003 \
--candidate-checkpoint checkpoints/experiments/v14-cycle003-multi-head-balance/attempt-m-best.pt \
--final-checkpoint checkpoints/experiments/v14-cycle003-multi-head-balance/attempt-m-final.pt \
--promotion-result \
data/eval/promotion-gate/v14-cycle003-multi-head-attempt-m-vs-cycle002/promotion-benchmark.json \
--data \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
--training-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--training-metrics \
logs/optimizer-comparison/v14-cycle003-multi-head-balance/attempt-m-metrics.json \
--attempt-label attempt-m
このコマンドは、benchmarkのpromotion_gate.status=promoted、Candidate
fingerprint、現在latestがbenchmark時のChampionまたは同じCandidateであることを確認する。検証後にofficial
/ training alias、latest manifest、cycle manifest、run ledger、replay
registry、採用receiptをまとめて更新する。同じ引数で再実行しても同じrun IDのledger / registry
entryを置き換えるため重複しない。事前確認だけ行う場合は--dry-runを付ける。
Policy蒸留の切り分け¶
distillation
profileは、同じ初期checkpointとCycleデータを固定して、Policyが探索targetを再現できない原因を切り分ける。
| 試行 | 学習目的 | 勾配クリップ | 目的 |
|---|---|---|---|
| A | Policy + Value + auxiliary + belief | 1.0 | 現行baseline |
| B | Policy only | 1.0 | shared trunkのloss競合を確認 |
| C | Policy only | 5.0 | gradient clipによる更新不足を確認 |
Cycle 3データで実行する場合:
pca train-compare \
--run-name v14-cycle003-distillation \
--checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--train-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--validation-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.validation.jsonl \
--epochs 1 \
--batch-size 16 \
--learning-rate 0.00001 \
--policy-target-temperature 1.0 \
--device mps \
--seed 0 \
--resume
best_policy_fit_attemptはValue悪化を許容してPolicy再現だけが最も良い条件を示す。recommended_attemptは従来どおりValueの悪化上限も満たす候補であり、そのまま昇格評価へ進められる条件を示す。Policy-onlyが勝った場合は、そのcheckpointを本番採用せず、次の比較でValue
loss weightを段階的に戻す。
複数損失の重み付け¶
joint-balance profileは、蒸留比較で確認したgradient-clip-norm=5を固定し、Value loss
weightだけを変える。Auxiliary
prizeとBeliefは全attemptで有効なため、DとAの比較でjoint学習におけるclipの効果、D/E/Fの比較でPolicyとValueのバランスを確認できる。
| 試行 | 学習目的 | 勾配クリップ | Valueの重み |
|---|---|---|---|
| D | Joint | 5.0 | 1.0 |
| E | Joint | 5.0 | 0.5 |
| F | Joint | 5.0 | 0.25 |
pca train-compare \
--comparison-profile joint-balance \
--run-name v14-cycle003-joint-balance \
--checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--train-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--validation-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.validation.jsonl \
--epochs 1 \
--batch-size 16 \
--learning-rate 0.00001 \
--policy-target-temperature 1.0 \
--device mps \
--seed 0 \
--min-policy-kl-improvement 0.003 \
--min-top1-improvement 0.0 \
--min-value-improvement -0.01 \
--gradient-diagnostics-every-steps 250 \
--resume
採用候補は、Policy KLを0.003より大きく改善し、top-1 agreementを改善し、Value
lossの悪化を0.01以内に抑えたattemptに限定する。
損失別の勾配診断¶
--gradient-diagnostics-every-stepsを有効にすると、各attemptのshared
Transformerに対する重み付け後のPolicy、Value、Auxiliary、Belief
gradientを一定間隔で測定する。V14のgradient-accumulation-steps=4では4
micro-batchを合算するため、実際のoptimizer更新と同じeffective batchに対する診断になる。
結果は次の場所に保存される。
- consoleの
[gradient-diagnostics]行 attempt-*-metrics.jsonのgradient_diagnostics.samplescomparison.mdのShared Transformer gradient diagnostics表- MLflowの
train/gradient_diagnostics/*
判断では、まずvalue_to_policy_norm_ratioなどで大きさを確認し、その後policy_value_cosineなどで方向を見る。比率だけが大きくcosineが正ならloss
weightまたはgradient
normalization、cosineが継続的に負ならPCGrad、AuxiliaryまたはBeliefだけが負ならそのheadからshared
Transformerへ流すgradientの制限を検討する。単一sampleでは決めず、epoch内の複数stepで符号と傾向が再現することを確認する。
勾配クリップ上限の比較¶
clip-threshold profileは、Joint lossのうちPolicy適合が最も良かったValue weight
0.25を固定し、gradient clipだけを比較する。Attempt
Fもgradient診断を有効にして再実行し、過去の診断なしcheckpointとは混ぜない。
| 試行 | 学習目的 | 勾配クリップ | Valueの重み |
|---|---|---|---|
| F | Joint | 5.0 | 0.25 |
| G | Joint | 10.0 | 0.25 |
pca train-compare \
--comparison-profile clip-threshold \
--run-name v14-cycle003-clip-threshold \
--checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--train-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--validation-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.validation.jsonl \
--epochs 1 \
--batch-size 16 \
--learning-rate 0.00001 \
--policy-target-temperature 1.0 \
--gradient-diagnostics-every-steps 250 \
--device mps \
--seed 0 \
--resume
comparison.mdのGradient clipping diagnosticsにはclip発生率、平均scale、clip前後のnormを出す。Clip
10で発生率が十分に下がってもPolicy
KL改善量が増えない場合、慢性的clipは観測上の問題ではあるが、蒸留停滞の主因ではないと判断する。
comparison.mdには各attemptのbest epochと予定optimizer step数も出力する。2 epoch指定でbest
epochが1の場合、2周目ではvalidationが改善しなかったことを示す。comparison.jsonには最終epochのmetricも残るため、bestとの差から過学習を確認できる。
共有backboneの変化量比較¶
backbone-drift
profileはclip=10を固定し、Value悪化がBelief、Auxiliary、またはValue保護不足のどれに由来するかを一括比較する。
| 試行 | 学習目的 | Valueの重み | 目的 |
|---|---|---|---|
| G | Policy + Value + Auxiliary + Belief | 0.25 | 対照群 |
| H | Policy + Value + Auxiliary | 0.25 | Belief勾配を除外 |
| I | Policy + Value | 0.25 | AuxiliaryとBelief勾配を除外 |
| J | Policy + Value + Auxiliary + Belief | 0.50 | Valueによるbackbone保護を強化 |
pca train-compare \
--comparison-profile backbone-drift \
--run-name v14-cycle003-backbone-drift \
--checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--train-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--validation-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.validation.jsonl \
--epochs 1 \
--batch-size 16 \
--learning-rate 0.00001 \
--policy-target-temperature 1.0 \
--gradient-diagnostics-every-steps 0 \
--value-drift-analysis \
--device mps \
--seed 0 \
--resume
全attemptは同じcheckpoint、データ順、seedを使う。HがGより改善すればBelief、IだけがHより改善すればAuxiliary、Jが改善すればValue
weight不足がbackbone driftの主要因と判断する。--value-drift-analysisは各best
checkpointに対してbackbone/value
head交差評価も続けて実行し、comparison.mdのValue backbone drift表へ統合する。
マルチヘッドの重み付け比較¶
multi-head-balance
profileはPolicy、Value、Auxiliary、Beliefの全headを学習対象に残し、ValueとAuxiliaryの相対比、およびBeliefからshared
backboneへ流す勾配だけを比較する。
| 試行 | Valueの重み | Auxの倍率 | Beliefから共有層への倍率 | 目的 |
|---|---|---|---|---|
| K | 0.35 | 1.00 | 1.00 | 現行Aux/Beliefを維持した中間Value weight |
| L | 0.35 | 1.25 | 1.00 | AuxiliaryをValueと同格に強化 |
| M | 0.50 | 1.25 | 1.00 | ValueとAuxiliaryの両方を保護 |
| N | 0.35 | 1.25 | 0.25 | Belief headは通常学習し、backboneへのBelief勾配だけ縮小 |
pca train-compare \
--comparison-profile multi-head-balance \
--run-name v14-cycle003-multi-head-balance \
--checkpoint checkpoints/policy_value_v14_gumbel_iterative_10k_20260714-005806-cycle002_best.pt \
--train-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.train.jsonl \
data/replay/v14-gumbel-iterative-10k/20260714-005806-cycle003-history.jsonl \
--validation-input \
data/selfplay/v14-gumbel-iterative-10k-20260714-005806-cycle003.validation.jsonl \
--epochs 1 \
--batch-size 16 \
--learning-rate 0.00001 \
--policy-target-temperature 1.0 \
--gradient-diagnostics-every-steps 0 \
--min-policy-kl-improvement 0.0 \
--min-top1-improvement 0.0 \
--min-value-improvement -0.01 \
--min-aux-improvement 0.0 \
--min-belief-improvement 0.0 \
--value-drift-analysis \
--device mps \
--seed 0 \
--resume
aux_prize_loss_scaleはAuxiliaryの3つの内訳と未加重validation metricを変えず、total
lossへ加える量だけを変更する。belief_backbone_gradient_scaleもforward値とBelief
head側の勾配を変えず、shared
backboneへ戻る勾配だけを変更する。このため、全headを利用する実運用と同じ出力を維持したままloss間の干渉を比較できる。
V14 cycle001の採用結果¶
v14-cycle001-lr-epochsではattempt B(1e-5、2 epoch、none scheduler)をpromotion
benchmarkへ進めた。V13 cycle010 Championに対して70勝68敗2未完了、完了試合勝率50.72%となり、rule
macro勝率も21.43%から22.32%へ改善した。正式昇格の52%には届かなかったがTraining
Championの50%基準を満たしたため、V14の標準train recipeにはattempt Bを採用する。
V14 cycle003の採用結果¶
Cycle 3の固定train/validationデータを使ったmulti-head-balance比較では、Attempt Mをpromotion
benchmarkへ進めた。設定はepochs=1、gradient-clip-norm=10.0、
value-loss-weight=0.5、aux-prize-loss-scale=1.25、 belief-backbone-gradient-scale=1.0である。
旧Cycle 2 Championとの固定7
deck直接対戦は70勝66敗4未完了で、完了試合勝率は51.47%だった。正式基準52%には届かなかったがTraining基準50%を満たした。Rule-pool
macro勝率はChampionの18.75%から22.32%へ改善し、安定性の非回帰条件も満たした。既定の
criteria-mode=anyによりrule-pool経路で正式昇格したため、Cycle 1で採用した2 epoch
recipeを置き換え、Attempt MをV14の標準train baselineとする。
直接対戦のWilson 95%信頼区間は43.15%から59.71%で50%を含むため、この1回だけで明確な優位性が確定したとは扱わない。今後も各cycleのpromotion gateで非回帰を検証し、必要に応じてseedまたは試合数を増やす。実験条件とデッキ別結果は V14 Cycle 3 Multi-head Balance に記録する。