One Part Carries the Learning
Ongoing research. This is an experimental result from active work, not a settled conclusion. The numbers are what we measured and the method is described so you can judge it, but the programme is still running and later experiments may revise what it means.
A note on the language in these records. This is a working laboratory notebook for research into training AI models more cheaply and efficiently, so you will read that an approach did not work, that a result did not hold up, or that one method was worse than another. That is the research doing its job, not a verdict on the engineering we deliver to clients. Ruling an approach out is how the search narrows, and these are the pages that teach us the most: nearly every technique we now rely on came from understanding why something else fell short. Testing our own ideas at least as hard as anyone else's is the point of publishing them. More about this programme and why we run it.
Part of a bigger question: Which parts of a model actually matter? – The parts that move most are not the parts that matter, and no single component is required -- the model routes around every freeze. What a part is worth shows up only when you remove it.
In plain English
What we asked. Which parts of a model are doing the learning? A common way to guess is to watch which parts change most during training. We tested that guess directly: we froze each of nine parts of a small model in turn, for one stretch of training at a time, and measured how much worse the whole run ended up.
What we found. One part dominates. The memory weights of the gate that decides what new content goes into the model's state carry most of the learning: freeze them early and the run is about ten times worse than freezing anything else. Watching which parts change most would have told us nothing: the part that changes most early on is one whose freezing actually helps.
Why it matters. Two lessons. To find what matters in a model, remove things and measure, rather than watching what moves. And one unexpected lead: holding one particular part still for the first few dozen steps made training slightly better, a free speed-up we will now test properly against the usual checks before calling it one.
The rest of this page is the technical record: the design, every number, and the limits. It is written for a reviewer, and you do not need it to have understood the result above.
New here? How to read a research record
- Start at the verdict. Every record states, before the experiment was run, what result would have made us abandon the idea. That is the "kill test". Then it says whether the test fired. Nothing gets reinterpreted after the fact.
- Numbers in square brackets are uncertainty.
23.4 [18.1, 28.7]means our best estimate is 23.4 and the true value is probably somewhere in that range. If a range includes zero, we cannot claim an effect. - Results that rule an idea out are kept. Roughly half of what is published here says an approach did not work, including plenty of our own. Those pages are the output, not a shortfall: knowing which direction is a dead end is what lets the next experiment go somewhere better, and most of what we now rely on came out of understanding why something else fell short. Work that only publishes what worked is not measuring anything.
- Read the Limits section. Every record ends with what it does not show. It is the most honest part of any experiment and usually the shortest.
- Pro tip: the figures near the top are designed to carry the result on their own. If you read nothing else, read the caption under each one, which says what it shows and what to take from it.
EXPLORATORY. Not a preregistered study. Local CPU, six seeds, 330 runs. Operationalised and committed (45a2697) before any run.
Program v2 Bucket O, item O4. Decisive computation: . Output: analysis/load_bearing_map.py. Reproduce with analysis/load_bearing_map.jsonpython analysis/load_bearing_map.py (about an hour on a throttled laptop CPU); --reuse re-derives every endpoint from the saved curves.
The question
Program v1 drew heat maps of which component's representation changed. Three records since -- G4, J3, K5 -- found that the component that moves most is repeatedly not the one whose removal hurts most. O4 draws the causal map instead: rows are components, columns are phases of training, and each cell is how much worse the run ends up if that component is not allowed to update during that phase.
The ablation, exactly: a hard freeze -- the component's parameters are restored after each optimiser step in the window, so it does not move at all. Deliberately not D5's zeroed gradient, which AdamW's momentum keeps moving (K3 found the two differ by 3x).
Components of the house GRU (width 48, delayed copy, lag 4, 400 steps): the embedding; the input-to-hidden and hidden-to-hidden weights of each gate (reset, update, candidate); the recurrent biases; and the readout. Phases: steps 1-50 to 301-400; the control transitions at 86.7, inside M3's band (the anchor, passed). Damage: mean held-out error over the whole run, frozen minus control, paired by seed.
Kill test, fixed before execution: damage is uniform across components at every phase.
Prior recorded in advance: moderate that a map exists and that it disagrees with movement.
Result: the kill test does not fire -- there is a map, and one row dominates it
Damage, in points of mean held-out error over the run (frozen minus control):
| Component | 1-50 | 51-100 | 101-150 | 151-200 | 201-300 | 301-400 |
|---|---|---|---|---|---|---|
| embedding | +0.20 | +0.19 | +0.08 | +0.02 | +0.01 | -0.01 |
| input, reset gate | +1.28 | +0.15 | +0.02 | +0.01 | +0.01 | -0.01 |
| input, update gate | -0.92 | +0.43 | +0.24 | +0.05 | +0.02 | -0.03 |
| input, candidate | +0.54 | +2.47 | +0.58 | +0.08 | -0.01 | -0.11 |
| hidden, reset gate | +0.20 | +0.09 | +0.02 | +0.01 | +0.02 | +0.00 |
| hidden, update gate | -1.80 | +0.13 | +0.25 | +0.10 | +0.09 | +0.01 |
| hidden, candidate | +13.81 | +4.88 | +1.51 | +0.37 | +0.23 | -0.01 |
| biases | -0.42 | +0.34 | +0.09 | +0.01 | -0.00 | -0.01 |
| readout | +1.43 | +1.02 | +0.37 | +0.12 | +0.08 | -0.01 |
In every phase the most damaging component exceeds the least damaging with a paired interval excluding zero (+15.6 points in the first phase, +0.13 in the last).
The candidate gate's hidden-to-hidden weights carry the learning. Freezing them for the first fifty steps costs 13.8 points of mean error [12.2, 15.4] -- ten times the next component -- and they are the most damaging component in every phase up to step 300. That is the recurrence that decides what the new state contains. The map is concentrated where it should be: around and before the transition at step 87, fading to nothing by the end.
Movement cannot see it
Within each phase, the rank correlation between how far a component moved in the control run and how much freezing it hurt:
| Phase | 1-50 | 51-100 | 101-150 | 151-200 | 201-300 | 301-400 |
|---|---|---|---|---|---|---|
| movement vs damage | -0.27 | -0.23 | +0.15 | -0.02 | +0.07 | +0.17 |
Zero, or slightly negative, everywhere. A map drawn by magnitude would have been a different map. The sharpest case: in the first fifty steps the most-moved component is the biases (relative change 1.81), and freezing them helps. G4, J3 and K5 found this trap by accident; here it is measured on every component in every phase at once.
A lead nobody asked for: freezing the update gate early helps
Three cells in the first phase are negative with intervals excluding zero: freezing the update gate's hidden weights (-1.80 [-2.47, -1.13]), its input weights (-0.92 [-1.23, -0.61]), or the biases (-0.42 [-0.72, -0.12]) for the first fifty steps makes the run better. Early in training the update gate's movement is counterproductive: holding it still lets the candidate path, which carries the learning, get on with it.
That is a free manoeuvre, and this programme has rules for manoeuvres. Before it can be called a saving it needs a random-time-matched window, a check that the gain survives on a second task (R1's exposure), and pricing in steps to a criterion rather than mean error. That is O10.
What stands
- The kill test does not fire. A causal load-bearing map exists at every phase.
- One component dominates: the candidate gate's hidden-to-hidden weights,
13.8points early and the largest cell through step300. - Movement does not predict the map (rank correlation
-0.27to+0.17); the most-moved component early is the one whose freezing helps. - Freezing the update gate early helps, by
1.8points of mean error -- a lead for O10, not yet a saving.
Limits
- One task, one width, one freeze length (50-100 steps). The map is stated for the house task, whose single-task exposure R1 counted; O10 carries the second task.
- Mean error over the run blends timing and final accuracy; the early-freeze gain in particular needs pricing in steps to the criterion.
- Nine components is a coarse partition. Within the candidate gate's hidden weights, which units carry the load is not resolved here.
Terms on this page
Every piece of vocabulary this record uses, in plain language. Generated from the text above, so it cannot drift out of step with it.
- ablation
- Removing or disabling one part of a model, or holding it still, to measure what it was contributing. The causal alternative to just watching what changes.
- accuracy
- The fraction of answers a model gets right on questions it was not trained on.
- AdamW
- A widely used training algorithm that adapts how big a step it takes for each individual parameter. The default in most modern AI training.
- freezing
- Stopping one part of a model from changing while the rest carries on learning. A way of asking what that part contributes, by taking it away.
- gradient
- The direction and amount by which each of a model's internal numbers should change to do slightly better. Training is repeatedly following it.
- GRU
- Gated Recurrent Unit. A compact design for processing sequences one item at a time, with internal switches controlling what it keeps in memory.
- held-out
- Data the model was never trained on, kept back specifically to test it. Scoring a model on data it has already seen measures memorisation, not learning.
- kill test
- A condition written down before running the experiment that says what result would make us abandon the idea. Fixing it in advance is what stops a disappointing result being reinterpreted as an encouraging one.
- momentum
- Keeping part of each previous training step in the next one, so training keeps moving in a consistent direction instead of zig-zagging.
- parameters
- The adjustable numbers inside a model. Training is the process of setting them. Model size is usually quoted as a count of these.
- rank
- How many independent directions a set of numbers really uses. A low-rank structure is one that looks high-dimensional but is actually simple underneath.
- recurrent
- A design that reads a sequence one item at a time, carrying memory forward. The main alternative is attention, which looks at everything at once.
- seed
- The number that fixes all the randomness in a training run. Same seed, same run. Running several seeds is how you tell a real effect from a lucky one.
- width
- How many internal numbers a model uses at each layer. The usual way we vary model size in these experiments.
Get new results as we publish them
Roughly monthly, one finding per email, in plain English first. Including the approaches that turned out not to work, which are usually the useful ones. No sales email.
Double opt-in: we send a confirmation link and add nobody who does not click it. One-click unsubscribe on every email.