Vibe Engines is free, interactive AI engineering & system design — runs in your browser. Pick a learning path →
Concept circuits,
explained.
Open a language model and look for the "green" neuron and you won't find it. You'll find a neuron that fires for green, and for legal contracts, and for Python — three unrelated things at once. That's not a bug; it's how the model fits far more concepts than it has neurons. Understand that trick — superposition — and the rest of mechanistic interpretability opens up: naming the features, and tracing the circuit that connects them into an answer.
Contents 14 sections
The delta The neuron that means too much Superposition: more features than dimensions Why the interference doesn't bite: sparsity Attribution graphs: tracing the circuit Why it matters How it works The math The evidence Since then Solve it yourself Questions Check yourself Where this sitsWhat changes against every rung below: the model becomes the object of study
Rungs 1 to 3 build the machine. This rung asks what is inside it, and the first finding is why that question is hard: a single neuron does not mean one thing. Inspect the activations of an individual unit in a large model and it fires for an unrelated-looking collection of inputs. The obvious interpretation — that the model's concepts are simply not human-legible — turns out to be the wrong one.
The better account is superposition. A model has some number of dimensions and wants to represent far more features than that. If only a few features are active at once — which is true of nearly everything language is about — it can pack many features into directions that are merely nearly orthogonal rather than exactly so, accepting a small amount of interference in exchange for representing far more than its dimension count allows. Polysemantic neurons are then not a failure of interpretability; they are the expected consequence of an efficient code, and the unit of meaning is a direction in activation space, not a neuron.
That reframing supplies the method. To read the model you first have to unpack the superposition — learn an overcomplete dictionary of directions that reconstructs the activations while keeping very few of them active at a time, which recovers features that are individually far more interpretable than any neuron. With features in hand you can then ask the causal question the ladder has been building toward: trace which features fed which, through which layers, to produce a specific output, and read the circuit rather than the weights.
The neuron that means too much
The first thing you learn probing a real network is that individual neurons are polysemantic — a single unit lights up for a jumble of unrelated concepts. It's tempting to read that as the model being messy. It isn't. The model simply isn't storing "one concept per neuron." It's storing concepts as directions in the activation space, and those directions are spread across many neurons at once.
So a neuron isn't a concept — it's one coordinate that many concept-directions happen to use. Ask "what does neuron 4,182 mean?" and you get nonsense; ask "which directions does the model use, and what does each mean?" and you get features. The reason there are more features than neurons is the mechanism worth understanding.
Superposition: more features than dimensions
A space with d dimensions holds only d perfectly orthogonal directions. But it holds vastly more directions that are almost orthogonal — and "almost" is good enough. Superposition is the model exploiting this: give each feature its own direction, let those directions be near-orthogonal, and accept a little interference between them.
dot = 0, exact
dot = −0.5 each
than dimensions
Three unit vectors in 2-D can't be orthogonal, but at 120° apart their pairwise dot is only −0.5 — bounded interference, and three features in a two-dimensional home.
Why the interference doesn't bite: sparsity
If superposed features interfere, why doesn't the model turn to mush? Because features are sparse — only a handful are active on any given input. "This text is legal," "this token is a date," "the topic is grief" don't all fire at once. When just one feature is active, reading it back is clean; the interference terms are dormant because the features they'd collide with aren't switched on.
So superposition is a bet on sparsity: pack in many features cheaply, and rely on the fact that they rarely co-activate, so the rare collisions cost little. That's exactly why embedding-style geometry can carry so much meaning in modest dimensions — and why sparse-feature methods (sparse autoencoders) can pull the individual features back out of the tangle.
Superposition trades a little interference for a lot of capacity, and sparsity is what makes the trade pay: many features, few active at a time, so the collisions almost never happen. Interpretability is hard precisely because features don't line up with neurons — you have to recover the directions first.
Attribution graphs: tracing the circuit
Once you can name features, you can ask the real question: which features produced this output, and how? An attribution graph measures each feature's contribution to a target — how strongly the output direction reads each active feature direction — and chains those contributions across layers into a circuit: the path of intermediate features the model actually used.
That's the leap from "the model answered Austin" to "it answered Austin because the Texas feature activated the state-capital feature, which drove the Austin output." Recent work adds a self-explanation twist — the model translating its own internal features into natural language — but the backbone is the same: attribution turns a forward pass into a readable causal graph. The runnable below builds the simplest version: contribution as the dot product between a feature and the output direction.
Why it matters
Mechanistic interpretability is what turns a model from a black box into something you can debug. If you can name a model's features and trace the circuit behind a behaviour, you can find why it hallucinates, spot the feature a jailbreak exploits, or catch it leaning on a spurious cue — and sometimes steer it by editing the feature directly. That's a different kind of control than prompting: surgery, not persuasion.
Superposition is the reason it's hard (features hide across neurons) and the reason it's possible (they're still linear directions you can recover). This breakdown is the foundation; the engineering playbook — what you can actually inspect and fix in production — is the natural next step, and it's the same geometry-of-meaning idea that word2vec first made visible.
The geometry of meaning it builds on: word2vec. The vector intuition: Embeddings. Where debugging meets safety: AI Security.
How sparse autoencoders and attribution graphs trace a concept circuit
Concept-circuit work joins two techniques. Sparse dictionary learning recovers features from a model's activations, and attribution graphs trace how those features combine to produce one specific output. Both were developed in public research between 2022 and 2025, chiefly at Anthropic, OpenAI and Google DeepMind.
- Collect activations. Run the model over a large corpus and record the vector at one site for every token, for example the residual stream after a middle layer, or the input and output of an MLP. Hundreds of millions of token vectors is a normal training set.
- Train a sparse autoencoder. An encoder maps each d-dimensional activation to m feature activations through a ReLU, with m far larger than d: anywhere from a few times d to millions of features. A linear decoder rebuilds the activation as a weighted sum of m learned directions. The loss is reconstruction error plus a penalty on feature activity, classically an L1 penalty. Decoder directions are held to unit norm, or their norms are folded into the penalty, so training cannot dodge the penalty by shrinking activations and growing directions.
- Or set the sparsity directly. TopK autoencoders (Gao et al., OpenAI, 2024) keep only the k largest activations per token, and JumpReLU autoencoders (Google DeepMind, 2024) learn a firing threshold per feature. Both aim at L0, the average number of active features per token, instead of tuning a penalty weight.
- Keep features alive. Some latents stop firing on every input and never recover; these are dead latents. Remedies include re-initializing them toward inputs that are reconstructed badly, as Anthropic did in Towards Monosemanticity, and an auxiliary loss that trains dead latents on the leftover error, as in Gao et al.
- Label the features. Read each feature's top-activating text, then test its decoder direction: which output tokens it promotes, and what changes when it is added or removed. Automated pipelines have a second model write an explanation and score it by how well it predicts the feature's activations on new text.
- Switch to transcoders for circuits. An autoencoder reconstructs an activation. A transcoder instead predicts an MLP's output from the MLP's input through the same kind of sparse layer, so its features stand in for the MLP's computation. Anthropic's cross-layer transcoder goes further: each feature reads the residual stream at one layer and writes to the MLP outputs of that layer and every later one.
- Build a replacement model for one prompt. Swap every MLP for transcoder features, freeze the attention patterns and normalization scales recorded from the real forward pass, and add an error node at each layer and position holding whatever the transcoder missed. On that prompt the replacement reproduces the model's activations exactly, and every remaining interaction is linear.
- Attribute and prune. In the frozen, linear system, the influence of one node on another is the source's activation times a fixed virtual weight between them. Nodes are input tokens, active features, error nodes and output logits. The graph keeps only the nodes and edges carrying most of the influence on a chosen logit, and researchers group related features into supernodes by hand.
- Test with interventions. A graph is a hypothesis about the real model, so it is checked in the real model: suppress a feature or inject another and see whether the output moves as the graph predicts. In Anthropic's two-step example, asking for the capital of the state containing Dallas, replacing the Texas features with California features changed the answer from Austin to Sacramento.
The numbers that say whether a dictionary is any good
Five are standard: L0; the fraction of activation variance the reconstruction explains; how much next-token loss rises when the reconstruction is spliced back into the model; the share of dead latents; and an interpretability score from humans or an automated explainer. A dictionary can win on one of these while losing on the others, so a single number never settles which is better.
The sparse autoencoder objective and the attribution rule
x̂ = bdec + Σi=1^m fi(x) di
ℒ = ‖x − x̂‖₂² + λ Σi fi(x) ‖di‖₂
As→t = as · ws→t
x— the model's activation at the chosen site, d dimensions. For a transcoder the target is the MLP's output rather than x itself.fi(x)— the activation of feature i: nonnegative, and zero for almost every i on any one token.di— feature i's decoder direction, a column of Wdec. This direction is what the model's representation is claimed to contain.bdec— a learned offset, subtracted before encoding and added back after.λ— the price of a firing feature: how much reconstruction error training will accept to switch one off. Multiplying by‖di‖closes the escape of tiny activations on huge directions.As→t— the attribution from node s to node t in the replacement model: the source's activationastimes the virtual weightws→tthrough the residual stream and the frozen attention.
At the extremes: with λ = 0 reconstruction is perfect and the code is dense, so it is no easier to read than the neurons. As λ grows without limit every feature dies and x̂ collapses to bdec. With m = d there is no room to unpack superposition; as m grows very large, features keep splitting into finer variants, which is why dictionary size is a choice and not a discovery.
What sparse-feature studies ran, and what they showed
The method's evidence comes from a short run of public studies, each scaling up the one before. All five below are named by their own titles; none of their results should be read as coming from a single paper.
| Study | Model and dictionary | Headline result |
|---|---|---|
| Toy Models of Superposition (Elhage et al., Anthropic, 2022) | small ReLU toy networks | sparse features are stored in superposition, with sharp transitions as sparsity changes |
| Towards Monosemanticity (Bricken et al., Anthropic, 2023) | one-layer transformer with a 512-neuron MLP | dictionary features far more interpretable than neurons; features split as the dictionary grows |
| Scaling Monosemanticity (Templeton et al., Anthropic, 2024) | Claude 3 Sonnet residual stream; 1M, 4M and 34M features | multilingual, multimodal and abstract features; clamping a feature steers behaviour |
| Scaling and Evaluating Sparse Autoencoders (Gao et al., OpenAI, 2024) | GPT-4 activations; TopK autoencoder with 16M latents | clean scaling laws in dictionary size and sparsity, with very few dead latents |
| Circuit Tracing and On the Biology of a Large Language Model (Anthropic, 2025) | Claude 3.5 Haiku; cross-layer transcoders | attribution graphs for multi-step recall, planned rhymes and more, checked by interventions |
The positive case is that unpacking superposition the way the theory says makes features legible, and that interventions on those features change behaviour in the predicted direction. The Golden Gate Bridge feature in Claude 3 Sonnet, clamped high, made the model bring up the bridge in unrelated answers.
The negative results are just as consistent. Splicing a reconstruction back into the model raises next-token loss noticeably even with very large dictionaries, so part of every computation lives in the error. Attribution graphs freeze attention, so they explain what the MLPs did given where attention looked, not why it looked there. Features split, and broad features can be absorbed by narrower ones, which makes a feature's meaning depend on the dictionary. And in 2025 Google DeepMind's interpretability team reported that sparse-autoencoder features did worse than plain linear probes at detecting harmful intent on new data, and deprioritized that line of work.
What is admitted, and where this stands
This rung's own literature is the most explicit about its limits of anything on the site, which is appropriate for a field this young. The dictionary you learn is not guaranteed to be the model's features — it is a decomposition that reconstructs well and is sparse, and those criteria do not uniquely determine an answer. Make the dictionary larger and features split into finer variants, which is either a more precise decomposition or an artefact of the method, and distinguishing those two is an open problem rather than a detail.
Coverage is the second admission. The circuits that have been traced end to end are for narrow, carefully-chosen behaviours, and there is a very large gap between explaining one behaviour in one model and explaining a model. The reconstruction-versus-sparsity trade means some of the activation is always left unexplained, and what hides in that residue is unknown by construction.
Where it stands: as the most active open question about the systems the rest of this site describes, and as the only line of work that could turn claims about what a model "knows" into measurements. Two things are worth holding at once. Superposition is a strong, well-supported explanation for why naive inspection fails, and it was validated by making a prediction that came true: unpack the code as the theory says, and legibility improves. Whether the features recovered are the ones the model uses remains, honestly, contested — and the people doing the work say so more clearly than their summarisers do.
Pack three features into two dimensions
Superposition sounds impossible until you count directions. Two orthogonal features fit a 2-D space exactly (their dot product is 0). But place three unit vectors at 120° apart and they also live in 2-D — with a bounded interference of −0.5 between each pair. That's more features than dimensions. And because features are sparse, reading one back when it's the only active feature is perfectly clean. Change the vectors and watch interference and readout move.
Write the body of decode. Everything else in the file is
already written; this is the function the paper is about. Press ▶ Run to check it against
the 5 assertions below — they start red.
- An orthonormal basis has self-dot 1 and cross-dot 0
- Three feature vectors live in 2-D — more features than dimensions
- Superposed features keep unit length (self-dot 1)
- Pairwise interference is bounded at 0.5, not 1 — still distinguishable
- Sparse readout: with one feature active, recovery is clean (== 1)
Questions people ask about Concept Circuits
What is an attribution graph and how is it built?
An attribution graph is a map of which internal features caused one specific output of a language model on one prompt. To build it, researchers replace the model's MLPs with transcoder features, freeze the attention patterns and normalization from the real forward pass, and add error nodes that hold whatever the transcoders failed to reconstruct, so the replacement matches the real model exactly on that prompt. With attention frozen, every interaction is linear, so each edge weight is the source feature's activation times a fixed virtual weight. The graph is then pruned to the nodes that matter most for the chosen output, grouped into supernodes by hand, and checked by suppressing or injecting features in the real model.
How does a sparse autoencoder find features in a language model?
It learns an overcomplete dictionary. Activations from one layer are encoded into many more feature activations than the layer has dimensions, up to millions, under a penalty that keeps nearly all of them at zero on any token. A linear decoder must rebuild the activation from the few that fire, so each feature's decoder direction becomes a reusable building block. Because the model itself appears to store features as nearly orthogonal directions in superposition, a sparse code tends to recover directions that each mean one thing, such as a language, a code construct or a named entity. Each feature is then labeled from the text that activates it most and tested by adding or removing its direction.
What is the difference between a sparse autoencoder and a transcoder?
A sparse autoencoder reconstructs the same activation it reads: input and target are the same vector. A transcoder reads an MLP's input and predicts that MLP's output through a sparse layer of features, so it imitates the computation rather than the representation. That makes transcoders better suited to circuits: their features replace the MLP, and the path from one feature to the next becomes linear and inspectable. Anthropic's cross-layer transcoder extends the idea so each feature reads at one layer and writes to the MLP outputs of every later layer. A transcoder is still an approximation, so whatever it misses has to be carried as an error term.
What are dead latents in a sparse autoencoder, and why do they matter?
A dead latent is a dictionary feature that stops firing on every input during training. Once it never activates it receives no gradient, so it cannot recover, and the dictionary effectively shrinks. In large autoencoders this can waste a big share of the features unless it is managed. Anthropic's Towards Monosemanticity re-initialized dead features toward inputs the autoencoder reconstructed poorly. OpenAI's Gao et al. used TopK activations, careful initialization and an auxiliary loss that trains otherwise-idle latents on the remaining reconstruction error, and reported very few dead latents even at 16 million features. The dead fraction is one of the standard health metrics.
Do sparse autoencoder features show what a model really uses?
Partly, and this is contested. In favor: features found this way are far more interpretable than neurons, and editing them changes model behaviour in the predicted direction, as with the Golden Gate Bridge feature in Claude 3 Sonnet or the Texas-to-California swap in Anthropic's circuit tracing work. Against: the dictionary is one of many sparse decompositions that reconstruct well, it splits or absorbs features as its size changes, and the reconstruction error leaves part of the computation unexplained. In 2025 Google DeepMind's interpretability team reported that SAE features did worse than linear probes on a practical detection task and deprioritized the approach. The researchers themselves state these limits openly.
4 questions to test what you just read
Work each one out before you open it — a number, a prediction or a reason, not a definition. Producing the answer is what makes it stick. Your progress is kept on this device.
An autoencoder on a 4,096-dimensional residual stream uses a 16× expansion and runs at L0 = 64. How many features does it have, and what fraction is active on a typical token?
Show answer
4,096 × 16 = 65,536 features. With 64 active, the fraction is 64 / 65,536 ≈ 0.1%. That extreme sparsity is what makes each feature readable, and also why most features are silent on any one token.
Feature A has activation 2.0 and a virtual weight of 0.3 to target T; feature B has activation 0.5 and weight 1.0. Which contributes more to T, and by how much?
Show answer
Attribution is activation times weight: A gives 2.0 × 0.3 = 0.6, B gives 0.5 × 1.0 = 0.5. A contributes 0.1 more even though B's connection is three times stronger, because A fired four times as hard. Ranking edges by weight alone would get this backwards.
If a dictionary's reconstruction explains 90% of the activation variance at a layer, what does the error node carry, and why does it limit the graph?
Show answer
The error node carries the remaining 10% of the variance: real computation the features did not capture. It is drawn as one opaque node, so any influence routed through it is unexplained. A graph whose output depends heavily on error nodes tells you less than its tidy feature labels suggest.
Why would an autoencoder with m = d and no sparsity penalty be no more interpretable than the neurons, even though it reconstructs perfectly?
Show answer
With m = d and no penalty, any invertible change of basis reconstructs perfectly, including the identity, so nothing pushes the code toward directions that mean one thing. Superposition puts more features than dimensions into the space; recovering them needs both more dictionary entries than dimensions and a sparsity pressure that picks one decomposition.
The Transformer
The architecture itself: what it replaced, how position is encoded once recurrence is gone, and what it turns out to have learned inside.
- 1Seq2Seq2014
- 2Attention Is All You Need2017
- 3RoPE2021
- 4Concept Circuits2026
Explore the topic
See this alongside everything else on the same subject — handbooks, system designs, challenges and tools, in one place.
More Paper Breakdowns
- Attention Is All You NeedThe paper that introduced the Transformer — the architecture underneath GPT, BERT, Claude, and Gemini. Self-attention, Query/Key/Value, multi-head attention, positional encoding, and the real BLEU results, explained in depth with analogies and animated visuals, not just equations.Read →
- BERTThe paper that made "pre-train once, fine-tune anywhere" the default for NLP. Bidirectional context, masked language modeling, next-sentence prediction, the [CLS]/[SEP] tokens, and the GLUE sweep — explained with analogies, not just equations.Read →
- Chain-of-Thought PromptingShow a model a few worked examples with their reasoning and it starts solving problems it used to fail. Why reasoning emerges only at scale, the GSM8K jump, zero-shot "Let's think step by step", and how CoT seeded modern reasoning models.Read →
- LoRAThe paper that made fine-tuning affordable. Freeze the giant pretrained model and train two tiny low-rank matrices instead — up to 10,000x fewer trainable parameters, no extra inference latency, and swappable per-task adapters. The road to QLoRA and PEFT.Read →
- Direct Preference OptimizationRLHF without the RL. Align a model to human preference pairs with one simple classification-style loss — no separate reward model, no unstable reinforcement learning. Why "your LM is secretly a reward model", and how DPO became the default alignment method.Read →
- ChinchillaThe compute-optimal scaling law that said models were too big. Parameters and training tokens should scale together — ~20 tokens per parameter — so a 70B model trained on 1.4T tokens beat the 280B giants. Why every model since trains on trillions of tokens.Read →