Key takeaways
- The received belief and the artifact behind it. Small batches are
thought to destabilize language-model training, which is why gradient
accumulation is standard. Practitioners do commonly lower the learning rate
for a smaller batch — and hold everything else,
beta_2included, at its default. That last part is the bug. - The fix is a change of variable, and it is the paper’s whole content.
Express Adam’s decay rates as half-lives measured in tokens:
t_half = B · ln(2)/ln(1/beta). Holding the second moment’s half-lifet_2fixed while the batch size changes — rather than holdingbeta_2fixed — makes training stable all the way down to batch size one. Scaling down fromBtoB'meansbeta_2' = beta_2^(B'/B). beta_1’s default is fine. The commonly used first-moment value works across batch sizes; it is specificallybeta_2that has to move, and holding it fixed is what breaks small batches.- Small batches are more robust, not merely viable. At batch size 1, SGD, Adafactor, Adam and Muon all reach similar loss; the gap between optimizers opens up as the batch grows. The loss surface over hyperparameters is much flatter at small batch, so less tuning is needed.
- Vanilla SGD, no momentum, no optimizer state, batch size 1 matches the AdamW configuration from GPT-3 on a 1.3B model. Adam and Adafactor at batch size 1 beat that baseline.
- The square-root learning-rate rule overshoots. Scaling the batch from 1 to 1024, the rule asks for 32×; about 3× worked better.
- The recommendation for
B: the smallest batch that still maximizes throughput (or MFU) — in practice at least a few hundred tokens per device, raised if a second-order optimizer’s per-step overhead starts to bite. - Against gradient accumulation except when training across devices with multiple replicas bottlenecked on interconnect bandwidth. Accumulation costs memory for the accumulated gradient and forgoes optimizer steps.
- Holds in fine-tuning too: a Gemma 3 4B fine-tune at batch size 1 with the half-life rule, with LoRA and full fine-tuning compared at matched memory.
Standing in the anthology
It answers a question the record’s batch-size material never asks. Every practice the record holds on this topic is about how large a batch may usefully be — SOTA-097’s exponent, SOTA-062’s heuristic, SOTA-198’s noise scale, SOTA-093’s ramp. All of them take for granted that bigger is what you want and the only question is how much you can afford. This says the useful target is the smallest batch that saturates the hardware, and that the case against small batches was a hyperparameter artifact.
That is compatible with the critical-batch-size line rather than opposed to
it: B_crit is a ceiling above which parallelism stops paying, and this is
an argument about where to sit below it. The two together give a range with a
reason at each end.
The half-life reparameterization deserves to outlive the recommendation.
beta_2 = 0.95 is a number the field copies without a unit attached; what it
means depends on the batch size, and nobody says so. Expressing the moment
decay in tokens gives the constant a unit and makes it transferable, which is
the same move LIT-443 makes for weight decay via the AdamW timescale.
Two papers, two hyperparameters, one lesson: the number people copy is a
ratio whose denominator was left implicit.
What it does not establish. Everything at the interesting end is small — 30M for the optimizer sweeps, 124M and 1.3B for the scale checks, and the 1.3B run is under-trained at roughly 10 tokens per parameter. Nothing here says batch size one is workable when the model must be sharded across many devices, where the batch is not a free choice.