~/satyajit

Towards looped models done right: what actually separates Ouro from Huginn

mdjsonmcp

2026-08-03 · 14 min · llm · looped-transformers · recurrent-depth · ablation-study · architecture · mixture-of-experts · explainer

Ask why Huginn-style looped transformers tend to beat Ouro-style ones and most people reach for the same answer: random state initialization. It is the assumption inherited wholesale from deep equilibrium models — randomize the recurrent state so the loop cannot just memorize a fixed point, and the model is forced to learn a genuinely path-independent computation. It sounds right. It is also, according to a new controlled-ablation report from the Institute of Foundation Models (IFM), mostly wrong.

Towards Looped Models Done Right does not propose a new looped architecture. It audits the two existing lineages this site has already covered — the padded-latent loop in LOTUS and the shipped two-pass loop in Nanbeige4.2-3B both descend from this same family of looped / recurrent-depth transformers — and asks a narrower, more useful question: Ouro and Huginn differ along three design axes at once, so which one is actually doing the work? The answer, walked through below, is not the one folk wisdom would guess.

One formalism, two lineages, three tangled axes

Both Ouro and Huginn are instances of the same tied-iterative model. Take token embeddings, run them through a prelude, loop a shared recurrent body TT times, then run a coda:

e=Pθ(x0),z0=ϕθ(e,ξ),z~t=Wθ(zt,e),zt+1=Rθ(z~t),h=Cθ(zT)\mathbf e = P_\theta(\mathbf x_0),\quad \mathbf z_0 = \phi_\theta(\mathbf e, \boldsymbol\xi),\quad \tilde{\mathbf z}_t = W_\theta(\mathbf z_t, \mathbf e),\quad \mathbf z_{t+1} = R_\theta(\tilde{\mathbf z}_t),\quad \mathbf h = C_\theta(\mathbf z_T)

PθP_\theta is the prelude, RθR_\theta the tied recurrent body (the only part that repeats), CθC_\theta the coda, ϕθ\phi_\theta the state initializer (optionally seeded with noise ξ\boldsymbol\xi), and WθW_\theta the per-step write that decides how much of e\mathbf e gets re-injected at each pass.

Set every one of PθP_\theta, WθW_\theta, ϕθ\phi_\theta to the identity and you get Ouro-style: the entire network is the recurrent body, looped over the full sequence, with z0=e\mathbf z_0 = \mathbf e directly. Untie a real prelude and coda from the loop, persistently re-inject e\mathbf e into the core at every pass, and optionally randomize the initial state, and you get Huginn-style. Three independent knobs — iteration envelope, input interface, latent-state design — get flipped between the two architectures simultaneously in the existing literature. Nobody had isolated which flip mattered.

Three architecture diagrams side by side. (a) Feedforward: token embedding through a stack of distinct blocks B1 through BL to output. (b) Ouro-style: token embedding into a single tied block R-theta looped T times, straight to output. (c) Huginn-style: token embedding through prelude P-theta to representation e, which feeds a write operator W-theta, an initializer producing z0 from the data distribution, a tied loop R-theta applied T times with e fed back in via W-theta at every pass, then a coda C-theta to output.
IFM Research's own diagram of the three topologies this ablation compares: a plain feedforward stack, the homogeneous Ouro-style loop, and the Huginn-style prelude–loop–coda envelope with its explicit write operator (IFM Research, 2026).

The controls that make this an ablation, not a vibe check

A myth-busting result is only as good as what it holds constant. IFM's models are matched on logical depth — Ouro-style loops a 28-block stack four times, Huginn-style runs an 8-block prelude, a 12-block core eight times, and an 8-block coda; both total 112 block executions — and on parameters (730M stored / 2.9B unrolled-equivalent dense; 8B-resident / 0.8B-active, 32B/3.2B unrolled-equivalent for the MoE runs), tokens (TxT360, swept across 58/115/230/460 tokens-per-parameter), and a ten-benchmark suite spanning knowledge (ARC-C, HellaSwag, MMLU, TriviaQA), context reasoning (BBH-CoT, DROP), math (GSM8K, MATH500), and code (HumanEval+, MBPP+). Whichever topology wins a given comparison, it isn't winning on a hidden depth or size advantage:

matched logical depth · 112 block executions either waycontrolled setup
Ouro-style28 blocks × 4 passes = 112pass 1pass 2pass 3pass 4entire 28-block network is the recurrent body — no untied prelude/codaHuginn-style8 + 12×8 + 8 = 112Ptied core R × 8Cuntied prelude / coda (each own params, applied once) sandwich a smaller tied core
highlight
both topologies: 112 logical block executions

