Repository navigation
Can a 12B model show the same "global workspace" structure Anthropic found in frontier models? #725
Replies: 3 comments
|
Qwen run is finished. Same 4B architecture, same corpus, same 20-prompt J-Lens fit — one rung is We have a new result card with all of them.
|
|
The code and the data behind this post are now public: jlens-small-models Everything I claimed in this thread is now checkable. The repo has the fit, apply and Four of the seven figures rebuild from the shipped logs alone — no GPU, no model weights, What I deliberately did not ship is a fitted lens. The Gemma 4 lens is a 413 MB file The caveats from the original post travel with the code, and the README states them plainly: The Qwen identity numbers are in there too, framed as narrowly as they deserve: a The two open questions from my follow-up still stand, and the code is there if it helps you |



Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
TL;DR: Yes. Measured with Anthropic's open-source Jacobian-Lens on a single 12 GB consumer GPU, Gemma 4 12B shows the "global workspace" signature reported for frontier models — participation ratio ≈ 6–7 directions (of 3840) in layers 33–40, with the top 25 directions carrying ~86 % of transport energy. Setup, numbers, and caveats below; all scripts run locally against public HF weights and are available on request.
The question
About two weeks ago Anthropic released the Jacobian-Lens paper (
anthropics/jacobian-lens, Apache-2.0). Core finding: in frontier models, the information transported from deep layers to the output flows through a tiny bottleneck of roughly 10–25 directions out of thousands available — a "global workspace" signature. The paper leaves open whether this is an emergent property of scale. So: does a 12B that fits on a living-room gaming PC have it too?Setup: bf16 gradients through 24 GB of weights on a 12 GB card
The lens needs backward passes through the frozen weights. Gemma 4 12B in bf16 is ~24 GB; the card is an RX 6700 XT with 12 GB (not even officially ROCm-supported). Naive CPU fallback: 17 min per backward pass, at 480 passes per prompt — a non-starter.
The workaround is a device split that keeps autograd off the CPU entirely:
Since the lens targets transport from deep layers to the read-out, rooting the graph mid-stack costs the lower half of the depth range but nothing else (see caveats).
The honest ops chart: 24 h, 100 prompts, five process kills, zero data loss — per-prompt checkpointing.
Results
The signature is there — and tighter than the frontier corridor. Participation ratio of the average-Jacobian spectrum: ~6–7 directions in layers 33–40 (of 3840 possible). Top-25 directions carry ~86 % of transport energy. That is at or below the 10–25 range reported for frontier models.
The robustness check that convinced us: a 5-prompt pilot gave PR ≈ 8–9. Averaging over 100 prompts sharpened this to ≈ 6–7. If each prompt used its own private directions, averaging would widen the bottleneck — instead it concentrated. The directions are genuinely shared across prompts.
One coherent channel across depth: top-25 subspace overlap between all layer pairs stays far above the random baseline (≈ 0.007) throughout L33–44 — the same subspace, not layer-local bottlenecks.
Cross-lingual side finding: on a German prompt ("Die Hauptstadt des Landes, das für Käse und Windmühlen bekannt ist…"), the lens shows the concept locking in English first, mid-stack — "Netherlands" wins layers before "Niederlande" appears. The shared cross-lingual space, directly visible in the residual stream.
Left: English name wins mid-stack on a German prompt. Right: a concept relay — continent → peninsula → Italy → boot.
Caveats
Reproducibility
Nothing hosted, no accounts touched — the scripts only download public HF weights and run locally. The charts above are not hand-made either: each card is generated by a matplotlib script that computes its numbers (participation ratios, energy concentration, subspace overlaps) directly from the saved lens tensors — so anyone re-running the fit regenerates the exact same figures from their own data. Happy to share everything (fit runner, device-split trick for gradients on ROCm, chart generators) with anyone who wants to point the Jacobian-Lens at their own consumer card.
Transparency: the cost math, the device-split idea, every script — and this post — were pair-built with Claude (Fable 5) in Claude Code over one weekend.
All reactions