"Just rerun it with the same hyperparameters" sounds like it should be enough to reproduce a result. It isn't — because a hyperparameter file only ever records the settings someone remembered to write down, and a training run depends on more than that.
lr=1, gradients=2, 1, 3 — identical for every seed. Final weight: 7
Every seed gets the exact same learning rate, the exact same gradient schedule, the exact same starting weight. Only the seed changes — and the final weight changes with it.
A training run's outcome is a function of everything that fed into it — not just the hyperparameters that happen to live in a config file:
- — the weight a training run actually ends up with.
- — the training process itself, treated as a function of everything that feeds into it.
- — the learning rate.
- — the sequence of gradients computed during training.
- — the starting weight, before any training steps.
- — the random seed governing every source of stochasticity in the run.
- A reproducibility claim is only as strong as its inputs
"Reproducible" means every argument to is pinned down, not just the ones that happen to live in a config file.
- Logging hyperparameters without the seed isn't reproducibility
Log , , and but not , and "same config" silently means "one of many possible outcomes" instead of "this exact outcome."
seed 1
lr = 1
gradients = [2, 1, 3]
final weight = 7
seed 2
lr = 1
gradients = [2, 1, 3]
final weight = 2
Same lr, same gradient schedule, same starting weight — printed on both cards, character for character. The only difference between the two runs is a single integer neither card would show you unless someone thought to log it.
- Seed 1's noise sequence: -1, -2, 0
- Seed 2's noise sequence: -1, 1, 2 — same lr, same gradients
- — identical so far
- — already diverged
- Two final weights, one logged config
7 versus 2. A config file listing only lr=1 and the gradient schedule describes both runs equally well — and neither one exactly.
A logged experiment reports lr=1, the same gradient schedule, and a final weight of 8 — but the seed wasn't recorded. Find the seed that reproduces it.
Nothing here is exotic randomness — it's a plain linear congruential generator, the same kind of determinism a real training run's data shuffling, dropout masks, and weight initialization all rely on. The lesson isn't "randomness is bad," it's that reproducibility is only as complete as the list of things an experiment tracker actually captures. Seeds are the obvious member of that list; real pipelines also need the library versions, hardware, and data snapshot pinned down, for exactly the same reason. The next chapter turns to what happens when the data a deployed model sees drifts away from what it was trained on.