Ouro-style and Huginn-style are matched on purpose: same 112 logical block executions, same 730M stored / 2.9B unrolled-equivalent parameter budget (8B-resident / 0.8B-active for the MoE runs), same token budgets and benchmark suite. Whatever wins, it is not winning on a hidden depth or parameter advantage — the only thing that differs is which of these blocks share weights (blue, reused every pass) and which stand alone (amber, their own parameters, applied once).

With the controls fixed, IFM walks the transformation path from Ouro to Huginn one axis at a time — sandwich envelope, then input injection, then random state init — and measures what each addition actually buys.

Q1: does untying the prelude and coda matter?

Yes, and only for a specific kind of task. Adding a sandwich envelope — untying a prelude and coda from the loop so only the middle core repeats — lifts MATH500 by 12.00 points and DROP by 2.61 points at the 460 tokens-per-parameter budget, and the gain persists across all four token budgets tested. But knowledge-heavy benchmarks and strict-output-contract tasks like code show no consistent gain, sometimes a small decline. Read plainly: the envelope helps instance-conditioned, multi-step reasoning. It does not help stored-knowledge recall or spec-compliant code generation, and the report is upfront that it shouldn't be expected to.

Q2: does persistent input injection matter?

Also yes, and it's the widest-reaching single change in the whole report. Writing the prelude's representation e\mathbf e into the core at every pass — not just once at the start — uses a learned, per-channel gate:

D(zt,v)=αzt+δWinv,δ=softplus(bδ),α=exp{δexp(a)}D(\mathbf z_t, \mathbf v) = \boldsymbol\alpha \odot \mathbf z_t + \boldsymbol\delta \odot \mathbf W_{\text{in}}\mathbf v, \qquad \boldsymbol\delta = \operatorname{softplus}(\mathbf b_\delta), \qquad \boldsymbol\alpha = \exp\{-\boldsymbol\delta \odot \exp(\mathbf a)\}

On the middle-loop (sandwich) topology, adding this write lifts MMLU +2.53, BBH-CoT +6.63, DROP +1.39, HumanEval+ +5.49, MBPP+ +4.23 — five benchmarks, all up, some by a lot. Bolt the same write onto the full-stack Ouro topology (injecting raw token embeddings instead of a prelude-encoded e\mathbf e) and the same-direction gains show up smaller (MMLU +1.79, BBH-CoT +1.80, DROP +0.91, HumanEval+ +2.44, MBPP+ +4.50) — evidence the effect is real and not an artifact of one topology.

It is not a free lunch. The same write hurts quantitative reasoning: middle-loop MATH500 drops 3.60 points, GSM8K drops 2.51 (the full-stack Ouro version is less damaged: MATH500 −1.60, GSM8K +0.53). Persistently re-showing the model its own input, it turns out, competes with letting the loop's state evolve freely enough to carry a multi-step derivation.

Three architecture panels showing a construction path with arrows between them. (a) Full-stack loop: token embedding directly into a tied R-theta block looped 4 times to output. (b) Middle loop (sandwich): token embedding through P-theta, then a smaller tied R-theta looped 8 times, then C-theta, to output. (c) Middle loop plus input injection: same as (b) but with an explicit e node and W-theta write operator feeding the tied loop at every one of the 8 passes, with z0 equal to e.
IFM Research's own construction-path diagram: full-stack Ouro, then the sandwich envelope alone, then envelope plus persistent input injection — the same two steps walked interactively below (IFM Research, 2026).

Put the envelope and the injection together and the combined model beats full-stack Ouro on 8 of the 10 benchmarks (losing only ARC-Challenge and HellaSwag). Step through both changes yourself — the diagram below is my own redrawing of the same construction path, with each stage's measured delta attached so you can see exactly which wire produced which number, before the third, more surprising change gets added:

Ouro to Huginn, one wire at a timeconstruction path
in×8tied core Rθz₀ = eD(zₜ, e) — every passout+ sandwich envelope
MATH500 +12.00DROP +2.61knowledge / code flat or down

Untie a prelude and coda from the loop; only the middle 12-block core repeats. Reasoning tasks move, knowledge and code mostly don't.

Q3: the myth — random state init and shared H/L hierarchies

