松田研究室
FindingID: e-5-iter-scaling
Status: stable / task E.5
← Findings Index
Experiment · iter scaling

E.5 iter scaling — 10k で 96.7% 品質、kerbl_exp_decay artifact で non-monotonic

max_steps = 10k / 15k / 20k / 25k / 30k で lego sh3 を bench。10k で PSNR 24.007 dB (30k baseline 24.834 mean 比 -0.83 dB、wallclock 1/3.4)。ただし kerbl_exp_decay が max_steps の関数なので、各 run で lr schedule が異なり PSNR が non-monotonic。モバイル含意は「10k iter で十分」だが lr schedule 設計には改善余地。

mixedrank: midpartial第 3 軸phase-5e-5iter-scalinglr-schedulekerbl-exp-decaymobile
Δ PSNR
+0.000 〜 -0.966 dB (mean -0.41 dB from 30k baseline)
Δ Wallclock
-70% 〜 -18% (iter 数に比例)
Impact
10k iter で PSNR 24.007 dB を達成、30k baseline (mean 24.834) の 96.7% 品質、wallclock 1/3.4。15k → 23.932、20k → 23.868、25k → 24.623 と non-monotonic で kerbl_exp_decay lr schedule の max_steps 依存性 artifact が混入。卒論モバイル含意では「10k iter で十分、追加 iter は variance noise」と言える反面、E.5 として「fair な iter scaling 比較には固定 schedule での checkpoint 取得が必要」と spec 化が必要。
01

本文

収益逓減 plateau の特定 目的で max_steps を 10k / 15k / 20k / 25k で bench、30k baseline と比較。10k で 30k の 96.7% 品質、しかし 15k → 20k で PSNR が漸減し 25k で回復する non-monotonic curve、原因は kerbl_exp_decay lr schedule が max_steps の関数 (= 各 run で lr profile が異なる) という設計 artifact。

実施日
2026-05-23 Phase D (bench chain Phase D)
config
configs/2026-05-23-1000-lego-iter{10000,15000,20000,25000}.toml
seed
42 固定
比較対象
lego-sh3-30k baseline (mean PSNR 24.834 / wallclock 22m18s)

実測値

max_stepsPSNR (dB)wallclockΔ PSNR vs 30kΔ wall %品質達成率
10k**24.007**6m40s (400s)-0.827-70.3%**96.7%**
15k23.93210m32s (632s)-0.902-53.0%96.4%
20k**23.868**14m09s (849s)-0.966-36.9%96.1%
25k24.62318m19s (1099s)-0.211-18.3%99.2%
30k baseline (mean)24.83422m18s (1345s)00100.0%
non-monotonic curve: 10k → 15k → 20k で PSNR 漸減、25k で大幅回復、30k baseline でさらに微増。

non-monotonic の原因 — kerbl_exp_decay lr schedule artifact

本実装の lr schedule は kerbl_exp_decay with final_factor=0.01:

lr(iter) = lr_initial * (final_factor)^(iter / max_steps)
        = lr_initial * 0.01^(iter / max_steps)

つまり 同じ iter (例: iter=10000) でも:

  • 10k run: iter=10000 = max → lr = lr_initial × 0.01 (最終 lr、ほぼ凍結)
  • 15k run: iter=10000 → lr = lr_initial × 0.01^(2/3) ≈ lr_initial × 0.046
  • 20k run: iter=10000 → lr = lr_initial × 0.01^(1/2) = lr_initial × 0.1
  • 25k run: iter=10000 → lr = lr_initial × 0.01^(2/5) ≈ lr_initial × 0.158
  • 30k run: iter=10000 → lr = lr_initial × 0.01^(1/3) ≈ lr_initial × 0.215

つまり「max_steps を変える bench」は 同じ iter での lr が異なる学習を比較していて、純粋な iter scaling 比較になっていない。15-20k run で PSNR が低いのは「中盤で lr が小さくなり過ぎ、後半の refine / Adam update が learning rate 不足になる」と解釈可能。

正しい E.5 設計 (defer)

  1. 固定 schedule + checkpoint eval: 30k run の途中で 10k/15k/20k/25k の checkpoint を保存し、eval する (current trainer は checkpoint output 機能なし、要実装)
  2. 変動 schedule + 比較: 現実装の挙動として「max_steps 短いほど早く lr 減衰、学習不足」を documented finding にする (本 finding がそれ)
  3. cosine schedule に置換: cosine annealing なら final_factor 依存性が弱い、別 schedule の比較も possible

モバイル含意

non-monotonic はあるが、10k iter で 30k 品質の 96.7%を達成している事実は重要。

  • モバイル時短候補: 10k iter で打ち切りすれば wallclock 1/3.4、品質損失は variance σ ±0.32 dB の 2.5x (実用上 marginal)
  • 「30k 必要」という従来の慣習は overkill、本実装では 10k で十分実用
  • ただし brush SoTA (35+ dB) を狙うなら 30k+ + 別 schedule + 別 trainer recipe が必要 — 本実装の plateau は trainer recipe の immaturity と coupling

卒論への含意

Chapter モバイル章で「iter 10k で 96.7% 品質達成、wallclock 1/3.4」を strong claim。同時に E.5 design artifact (lr schedule の max_steps 依存) を honest に脚注で記述し、「真の iter scaling 比較には固定 schedule での checkpoint eval が必要」と future work で言及。

Lesson

Bench 設計時は "変えたいパラメータ以外を固定" が原則。今回 max_steps を変えたが、lr schedule も同時に変わってしまい純粋な iter scaling になっていない。Bench config を書く前に「制御変数 vs 共変変数」を明示的に洗い出す手順を運用に組み込むべき。

関連

  • A.10 variance baseline (有意性 noise floor): a-10-variance-baseline
  • E.6 capacity scaling (同 phase chain で実施): e-6-capacity-scaling
  • A.4 NeRF Synthetic multi-scene (シーン依存性): a-4-nerf-synthetic-scene-results
  • A.5 final ablation 表: final-ablation-table
02

関連する run

この finding が観測された / 言及している実験 run。

03

関連 finding

© 2026 大竹律輝 — 松田研究室