Research record 44 of 67

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: analysis/block_the_wrong_algorithm.py. Output: analysis/block_the_wrong_algorithm.json. Reproduce with python 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.

What it costs the model to be denied each earlier word
What it costs the model to be denied each earlier word. Early in training this model's answers look like a simple wrong habit: repeat the word immediately before. We tested whether that habit is a necessary stage by denying the model the ability to use it, then did the same for every other position as a comparison. Green bars mark the positions that actually hold the answer; the orange bar is the habit we were testing. Denying the model its early habit costs almost nothing -- it is one of the cheapest bars here -- so the habit is something its answers resemble on the way past, not a stage it needs. The comparison bars turned out to be the more interesting half. The costs fall into clear groups of two, set by which part of the repeating pattern the denied word belongs to rather than by how far back it is, and denying a word that holds no part of the current answer can cost twice as much as denying one that does. One position is even worth denying: the model gets there sooner without it.

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.

armdelay vs untouchedresemblance to cache-1
none+0.00.3299
block-1+4.2 [−2.0, +10.3]0.0019the resembled pattern
block-2+46.7 [+42.4, +51.0]0.0047
block-3+29.2 [+27.0, +31.3]0.3470valid 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.3316valid source
block-8−11.7 [−14.4, −9.0]0.0215
promote-wrong+13.3 [+10.6, +16.0]0.3309opposite 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 4lagsdelaysclass mean
04, 8+3.3, −11.7−4.2
11, 5+4.2, +5.0+4.6contains the resembled pattern
22, 6+46.7, +51.7+49.2
33, 7+29.2, +17.5+23.3carries 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 early cache-1 phase 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.7 steps.

Limits

  • Six seeds, one task, one width, one learning rate, one block window, one strength. The window (100 steps) 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.2 spans 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-wrong is one sign at one strength. It shows that pushing the model toward cache-1 costs 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.

Want this measured on your data?

We build private models our clients own and run on their own infrastructure, and every engagement proves measured lift on the client's own tasks before we call it done. Start free with a readiness scorecard that tells you whether your data can support it, or book a short call.