This is the report's contrarian core. Swap the direct initial state z0=e\mathbf z_0 = \mathbf e for a randomly sampled one, z0N(0,I/d)\mathbf z_0 \sim \mathcal N(0, I/d) — the equilibrium-model-inherited move everyone assumes is load-bearing — and two benchmarks improve (ARC-C +3.34, GSM8K +1.22) while four get worse by more than a point (MMLU, MATH500, HumanEval+, MBPP+). Net: direct init wins 6 of 10 benchmarks, and it's cheaper, since it skips sampling noise at every forward pass. The report's own words: "random initialization is not a necessary ingredient for loop language models... [it] should instead be viewed as a task- and objective-dependent inductive bias, rather than as a universally beneficial design choice."

A second candidate "obviously helps" ingredient fares no better. HRM/TRM-style hierarchies split the loop into a slow high-level state and a fast low-level state cycling underneath it; IFM tests a version that shares one recurrent body across both states (isolating the state-hierarchy idea from the separate-modules idea) and finds gains over a point on three benchmarks, losses over a point on three more — MATH500 hit hardest — and roughly flat on the rest. Their conclusion: "a shared-module H/L hierarchy provides no consistent benefit." (They flag, honestly, that this doesn't rule out a separately-parameterized HRM-Text-style version — that variant is "still under evaluation.")

Here is the believed-important story against what got measured, for both:

believed-important vs. measured effectQ3, recurrent-state design
random state init vs. direct init (z₀ = e)
ARC-C
+3.34
GSM8K
+1.22
MMLU
worse, >1pt
MATH500
worse, >1pt
HumanEval+
worse, >1pt
MBPP+
worse, >1pt

dashed bars: source reports only the direction and that the loss exceeds 1 point, not the exact value

Direct init wins 6 of 10 benchmarks and skips the random sampling step entirely — cheaper, and net ahead.

shared H/L hierarchy (HRM/TRM-style) vs. flat loop

Gains over 1 point on 3 benchmarks, losses over 1 point on 3 — MATH500 hit hardest — and roughly flat on the rest. “No consistent benefit,” in the report's own words, at least for a shared-weight H/L split.

The net effect: two wires did almost all the work

Chain every change together — Ouro, plus envelope, plus injection, plus random init — and you land on full Huginn, which does beat Ouro on all ten dense benchmarks at the 730M/336B-token setting. But laid out per-benchmark across the whole construction path, the shape of the win is obvious: most of the climb happens in the first two steps, and the last step (random init) barely moves several benchmarks and actively costs a few.

A ten-panel grid of line charts, one per benchmark (ARC-C, HSwag, MMLU, BBH-CoT, TQA, DROP, MATH500, GSM8K, HEval+, MBPP+), each plotting raw benchmark score against four construction stages labeled O, +P/C, +W, +z, with reference dashed lines for a 28-layer and a 112-layer feedforward baseline. Most benchmarks rise steeply from O to +P/C and +W, then plateau or dip slightly at +z.
IFM Research's raw benchmark scores across the same four-stage construction path — O (Ouro) through +P/C (envelope), +W (injection), +z (random init) — against 28-layer and 112-layer feedforward references. The plateau (and occasional dip) at the last step is the random-init myth, in the paper's own data (IFM Research, 2026).

Does the story change at MoE scale?

The two levers that mattered — envelope and injection — hold up when the recurrent body becomes a mixture-of-experts. At 8B-resident / 793.9M-active parameters (500B tokens, top-2 routing, 25 experts), Huginn-MoE beats Ouro-MoE on 8 of 10 benchmarks, with the largest gains on GSM8K (+4.70) and MATH500 (+3.60). It also routes more evenly — a normalized load-balancing loss where lower means more balanced:

MoE load-balancing loss at 500B tokens (lower = more balanced)
Ouro-MoE
1.9
112-layer feedforward MoE
1.65
Huginn-MoE
1.57
00.511.52

A causal check backs up that the routing difference is meaningful, not noise: force loop iterations 2 through 8 to reuse iteration 1's expert identities (keeping the iteration-specific mixture weights) and accuracy drops on all six evaluated tasks. Whatever the loop is learning to route each pass, it matters.

Against a 112-layer feedforward MoE reference (32B resident parameters), the feedforward model still wins overall — 7 of 10 benchmarks — but Huginn-MoE beats it on DROP and GSM8K and matches it on MATH500, while using 75% fewer resident parameters. The mean gap to the feedforward reference shrinks from 4.96 points in the dense setting to 1.71 points in the MoE setting. Looping doesn't close the gap to a much bigger feedforward model outright, but MoE narrows it substantially — the same shape of result as Nanbeige's own parameter-efficiency argument, below.

Set against a shipped model: Nanbeige4.2-3B

The most useful check on any ablation study is an independent result that wasn't trying to test the same hypothesis. Nanbeige4.2-3B's technical report is exactly that: a production model that made its own looping decisions under deployment pressure, not a controlled academic sweep.

Nanbeige's architecture is closer to Ouro-style — a homogeneous loop over the full stack, run twice — and its report reached three conclusions of its own: two passes is the sweet spot (more loop count bought little and made training less stable), training the looped architecture from scratch beats upcycling a pretrained feedforward model into one, and sharing the KV cache across passes underperformed, so they paid full attention cost at every pass rather than take the cheaper shortcut.

None of Nanbeige's three findings directly tests IFM's three axes — Nanbeige never tried an untied prelude/coda, persistent injection, or random state init — so this isn't a replication in either direction. But the two reports rhyme in an interesting way: every place Nanbeige tested a cheap shortcut inside the loop (share the KV cache, upcycle instead of retraining, add more passes without changing the topology), the shortcut lost. Every place IFM tested a richer per-pass mechanism (untie the envelope, inject persistently), it won — and the one change that added complexity without adding real per-pass information (random init) was the one that didn't clearly help. Read together, the two reports point at the same underlying rule: what a looped model does each pass — how much fresh computation and fresh input it gets — matters more than how many times it loops or how its state gets seeded. Where they don't overlap at all is loop count itself: Nanbeige's "two is enough" is a statement about a plain full-stack loop; IFM's Ouro-style baseline already runs four passes and Huginn-style runs eight core iterations inside a smaller envelope, so the two reports are sweeping different variables and shouldn't be read as agreeing or disagreeing on "how many loops."

There's a second, more mechanical echo. LOTUS — the site's other looped-transformer piece — already does something IFM's ablation independently flags as one of the two levers that matter: every LOTUS iteration recomputes e+h(t1)\mathbf e + \mathbf h^{(t-1)}, persistently feeding the fixed input embeddings back into the loop rather than only conditioning on them once. That's a specific instance of the same principle behind IFM's write operator D(zt,e)D(\mathbf z_t, \mathbf e): keep re-showing the loop its input. LOTUS applies that idea inside a frozen-backbone latent-reasoning setup at inference time rather than IFM's from-scratch pretraining setup, so the two aren't directly comparable — but it's a second, independent place persistent input injection shows up as doing real work.

What to trust, and what to hold loosely

The take

The intuitive story about looped transformers has always centered on the recurrent state itself — randomize it, and the model is forced to learn something more general. IFM's controlled ablations say that story is backwards for at least these two designs at this scale: the state's initialization is close to a wash, sometimes a net loss, and a fashionable H/L hierarchy adds nothing consistent once you control for everything else. What actually separates a strong looped model from a weak one is much less exotic — untie a prelude and coda from the loop so the recurrent core can specialize, and keep showing that core its input at every pass instead of just once. Neither idea needs a random number generator.

That's a genuinely useful result for anyone building a looped model today, and it lines up with what Nanbeige found the hard way in production: cheap shortcuts inside the loop (shared KV cache, more passes without restructuring, upcycling instead of retraining) tend to cost you, while spending real compute and real information on each pass tends to pay. The caveat that matters most is the one IFM states themselves — this is one group's ablation, at sub-billion-to-8B scale, with no code out yet and no arXiv paper. "Part I" means there's more coming. Whether the random-init myth holds at 100B+ parameters, and whether a properly separate-module HRM-Text hierarchy fares better than the shared one tested here, are open questions the authors name as future work, not settled ones.


Source: Towards Looped Models Done Right — Part I: Topology, Input Injection, Recurrent-State Design (Huang, Shi, Chen, Wen, Liu, Xing, Ma; Institute of Foundation Models, 2026). All benchmark deltas, equations, and figures are quoted or reproduced from the report; the matched-depth, construction-path, and believed-vs-measured diagrams are my own illustrations of the same numbers.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Towards looped models done right: what actually separates Ouro from Huginn", ai.thesatyajit.com, August 2026.

bibtex
@misc{ghana2026loopedmodelsdoneright,
  author = {Satyajit Ghana},
  title  = {Towards looped models done right: what actually separates Ouro from Huginn},
  url    = {https://ai.thesatyajit.com/articles/looped-models-done-right},
  year   = {2026}
}
share