The learning rate $\alpha_t$ converts an optimizer's direction into an update magnitude. A constant value asks for the same base scale throughout training, even though early optimizer state is immature and late training often benefits from smaller refinements. A schedule makes this time dependence explicit and reproducible.
For $W$ warmup updates and target rate $\alpha_{\max}$, linear warmup can use $\alpha_t=\alpha_{\max}t/W$ for $0\le t\le W$. The rate begins near zero and reaches $\alpha_{\max}$ at update $W$. Warmup limits early parameter movement, but it is not a proof of stability; an excessive target rate can still fail as soon as warmup reaches it.
After warmup, let training end at update $T$ with floor $\alpha_{\min}$. Cosine decay is $\alpha_t=\alpha_{\min}+\tfrac12(\alpha_{\max}-\alpha_{\min})[1+\cos(\pi(t-W)/(T-W))]$ for $W\le t\le T$. It starts at $\alpha_{\max}$, ends at $\alpha_{\min}$, and changes smoothly with zero slope at both ends of the decay interval.
The schedule is indexed by optimizer updates, not examples or backward calls. With gradient accumulation over $K$ microbatches, advance $t$ once after all $K$ gradients have been combined and one parameter update occurs. In distributed training, changing worker count or batch size changes examples processed per update, so preserving the same update schedule does not preserve the same sample schedule.
Warmup length, peak rate, floor rate, and total updates interact. Increasing $W$ reduces the early area under the learning-rate curve. Extending $T$ adds more optimization and changes cumulative effects such as decoupled weight decay. A schedule copied to a run with a different number of updates is therefore a different experiment, even if the peak rate is unchanged.
Store the scheduler step with the optimizer checkpoint and define whether update zero uses zero, one warmup increment, or another explicit value. On resume, verify the next learning rate against a closed-form calculation. Plot learning rate against both optimizer updates and processed training units; these two views reveal off-by-one errors, accidental per-microbatch stepping, and schedule drift after changing batch configuration.