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 設計には改善余地。
収益逓減 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。
| max_steps | PSNR (dB) | wallclock | Δ PSNR vs 30k | Δ wall % | 品質達成率 |
|---|---|---|---|---|---|
| 10k | **24.007** | 6m40s (400s) | -0.827 | -70.3% | **96.7%** |
| 15k | 23.932 | 10m32s (632s) | -0.902 | -53.0% | 96.4% |
| 20k | **23.868** | 14m09s (849s) | -0.966 | -36.9% | 96.1% |
| 25k | 24.623 | 18m19s (1099s) | -0.211 | -18.3% | 99.2% |
| 30k baseline (mean) | 24.834 | 22m18s (1345s) | 0 | 0 | 100.0% |
本実装の 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) でも:
つまり「max_steps を変える bench」は 同じ iter での lr が異なる学習を比較していて、純粋な iter scaling 比較になっていない。15-20k run で PSNR が低いのは「中盤で lr が小さくなり過ぎ、後半の refine / Adam update が learning rate 不足になる」と解釈可能。
non-monotonic はあるが、10k iter で 30k 品質の 96.7%を達成している事実は重要。
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 で言及。
Bench 設計時は "変えたいパラメータ以外を固定" が原則。今回 max_steps を変えたが、lr schedule も同時に変わってしまい純粋な iter scaling になっていない。Bench config を書く前に「制御変数 vs 共変変数」を明示的に洗い出す手順を運用に組み込むべき。
a-10-variance-baselinee-6-capacity-scalinga-4-nerf-synthetic-scene-resultsfinal-ablation-tableこの finding が観測された / 言及している実験 run。