Decompose one layer of a 4B language model into 40,960 browsable, human-labeled concepts with a single sparse-autoencoder run
| Building | A general-purpose sparse autoencoder that turns Qwen3-4B into a browsable atlas of 40,960 labeled concepts |
| Models | Qwen3-4B (subject) · Claude Sonnet (autointerp labeler + intruder-test judge) |
| Topics | Language Models · Sparse autoencoders · Autointerpretability |
A language model does not store its concepts one-per-neuron. Individual neurons fire for many unrelated things at once, so reading a model's internal state directly is hard. This recipe takes the standard remedy and runs it end to end: train a sparse autoencoder (SAE) on one layer of Qwen3-4B, which re-expresses the layer's activity as a wide dictionary of features that each fire sparsely, then have an LLM label every feature and check that the labels hold up. The output is a discovery atlas, a general-purpose dictionary meant for browsing what the model represents, rather than a dictionary tuned for one behavior.
A labeled dictionary is what makes a model's internals usable rather than merely visible. Once each concept has a name, the features become building blocks for concrete work: locating where the model represents a topic, monitoring whether a behavior is active as it generates, or steering its output by turning a concept up or down. That is far more tractable than the raw alternative, where a single activation vector blends thousands of concepts into numbers no person can read. Silico trains SAEs with autointerp natively: a single scoped experiment harvests the activations, trains the dictionary, and labels every feature, so producing an atlas is a matter of pointing the run at a model rather than stitching a toolchain together.
This recipe produces that dictionary for Qwen3-4B and answers the practical question underneath it: how much compute a usable one actually takes. The atlas below is a diverse slice of the finished dictionary. Search the concept labels, then click any feature to read the real passages it fires on, with the triggering token highlighted.
40,960 features, 0.76 of held-out variance, 0% dead at a modest 200-million-token budget: at expansion factor 16, where dead features are the usual failure, this run left none, and every feature carries a label that passes a blind check.
This recipe builds a healthy, fully-labeled feature dictionary for Qwen3-4B at layer 18, then publishes it as the browsable atlas above.
Key takeaways
As a language model reads text, every token turns into a long list of numbers, an activation vector, that holds what the model currently has in mind. For Qwen3-4B that list is 2,560 numbers wide at each layer. The trouble is that these numbers do not line up neatly with concepts. The model tracks far more distinct ideas than it has numbers to hold them, so it packs several unrelated concepts into overlapping combinations of the same numbers. This packing is called superposition, and it is the reason staring at a raw activation vector tells a person almost nothing.
A sparse autoencoder (SAE) is a small network trained to undo that packing. It helps to picture it as a translator with a large menu of concepts, its dictionary. For each activation vector that comes in, the SAE picks out the handful of menu items that best explain it and reports how strongly each one is present. Those menu items are the features, and because only a few are ever active at once, the description is sparse: a short, readable list of named ingredients in place of 2,560 entangled numbers.
The SAE learns this menu on its own, with no labels. It is an autoencoder, which means it is trained to compress each activation into that short sparse list and then rebuild the original vector from it. When the rebuilt vector lands close to the real one, the menu items it leaned on must have captured what mattered. Two knobs set the shape of the menu. The expansion factor says how many more dictionary entries there are than input numbers (16 times as many here, giving 40,960 features), on the bet that a bigger menu splits concepts more finely. The sparsity budget, k, fixes how many features may be active on a single token (64 here). This recipe uses a BatchTopK SAE, a variant that simply keeps the k largest feature activations and zeroes the rest.
A menu of 40,960 entries is only useful once the entries are named, so the final step labels them automatically. For each feature, an LLM reads the passages where that feature fires most strongly and writes a short description of what they share, for example "buttermilk as a recipe ingredient" or "aircraft carrier references". This autointerpretation pass is what turns the atlas from anonymous vectors into the searchable concepts the browser above is built on. The main thing to watch for is a dead feature, a menu entry that never fires on any text and so carries no meaning, and a healthy dictionary keeps that count low.
Training an SAE is the easy part; knowing whether the result is trustworthy is the point. A dictionary can reconstruct the layer poorly, waste capacity on features that never fire, or carry labels that read well but do not match where the feature actually activates. Silico checks both the dictionary's health and its labels in the same experiment that trains it, on held-out activations the SAE never saw, and gates the run on those checks before reporting a result.
Does a wider dictionary find sharper concepts? Fork the run and sweep expansion factor across 8, 16, and 32 at a matched token budget, watching the dead-feature rate and intruder score to see where wider stops paying off.
Do different layers carry different kinds of concepts? Point the same recipe at a second layer, one earlier and one later than 18, and compare the atlases to see which concepts appear where in the network.
What can the atlas do beyond browsing? Build a probe or a steering vector on top of a labeled feature and test whether the concept the label names actually drives the model's behavior.