The Habit It Did Not Need
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. More about this programme.
In plain English
What we asked. Earlier we found that this model's answers, early in training, look like a simple wrong habit: repeat the word immediately before. Later they look like the correct rule instead. That was only ever an observation about resemblance, though, and resemblance is cheap. The real question is whether the habit is a stage the model has to go through, or just something its answers happen to look like on the way past.
What we found. So we took the habit away, by making it impossible for the model to be rewarded for repeating the previous word during the early part of training. It barely noticed. The delay is small enough that it might be nothing at all, and it is one of the cheapest interventions we tried. Pushing the model harder *towards* the habit costs three times as much as taking it away. So the habit is a resemblance, not a stage.
Why it matters. The comparisons turned out to be worth more than the result. To be sure that removing the habit specifically was what mattered, we repeated the same removal for every other earlier position, one at a time. Those costs fall into clean pairs, and the pairing follows the repeating structure of the exercise rather than how far back the word sits. Two consequences we did not expect: taking away a word that holds no part of the current answer can cost twice as much as taking away the word that *is* the answer, because the model has a second copy of the answer to fall back on; and one particular removal makes the model learn faster, because it no longer has to work out that the word is a distraction. If you want one transferable idea from this page, it is that our comparison arm stopped being a formality and became the finding.
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. - Negative results are kept. Roughly half of what is published here says an idea did not work, including several of our own. Those pages are not failures, they are the output. 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, 60 training runs (24 more discarded with the first control design), no GPU, no cost.
Program v2 Bucket N, item N4. Decisive computation: . Output: analysis/block_the_wrong_algorithm.py. Reproduce with analysis/block_the_wrong_algorithm.jsonpython analysis/block_the_wrong_algorithm.py, or re-derive every endpoint with --reuse.
The question
M2 found a GRU's output resembles cache-1, "repeat the previous token": early in training, and cache-3, which is correct, from about a quarter of the way through, identically in 5/5 seeds. That is a correlation between two curves. The model might be passing through the wrong algorithm on the way to the right one, in which case blocking it should cost something.
Kill test, fixed in advance: removing the resemblance changes nothing about when the transition happens.
Two things the reduced-scale run settled before any conclusion was drawn
The obvious sign is backwards. A constant is added to a token's logit before the loss is taken. The intuitive reading, subtract to suppress: does the opposite, because the model minimises loss by cancelling whatever offset it is handed: subtracting teaches it to push that token up (peak resemblance 0.3285 against an untouched 0.3269, i.e. nothing), and adding teaches it to push the token down (0.0013). The arms are named for their measured effect, with the diagnostic printed beside every row. This is J8's lesson in a new costume.
The first control design was not worth reading. It drew one random control lag per seed and pooled them, and those draws mixed interventions costing +50, +50, +60 and −15 steps, a control whose own variance dwarfed the effect. It also drew lag 7, which the periodic sequence makes a valid source (offsets congruent to 3 modulo the lag of 4 all carry the answer), the mistake M3 had already documented. The contamination did not manufacture the result; the lag-7 draws gave the smallest delays. But the pooled arm was replaced with every lag as its own arm, turning a mixture into a map.
Result: the kill test fires
Six seeds, 400 steps, block applied for the first 100. The anchor reproduced: untouched midpoint 87.5 [83.1, 91.9] against M2's [83.2, 88.8]. The block is real: resemblance to cache-1 falls from 0.3299 to 0.0019.
| arm | delay vs untouched | resemblance to cache-1 | |
|---|---|---|---|
none | +0.0 | 0.3299 | |
block-1 | +4.2 [−2.0, +10.3] | 0.0019 | the resembled pattern |
block-2 | +46.7 [+42.4, +51.0] | 0.0047 | |
block-3 | +29.2 [+27.0, +31.3] | 0.3470 | valid source |
block-4 | +3.3 [+0.6, +6.0] | 0.0232 | |
block-5 | +5.0 [−1.6, +11.6] | 0.0029 | |
block-6 | +51.7 [+45.3, +58.0] | 0.0107 | |
block-7 | +17.5 [+13.1, +21.9] | 0.3316 | valid source |
block-8 | −11.7 [−14.4, −9.0] | 0.0215 | |
promote-wrong | +13.3 [+10.6, +16.0] | 0.3309 | opposite sign on lag 1 |
Blocking the resembled pattern costs +4.2 steps, an interval spanning zero, and is among the cheapest blocks in the table. It is not a stepping stone. Forcing the model to keep the pattern costs three times as much (+13.3, excluding zero) as removing it.
The unplanned finding is larger: cost clusters by residue class
delayed-copy repeats a prefix of length 4, so offset k carries prefix element (e + 3 − k) mod 4 relative to the answer's element e. Grouping the delays that way:
residue of k mod 4 | lags | delays | class mean | |
|---|---|---|---|---|
| 0 | 4, 8 | +3.3, −11.7 | −4.2 | |
| 1 | 1, 5 | +4.2, +5.0 | +4.6 | contains the resembled pattern |
| 2 | 2, 6 | +46.7, +51.7 | +49.2 | |
| 3 | 3, 7 | +29.2, +17.5 | +23.3 | carries the answer |
Between-class range 53.3; mean within-class spread 8.1; ratio 6.56. The cost of blocking a lag is a property of which prefix element it carries, not of how far back it sits. Lags 1 and 5 agree to 0.8 steps; lags 2 and 6 to 5.0.
And the ordering is not the obvious one. Blocking class 2, which carries no part of the current answer, costs more than twice as much as blocking class 3, which is the answer (+49.2 against +23.3). A model with two valid sources (offsets 3 and 7) can route around losing one of them; it apparently cannot route around losing class 2. Why class 2 specifically is not established here, and the obvious candidate: that class 2 carries the answer for the next scored position, so blocking it damages a different term of the same loss, is a hypothesis this record does not test.
Blocking class 0 makes the model faster. block-8 reaches its midpoint −11.7 steps [−14.4, −9.0] earlier than untouched, with the interval clear of zero. Removing a distractor the model would otherwise have to learn to ignore is worth about 13% of the transition time.
Verdict
- The kill test fires. Blocking the resembled algorithm costs
+4.2[−2.0, +10.3]and is among the cheapest blocks available. M2's earlycache-1phase is a resemblance, not a stepping stone. - The block is verified real (
0.3299 → 0.0019) and the sign was established by measurement, not by intuition, which had it backwards. - The anchor reproduced.
- Unplanned: block cost clusters by residue class at a ratio of
6.56, so it is set by which prefix element is suppressed rather than by distance. - Unplanned: blocking one class accelerates training by
−11.7steps.
Limits
- Six seeds, one task, one width, one learning rate, one block window, one strength. The window (
100steps) and strength (10.0) were fixed in advance and not swept; a different window could change the magnitudes, though the clustering is a within-run comparison and is less exposed. - The block is applied to the training logits only. Evaluation always sees the model's own output, so the delays are real changes to the model rather than measurement artifacts, but the intervention is on the objective, not on the architecture, and those are not the same handle.
- "Cheapest" is relative to this table.
+4.2spans zero but is not exactly zero, and a larger sample could resolve it as a small positive. - The residue-class explanation is descriptive. The clustering is measured; why class 2 is the costly one is not. The next test is to vary the task's lag and check that the classes move with it, which would confirm the grouping is about prefix elements rather than about these particular offsets.
promote-wrongis one sign at one strength. It shows that pushing the model towardcache-1costs more than removing it, not that the relationship is monotone in strength.
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.
- architecture
- The blueprint of a model: what components it has and how they connect. Two models can be the same size and completely different architectures.
- GRU
- Gated Recurrent Unit. A compact design for processing sequences one item at a time, with internal switches controlling what it keeps in memory.
- 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.
- learning rate
- How big a step training takes each time it updates the model. Too small and nothing happens; too big and it never settles.
- logits
- The raw scores a model produces for each possible answer before they are turned into probabilities.
- 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.
- variance
- How spread out a set of numbers is. Rising variance in a signal means it is becoming more erratic.
- 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 experiments that went against us, 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.