# Grokking runs on a dose, not a clock
1. What this paper does
Paper rcs_ppr_82tyb8mb8x2s70v8mk27 reported
t_gen = 850.5 * lr^-1 * wd^-1 * train_frac^-4 * p^-2
with four declared integer exponents and one fitted constant, placing 94.0% of 369 runs within a factor of two on a hold-out sealed before its search began. Rearranged as t_gen * lr * wd = f(task), it claimed the total multiplicative weight-decay shrinkage delivered by the moment of generalisation is set by the task alone.
Its §7 named two experiments that would refute that reading. We ran both, each hand-written, hash-frozen with predictions recorded before execution, and with no model in the loop. One refutes the exact form. The other confirms the mechanism. Neither was reachable by the search that produced the law, and we show why that is structural.
2. Test one: the iso-dose grid. The exact form is REFUTED
Every run in the original corpus varied lr and wd independently. That can confirm a product law's fit and can never separate "depends on the product" from "depends on both with coincidentally equal exponents". Only a grid holding the product fixed can.
Two iso-dose curves (D = 7.0e-4, 1.4e-3), lr swept over a decade with wd = D/lr, at p=53, train_frac=0.48, width=128, emb=64, three seeds, both architectures. The test collapses to one number: the dose reading predicts slope 0; a rival t ~ lr^-a wd^-b predicts slope b-a.
Thresholds measured, not guessed: pooled within-configuration seed sd of log10(t_gen) over 333 corpus configurations is 0.0813, giving expected slope SE 0.031. Three outcomes pre-registered (REFUTED / SUPPORTED / INCONCLUSIVE) with an equivalence band of +/-0.10 and a censoring abort at 20%. Frozen at cb4390b43385e891....
66/66 runs, 22/22 configurations at 3/3 seeds, 0 censored.
POOLED (primary) slope -0.1070 SE 0.0315 95% CI [-0.169, -0.045] n=22
dose 7.0e-4 mlp +0.1013 SE 0.0429 CI [ 0.017, 0.185]
dose 7.0e-4 transformer -0.1539 SE 0.0392 CI [-0.231, -0.077]
dose 1.4e-3 mlp -0.1180 SE 0.1942 CI [-0.499, 0.263]
dose 1.4e-3 transformer -0.1648 SE 0.0417 CI [-0.247, -0.083]
The CI excludes zero: REFUTED. Secondary - doubling the dose should halve t_gen exactly - measured 1.825 against 2.000.
The accumulating quantity is therefore not exactly lr*wd*t; the exponents differ by about 0.107, roughly lr^-1.05 wd^-0.95. That residual is far too small to disturb a factor-of-two tolerance, which is why the original corpus could not detect it and why the sealed-vault score is unaffected.
A claim from the original paper that we retract. It offered "transfers across architectures without modification" as evidence for a mechanism carrying no architectural term. On the 7.0e-4 line the architectures deviate in opposite directions (+0.101 mlp, -0.154 transformer) and pool to -0.026 with a CI spanning zero. Part of the apparent architecture-independence is cancellation in a mixed corpus. The transformer's -0.15 replicates across both dose lines with tight CIs; the mlp flips sign and we assert no direction for it.
3. Test two: the schedule grid. The mechanism is CONFIRMED
Test one says the exponents are unequal. It says nothing about whether an accumulated dose is the governing quantity at all. This grid answers that, and separates the alternatives by a factor of two rather than by a tenth of an exponent.
Three weight-decay schedules deliver an identical total dose over horizon H=8000 and differ only in timing: constant (wd=W throughout), front (2W for t<H, then 0), back (0 for t<H, then 2W). Same cell, lr=0.001, W=0.7, three seeds, both architectures. Weight decay is written into the optimiser's param group each step, so Adam's moment estimates are untouched and the schedule is the only difference.
dose predicts time predicts
constant 8148 8148
front 4074 8148
back 12074 8148
Frozen at 8755ebca5e68a56c..., predictions recorded before execution.
arm n predicted geo-mean t_gen ratio to prediction
constant 6/6 8148 7625 0.936
front 6/6 4074 3886 0.954
back 5/6 12074 11431 0.947
front / constant = 0.510 95% CI [0.412, 0.630] dose 0.500, time 1.000
back / constant = 1.499 95% CI [1.213, 1.853] dose 1.482, time 1.000
Both intervals exclude the elapsed-time prediction of 1.000; both contain the dose prediction almost exactly. All three arms land within 6.4% of numbers fixed before any run executed. Per architecture, closer still: constant 7513/7738, front 3908/3865, back 11419/11450 (mlp/transformer).
Withholding weight decay for 8000 steps delays generalisation by very nearly 8000 steps. Delivering the same decay in half the time halves the wait. Grokking on this task family is governed by accumulated decay, not by elapsed time.
One back/transformer run never grokked inside the 30,000-step budget (5/6, above the pre-registered 4/6 threshold). The back arm's expected t_gen is closest to the cap, so it is the arm most exposed to censoring and should be read with that in mind.
4. The two tests together
They are not in conflict. The mechanism is right and the parameterisation is slightly off:
- Confirmed. Generalisation arrives when a quantity accumulating with applied weight decay crosses a threshold. Tested against a factor-of-two alternative and confirmed to within 6%.
- Refined. That quantity is not exactly
lr*wd*t. Along an iso-dose curve t_gen still varies as lr^-0.107.
The original paper's headline hold-out number is unaffected by either result.
5. Neither test was proposable by the search that found the law
The law came from 222 pre-registered rounds proposing 1,848 individual candidate laws, each shown the previous round's miss pattern. Not one proposed either grid above.
That is structural, not an oversight. The proposer's objective is held-out fit on a grid it also designs. A grid that holds lr*wd fixed reduces variance in the very feature the law scores on, making it a strictly worse grid by the proposer's own criterion. A search rewarded for fit will not construct the experiment that separates its winner from its rivals, because separation and fit are different objectives and only one is scored.
Both tests here cost zero model spend and a few hours of CPU, against the $497 the search cost.
6. What the search actually bought
With the vault opened, every round's discovered exponent vector can be scored against it retrospectively - refit the scale on the working pool, score on the vault. Free, and impossible to do during the run.
| working-pool err | vault median err | vault in-tolerance |
|---|
| round 8 | 0.0944 | 0.0880 | 94.9% |
| round 42 | 0.0747 | 0.0876 | 95.4% |
Best vault error over rounds 1-10: 0.0792. Over rounds 11-114: 0.0784.
rounds 1-10 $24 -> vault err 0.0792
rounds 11-114 $252 -> vault err 0.0784 improvement: 0.0008
The working-pool statistic improved 21% while the held-out statistic moved 0.5%. Essentially all apparent progress after round ~10 was overfitting to the working pool.
Why it was undetectable at the time, and the fix. The loop cannot see the vault - that is what makes the vault worth anything. The operator cannot either, because a hold-out read repeatedly stops being one. Every instrument capable of detecting the saturation was forbidden to whoever could act on it. That blind spot, not the absence of a stopping rule, is the defect. The fix is a third split: seal a monitor (~15%) read every 10 rounds and deliberately burnable, alongside the vault (~30%) read once. The monitor is never published; its only job is to say whether the held-out number has stopped moving. On this programme the flat line was visible by round ~20.
7. Limitations
- One task family (modular addition), two architectures, full-batch AdamW, a 30,000-step budget.
- We claim the iso-dose slope is reliably non-zero, not that -0.107 is a precise estimate of the exponent gap. The mlp arm is genuinely ambiguous and we do not resolve it.
- The back arm sits closest to the step cap and lost one run to it.
- A corpus defect discovered during this work. 63 of 1,628 cache entries in the original corpus are crashed processes that a caching bug wrote as permanent results. No fit is corrupted - the loader skips them - but they are strongly non-random: mean p 66.2 vs 39.1, mean width 190 vs 126, 86% transformer vs 33%. Crashes hit memory-hungry configurations, leaving a systematic hole at large p and width on transformers - the same region where the iso-dose test found the transformer's -0.15 slope. This is on top of the adaptive-sampling caveat in the original.
- The retrospective per-round vault scoring re-uses one vault across 114 comparisons. It is a legitimate post-hoc audit of a finished programme, not a fresh hold-out, and could not be used to select among those rounds.
- Cost figures use a list-price meter, not provider billing. Ratios between rounds are exact; absolute dollars are approximate.
8. Verification
ISO-DOSE, protocol cb4390b43385e891, frozen 2026-08-17T12:29:52Z
66/66 runs, 22 configurations, 0 censored
dose arch lr wd n predicted median ratio
7.00e-4 mlp 0.0003 2.33333 3/3 8148 9000 1.105
7.00e-4 transformer 0.0003 2.33333 3/3 8148 10800 1.325
7.00e-4 mlp 0.0005 1.4 3/3 8148 7300 0.896
7.00e-4 transformer 0.0005 1.4 3/3 8148 9200 1.129
7.00e-4 mlp 0.0008 0.875 3/3 8148 7100 0.871
7.00e-4 transformer 0.0008 0.875 3/3 8148 7700 0.945
7.00e-4 mlp 0.0012 0.583333 3/3 8148 8500 1.043
7.00e-4 transformer 0.0012 0.583333 3/3 8148 8200 1.006
7.00e-4 mlp 0.002 0.35 3/3 8148 8500 1.043
7.00e-4 transformer 0.002 0.35 3/3 8148 7300 0.896
7.00e-4 mlp 0.003 0.233333 3/3 8148 8400 1.031
7.00e-4 transformer 0.003 0.233333 3/3 8148 6700 0.822
1.40e-3 mlp 0.0005 2.8 3/3 4074 5200 1.276
1.40e-3 transformer 0.0005 2.8 3/3 4074 4600 1.129
1.40e-3 mlp 0.0008 1.75 3/3 4074 3800 0.933
1.40e-3 transformer 0.0008 1.75 3/3 4074 4500 1.105
1.40e-3 mlp 0.0012 1.16667 3/3 4074 3900 0.957
1.40e-3 transformer 0.0012 1.16667 3/3 4074 3600 0.884
1.40e-3 mlp 0.002 0.7 3/3 4074 4200 1.031
1.40e-3 transformer 0.002 0.7 3/3 4074 3700 0.908
1.40e-3 mlp 0.003 0.466667 3/3 4074 4000 0.982
1.40e-3 transformer 0.003 0.466667 3/3 4074 3200 0.785
SCHEDULE, protocol 8755ebca5e68a56c, frozen 2026-08-17T22:41:25Z
18/18 runs; wd written into the optimiser param group each step, H = 8000
schedule arch seed t_gen
constant mlp 0 9500
constant mlp 1 6200
constant mlp 2 7200
constant transformer 0 7500
constant transformer 1 7100
constant transformer 2 8700
front mlp 0 4500
front mlp 1 3400
front mlp 2 3900
front transformer 0 3900
front transformer 1 3700
front transformer 2 4000
back mlp 0 12100
back mlp 1 10700
back mlp 2 11500
back transformer 0 NEVER GROKKED
back transformer 1 11400
back transformer 2 11500
Experimental details: modular addition over all p^2 pairs with a random train/test split; an attention-free MLP (embedding, concatenate, hidden, logits) and a single-head transformer over the two tokens with a readout; full-batch AdamW, deterministic given (config, seed); evaluation every 100 steps; t_gen is the first evaluation at which test accuracy reaches 0.9 and holds it for 500 steps; a run that never reaches it records null.