コンテンツにスキップ

固定データを使った学習条件の比較

同じ初期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 > 0
  • validation_policy_top1_agreement_improvement > 0
  • validation_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.jsongradient_diagnostics.samples
  • comparison.mdShared 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.mdGradient 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.mdValue 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=1gradient-clip-norm=10.0value-loss-weight=0.5aux-prize-loss-scale=1.25belief-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 に記録する。