{"slug": "my-model-learned-to-think-it-never-learned-to-listen", "title": "My model learned to think. It never learned to listen.", "summary": "A developer known as flirp spent 21 GPU-hours training Qwen2.5-1.5B-Instruct to reason in latent space without decoding tokens, but the model's hidden-state reasoning collapsed into content-free attractors and failed to improve performance. Across four attempts—including a 4.7M-parameter adapter, 23M-parameter LoRA, extended curriculum, and distillation—ablations showed no benefit, with GSM8K accuracy peaking at 26% before falling to 17.6% when more reasoning was hidden. The experiments suggest that latent reasoning without proper training signals yields no gains over standard token-based chain-of-thought.", "body_md": "18 Jul 2026\n\nby flirp\n\n# My model learned to think. It never learned to listen.\n\nWhen I was four, I asked my dad:\n\n“Why can’t autoregressive language models remain in continuous latent space between decoding steps?”\n\nHe looked down at me.\n\n“What the fuck is an autoregressive language model?”\n\nMy first peer reviewer was unconvinced. This would become a theme.\n\nTwenty years later, I spent 21 GPU-hours finding out.\n\n## The suspiciously good idea\n\nLanguage models think in vectors but communicate in tokens. During ordinary chain-of-thought reasoning, every latent thought gets stamped down into a vocabulary token.\n\nThis seems silly. Being the bold-faced explorer I am, I set out to set the world right. No more silly, pre-emptive, lossy decoding.\n\nPapers such as Coconut asked the obvious question: what if the model stayed in hidden-state space and decoded only when it had something worth saying?\n\nI tried an aggressive version on Qwen2.5-1.5B-Instruct. Whenever the model became uncertain, it paused. I cloned its hidden state into several parallel streams, added different noise to each, and let them think without producing tokens. Then I compressed their work, inserted it into the context, and resumed generation.\n\nParallel subconscious reasoning. A global-workspace bottleneck. Several tiny minds working together inside my laptop.\n\nThat was the story, anyway. Mechanically, I was feeding a transformer’s output back into itself and hoping it would become clever.\n\n## The frozen model discovers `/router`\n\nBefore training, I built a logit lens: at each silent reasoning step, project the hidden state through the output head and inspect the tokens it most resembles. This does not make the model speak. It just lets us rummage through its bins.\n\nAt step zero, the states resembled useful tokens: “Step”, “answer”, digits. Two to four steps later they had drifted into whitespace, `/router`\n\n, `Array`\n\n, and random CJK fragments.\n\nThe trajectories explored roughly a thousand times the hidden-space volume of an ordinary token chain of thought. Unfortunately, the volume was empty.\n\n**Reach is not meaning.**\n\nThe streams also converged. This initially sounded promising: perhaps disagreement meant uncertainty and convergence meant consensus. In reality, they were agreeing on junk. Every stream had fallen into the same content-free attractor.\n\nI had invented collapse and nearly called it confidence.\n\n## Fine. Train it. (Ablation style)\n\nNobody expected a frozen language model to understand this strange new organ, so I trained it. At every evaluation I ran three versions:\n\n- Use the latent thoughts normally.\n- Replace every latent thought with zero.\n- Give each question another question’s latent thoughts.\n\nIf the first version does not beat the other two, the thoughts are decorative, whatever the loss curve says.\n\nThen I climbed a ladder of increasingly expensive optimism.\n\n### Attempt one: boundary adapter\n\nI added a 4.7M-parameter adapter because final-layer states are badly out of distribution as input embeddings.\n\nLoss fell from 4.3 to 1.3. GSM8K rose from 16.8% to 18.4%. Then the zeroed version beat the normal one.\n\nThe adapter had learned to emit a useful constant bias vector: **prompt tuning in a trench coat**.\n\n### Attempt two: LoRA\n\nI added 23M trainable parameters and the first stage of a Coconut-style curriculum. Loss reached 0.53 and GSM8K reached 26%.\n\nThe ablations showed no separation. I had successfully fine-tuned a model on maths text. The latent channel remained unread.\n\n### Attempt three: more curriculum\n\nI hid more of the written chain of thought behind latent blocks. Accuracy fell to 17.6%.\n\nForcing a model to rely on a channel containing nothing turns out to remove information.\n\n### Attempt four: make cheating impossible\n\nThis was the serious run. I pulled each latent state toward the teacher’s corresponding written reasoning state, then masked 30% of the visible reasoning so the decoder would have to look somewhere else.\n\nThe distillation worked on its own terms. Loss fell from 1.98 to 0.42. Lens entropy dropped from 6.5 to 2.2 nats. The states became sharp, structured, and teacher-like. Content was definitely going in.\n\nAt step 800, the normal model beat both ablations for the first time. Finally, something had worked.\n\nThen the final evaluation finished:\n\n| Configuration | Accuracy |\n|---|---|\n| Thoughts enabled | 20% |\n| Thoughts replaced with zeros | 30% |\n| Thoughts stolen from another question | 20% |\n\nThe model performed best when I surgically removed the feature I had spent two weeks building.\n\nAcross twelve ablation evaluations, zeroing or shuffling the thoughts matched or beat the real thoughts in eleven.\n\nIt had learned to write thoughts. It had not learned to read them.\n\n## I also tried going deeper\n\nFor completeness, I repeatedly looped a block of transformer layers during normal generation. One pass reproduced the stock model. Two passes were roughly neutral. Four passes dropped accuracy to **6%**.\n\nThere is apparently a point between “consider it again” and “sustain a head injury.” Models such as Huginn learn depth recurrence during pretraining. You do not get it for free by turning the loop count up at inference.\n\n## What actually survived\n\nOrdinary token chain of thought scored 30% while using one-sixth of the FLOPs of any latent configuration.\n\nIn hindsight, there are some obvious problems with the experiment:\n\n- I was fine-tuning a model that was not trained to use latent reasoning. The lift may not have been as small as I anticipated.\n- Collapsing a latent state into a rigid token prevents runaway dynamics. Without that constraint, the model just kind of roams around.\n- If this line of attack worked, I probably would not have been the first to notice.\n\nBut the result I trust most is about evaluation. All of these looked like progress:\n\n- falling training loss;\n- falling distillation loss;\n- latent states becoming much sharper;\n- a nine-point benchmark improvement;\n- one glorious mid-run evaluation.\n\nEvery measurement was real and reproducible. None meant what I wanted it to mean. Two extremely stupid controls exposed the whole thing: replace the clever new mechanism with zeros, or replace it with somebody else’s output.\n\nIf an architecture claims that a model reasons in latent space, ask whether anyone zeroed the latents.\n\n## Caveats, before I become a paper reviewer\n\nThis was one 1.5B model, one task family, one seed per configuration, and parameter-efficient training on a laptop. Full fine-tuning is where the published parity claims live, and I could not afford it. Injecting every stream separately may also work better than my mean-and-variance bottleneck.\n\nIf someone runs either experiment, I would genuinely love to be wrong.\n\nCode, training logs, run data, and the full technical report: [github.com/Oli-26/LatentReasoningNoDecode](https://github.com/Oli-26/LatentReasoningNoDecode)\n\n### Get the next one\n\nNew experiments, negative results included. No schedule, no spam, unsubscribe by replying.\n\n### Comments\n\nFound a hole in this? Say so. Corrections and replications are the whole point, and a comment pointing at a mistake is worth more to me than a compliment.", "url": "https://wpnews.pro/news/my-model-learned-to-think-it-never-learned-to-listen", "canonical_source": "https://latentheat.dev/blog/latent-threads-negative-result", "published_at": "2026-07-17 23:00:00+00:00", "updated_at": "2026-08-03 18:36:29.640770+00:00", "lang": "en", "topics": ["artificial-intelligence", "machine-learning", "large-language-models", "ai-research"], "entities": ["flirp", "Qwen2.5-1.5B-Instruct", "Coconut", "GSM8K", "LoRA"], "alternates": {"html": "https://wpnews.pro/news/my-model-learned-to-think-it-never-learned-to-listen", "markdown": "https://wpnews.pro/news/my-model-learned-to-think-it-never-learned-to-listen.md", "text": "https://wpnews.pro/news/my-model-learned-to-think-it-never-learned-to-listen.txt", "jsonld": "https://wpnews.pro/news/my-model-learned-to-think-it-never-learned-to-listen.jsonld"}}