The dictionary only knows its corpus
A sparse autoencoder turns one dense activation vector into a handful of named ingredients. It reconstructs an activation as , where the columns of are feature directions and keeps only a few of them active. Read the active features and you can see what the model is representing, one concept at a time.
The catch is that the dictionary is learned from a corpus. Concepts that rarely dominate the training data never earn a direction, so an SAE trained on general web text goes partially blind on chemical nomenclature, diplomatic language, or another writing system, even when the underlying model handles them fine. On Russian text our general-web SAE explains only 0.455 of activation variance. The model is not confused there; our microscope is.
The obvious fixes are expensive or destructive. Scaling the dictionary until rare concepts reliably appear takes features on the order of billions, as Templeton and colleagues observed. Retraining on domain text risks catastrophic forgetting, and fine-tuning a handful of freshly initialized features gives no guarantee that they land on what is actually missing. We wanted the missing features, exactly those, and nothing else touched.
Train on the error, not the domain
Whatever the pretrained SAE misses is sitting in plain sight: it is the reconstruction error . So we freeze the general SAE and train a second, much smaller one to predict that error on domain text. The booster reads the same activation and outputs , trained with the standard objective . Gradient boosting, applied to interpretability.
One activation, two dictionaries
The mechanismTwo design choices keep the booster polite. It has no decoder bias, so when none of its features fire it adds exactly nothing. And it is tiny: 1,024 features with active per token, next to in the frozen base. At inference we simply add the outputs, , and because each booster only ever modeled error, boosters for different domains stack: .
Adaptation as a plug-in
ModularityThree domains, two backbones, one recipe
Explained variance on domain text
explained varianceThe language model agrees with the reconstructions too. Patching boosted reconstructions back into Qwen drops cross-entropy from 0.935 to 0.767 on chemistry, from 4.716 to 2.060 on Russian, and from 2.464 to 2.279 on UN debates. The same recipe applied to a public Llama Scope SAE moves chemistry from 0.551 to 0.702 explained variance, so the effect is not an artifact of our own base model.
The general domain barely notices. With a booster attached, explained variance on Fineweb-edu changes by at most 0.28 percent across all three domains and both backbones, and cross-entropy by at most 0.21 percent. The residual construction is doing what it promises: the new features live where the old model was silent.
Seven languages, one general-web SAE
explained varianceLanguages make the pattern vivid. The gain tracks distance from the training distribution, and the learned features respect linguistic structure: embedded and projected, booster features cluster with their language family, Slavic beside Slavic and Romance beside Romance, with Japanese in its own island. The boosters are not memorizing text; they are naming structure the base dictionary had no words for.
Against the obvious alternatives
General quality against domain quality
UN-debates explained varianceFull fine-tuning reaches the best domain score, 0.850, and pays with catastrophic forgetting: general explained variance collapses from 0.719 to 0.515. SAE stitching, which grafts the most-changed features of a fine-tuned copy back into the base, preserves the general domain but barely adapts, 0.703 against a no-adaptation baseline of 0.695. Extending the dictionary with 1,024 trainable features comes close to us but needs more active features per token, 64 against our 61, to get there.
Stacking is where the residual construction pulls away. With chemistry, Russian, and UN-debates boosters all attached, UN-debates quality holds at 0.770 and the general domain at 0.715. Stitching under the same triple load degrades to 0.670 on the domain and 0.674 in general, worse than doing nothing for the domain it was adapted to. Modularity is a property of the objective, not a deployment trick.
Are the new features real
Interpretability metrics say the boosted features are not reconstruction filler. Scored with automated detection and fuzzing evaluations over all 1,024 chemistry features, residual features average 0.75 detection against 0.67 for a matched sample of base features, and 0.68 against 0.64 on fuzzing. Reading them directly makes the point better than the scores do.
What the base dictionary offers instead
| SAE Boost feature | Nearest base-SAE features by cosine similarity |
|---|---|
| Oxygen in chemical contexts | numerical thresholds; names of people; risk-related phrases |
| Chemical and thermal stability | durability references; legal protections; safety responsibilities |
| Supramolecular structure formation | protein databases; scientific measurements; mineralogy terms |
| Chemistry energy values | chemical reaction terms; calibration concepts; physics discussions |
| Hydrogen chemistry | personal relationships; compound applications; synthetic processes |
That table is the feature-blindness argument in miniature. The nearest base neighbors of oxygen in chemical contexts are numerical thresholds, names of people, and risk-related phrases: not a coarser oxygen feature, just unrelated directions. The residual signal is learnable precisely because the base dictionary spans none of it.
One practical warning from our training runs: an undertrained booster is worse than none. Below roughly 100 million tokens, half-formed features can cost the general domain up to 31 percent of explained variance; past 200 million tokens the interference drops under 1 percent. Boosters must converge before they are attached. And raising buys little: moving from 5 to 50 active features lifts domain quality only from 0.774 to 0.798 while the active-feature count nearly doubles, so we keep .
A frozen dictionary plus a small residual one covers a new domain for exactly the cost of the features it was missing, and nothing else moves.