# Self-explaining SAE features

TL;DR
=====

*   We apply the method of [SelfIE](https://arxiv.org/abs/2403.10949)/[Patchscopes](https://arxiv.org/abs/2401.06102) to explain SAE features – we give the model a prompt like “What does X mean?”, replace the residual stream on X with the decoder direction times some scale, and have it generate an explanation. We call this **self-explanation.**
*   The natural alternative is auto-interp, using a larger LLM to spot patterns in max activating examples. We show that our method is effective, and comparable with Neuronpedia’s auto-interp labels (with the caveat that Neuronpedia’s auto-interp used the comparatively weak GPT-3.5 so this is not a fully fair comparison).
*   We aren’t confident you should use our method over auto-interp, but we think in some situations it has advantages: no max activating dataset examples are needed, and it’s cheaper as you just run the model being studied (eg Gemma 2B) not a larger model like GPT-4.
    *   Further, it has different errors to auto-interp, so finding and reading both may be valuable for researchers in practice.
*   We provide advice for using self-explanation in practice, in particular for the challenge of automatically choosing the right scale, which significantly affects explanation quality.
*   We also release a [tool](https://colab.research.google.com/drive/1_geSRb0oPFTsSoiEhUJoYjCQv3JmK4R_?usp=sharing) for you to work with self-explanation.
*   We hope the technique is useful to the community as is, but expect there’s many optimizations and improvements on top of what is in this post.

Introduction
============

*This work was produced as part of the ML Alignment & Theory Scholars Program - Summer 24 Cohort, under mentorship from Neel Nanda and Arthur Conmy.*

SAE features promise a flexible and extensive framework for interpretation of LLM internals. Recent work (like [Scaling Monosemanticity](https://www.anthropic.com/research/mapping-mind-language-model)) has shown that they are capable of capturing even high-level abstract concepts inside the model. Compared to MLP neurons, they can capture many more interesting concepts.

Unfortunately, in order to learn things with SAE features and interpret what the SAE tells us, one needs to first interpret these features on their own. The current mainstream method for their interpretation requires storing the feature’s activations on millions of tokens, filtering for the prompts that activate it the most, and looking for a pattern connecting them. This is typically done by a human, or sometimes [somewhat automated](https://openaipublic.blob.core.windows.net/neuron-explainer/paper/index.html) with the use of larger LLMs like ChatGPT, aka auto-interp. Auto-interp is a useful and somewhat effective method, but requires an extensive amount of data and expensive closed-source language model API calls (for researchers outside scaling labs) 

Recent papers like [SelfIE](https://arxiv.org/abs/2403.10949) or [Patchscopes](https://arxiv.org/abs/2401.06102) have proposed a mechanistic method of directly utilizing the model in question to explain its own internals activations in natural language. It is an approach that replaces an activation during the forward pass (e.g. some of the token embeddings in the prompt) with a new activation and then makes the model generate explanations using this modified prompt. It’s a variant of activation patching, with the notable differences that it generates a many token output (rather than a single token), and that the patched in activation may not be the same type as the activation it’s overriding (and is just an arbitrary vector of the same dimension). We study how this approach can be applied to SAE feature interpretation, since it is:

*   Potentially cheaper and does not require large closed model inference
*   Can be viewed as a more truthful to the source, since it is uses the SAE feature vectors directly to generate explanations instead of looking at the max activating examples

How to use
==========

Basic method
------------

We ask the model to explain the meaning of a residual stream direction as if it literally was a word or phrase:

> *Prompt 1 (<user>/<assistant> replaced according to model input format):* <user> What is the meaning of the word “X”? <assistant> The meaning of the word “X” is “<model completes>

We follow most closely [SelfIE](https://arxiv.org/abs/2403.10949). We replace the residual stream at positions corresponding to the token “X” at Layer 2 (though Layer 0 or input embedding works as well) and let the model generate as usual. The method can be implemented in a few minutes with most mechanistic interpretability frameworks.

We provide a simple NNSight implementation in this Colab notebook: [Gemma SAE self-explanation](https://colab.research.google.com/drive/1_geSRb0oPFTsSoiEhUJoYjCQv3JmK4R_?usp=sharing)

TransformerLens implementation (slightly worse): [TL Gemma self-explanation](https://colab.research.google.com/drive/11h0PsSkjBELCBCNFXdc0rHFHFWttJYXW)

Metrics for choosing scale and evaluating
-----------------------------------------

We find that the magnitude (or *scale*) of the embedding we insert is a very sensitive hyperparameter. The optimal scale can also vary with residual stream norm. The method will produce fake or overly vague explanations when the scale is too low or too high:

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfWW8itgibChR6pPH86_qfXTvsl4MCJslRVBGn3gmZhG_4D2C5UW3ApycPw5b6mSsdbAu9mT-K8dKNpesvJH9eTDSJirdIYRFl9oOr3-4oteAeE9FvPZb-0X1bl2hOcEGcCv0afVfszYMuaKjt_-iPPAsA?key=4r-888oRZ4_LicCe8-3l6Q)

Auto-interp and self-explanation

With the scale being too low, we often encounter a wide range of contradictory explanations. Conversely, should the scale be too high, the model tends to generate overly generic explanations, such as "a word, phrase, or sequence of words used to refer to something specific," as shown in the previous example.

This issue significantly hinders the method's usefulness for feature interpretation, as users must examine generations at all scales to grasp the feature's meaning. Furthermore, it impedes any automatic scheme for generating explanations.

To address these issues, we explore several metrics that analyze the model's externals during generation to heuristically find the best scale for a selected feature.

### Self-Similarity

We face two main difficulties when using the method without scale optimization:

1.  Low scales produce incorrect explanations
2.  High scales produce generic explanations

The simplest explanation for why low scales result in incorrect interpretations is that the signal may be too weak for the model to detect. If the model does pick up the signal, we expect it to store this information somewhere in the context used to generate the explanation.

The first place to look for this context would be the last layer residual stream of the last prompt token, as it should contain much of the information the model will use to predict the answer. This leads us to our first metric, which we call **self-similarity**.

Self-similarity measures the cosine similarity between the 16th layer residual stream of the last prompt token and the original SAE feature.

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdIUgD1NOnbfxtKQ1iBaO3Wak0Lt9snnfeo3Nc0H5uSthrzGvNH8D5cnq9Jtsvx2GQ6yPTmpJNTVwKzwW_m_ye1Wzd9MCGz41_hMRjOQqc9ZuzynUTFLdE3Yugyvsiats8DtzVFRyaLVCwjkmtHLp5tXOo?key=4r-888oRZ4_LicCe8-3l6Q)

Illustration of self-similarity computation

Self-similarity alone isn't reliable for choosing the best scale for different features. One problem is that self-similarity continues to increase beyond the optimal scale, even when the model starts giving generic explanations. This growth makes it challenging to use self-similarity as a simple way to find the optimal scale. Despite these limitations, low peak self-similarity often indicates a feature that's difficult to explain using this method.

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfv7QqB_8VF0E2wHTr8fx2VcpmJX2_0EYVJ7IpSWOu0U2M7ksyMtwGxC5AWTwSINWiK66l0v1tBfMiJUKyyRnoFko5HGqOMkksmX0nAeVCLzWgbYg-8Ip8IRI5gZrqN9KFxTt2WQpfFpHkBaPi3vyn7DhoP?key=4r-888oRZ4_LicCe8-3l6Q)

Self-similarity for the "cute"/"adorable" feature [4040](https://kisate.github.io/feature-dashboard/?targetFeature=4040)

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdUJuqm2Iy-rEXI3WCWgbx1sRdU0p-fSWsry5CGwUvkUl5VrHYnTvTu4VMUpuN4aJxVXbWlJGMHl-6hOzXsK2l5r3zMI86Xq4PHlUDdmBInXjzn-jqVqMpPIFdwA_bLtSlXKa8ve0RMz1UdD6-nj-4OsZGq?key=4r-888oRZ4_LicCe8-3l6Q)

"cute"/"adorable" feature [4040](https://kisate.github.io/feature-dashboard/?targetFeature=4040) self-explanations

### Entropy

The second metric we explore to evaluate explanations is based on the predicted distribution of the answer's first token. Initially, this distribution is represented as $P(t_n|t_{1..n-1})$. However, since we insert the SAE feature direction into one of the prompt tokens, the distribution becomes $P(t_n|t_{1..n-1}, f)$, where *f* is the SAE feature index.

This metric uses entropy, which measures certainty. The entropy decreases as the mutual information between the random variable representing the feature and the first answer token increases. We calculate this metric by measuring the entropy of the predicted distribution for the answer's first token.

This approach provides another way to detect whether the model will produce a generic or random explanation. 

*Further (speculative) justification can be found in appendix.*

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfzmix4NeybMA_EGxoE__jtyzoMstB5_DV3YUqxIydDN7Ah1_tHci8-6uGHp3EelwtY9VBELuhoT-0d_pWd1vApiMFx13pW22QnJbTsVE0nZOn77JDsysLAs_W-8KDBj4rcNFGM1xnFuFgAgfqzN3Y6oimQ?key=4r-888oRZ4_LicCe8-3l6Q)

Entropy for the "cute"/"adorable" feature [4040](https://kisate.github.io/feature-dashboard/?targetFeature=4040)

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXfY4aMoDEiCccgm5Zg_DBBRbjSzXM1MF-YAQu76mVAN29vBLbp216HkoZpkitDwoIa0rDVmR_Xtnh1LhrUUQTjd8bwmnXBedIY1_jeAqOy2J-WU1yLKVcn52O_wtr8S-hONYB4rR32iSUdZW6XwDxhBd-uT?key=4r-888oRZ4_LicCe8-3l6Q)

Entropy for the "collection" feature [4079](https://kisate.github.io/feature-dashboard/?targetFeature=4079)

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdgOtd5zYo4XdllXMNqQPETsANaVGbdYJL0TI9W3spHUYJGFgfrj0j0qro8yHMo0LsTpRZnhZO4IBLuFYeW9d07TRO6obMQ7gxBo35x1mW7T6XQMqOyGpYqh5XoMLs3xnq7Ztlz7NuSLxIn4yWXnvM3AooH?key=4r-888oRZ4_LicCe8-3l6Q)

"collection" feature [4079](https://kisate.github.io/feature-dashboard/?targetFeature=4079) self-explanations

Examples above show that this metric tends to:

*   Grow with higher scales
*   Often have a local minimum at scales ranging from 30-50

This local minimum frequently coincides with the optimal explanation scale. The growth of the entropy metric at higher scales also helps detect cases where the model loses feature meaning and starts generating generic text.

However, entropy alone is insufficient for ranking generations because:

*   Its global minimum is usually at lower scales
*   Sometimes it's at scale 0

### Composite

The entropy metric's ability to identify explanation degradation at higher scales allows us to combine it with the self-similarity metric. This composite ranks the optimal scale in the top-3 list for a much larger percentage of cases compared to either self-explanation or entropy alone.

To calculate this composite metric:

1.  Normalize both self-similarity and cross-entropy (due to their noticeably different magnitude ranges)
2.  Take their weighted difference using a hyperparameter alpha

Note: While we didn't extensively tune this parameter, this approach has produced a decent baseline. We expect there may be better ways to combine these metrics, such as using peak-finding algorithms.

$$
\text{composite}(x) = \alpha\cdot \text{self-similarity}(x) - (1 - \alpha) \cdot \text{entropy}(x)
$$

$$

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdvksItfTJLI-lj9MErpw_ayLguEjmguxDOYEsOfsMxofCCDxIyfkaJx4KJ4IX4CydZVc_cbDnZWLUMVAxOdHcm0LOnCqiCDkTCJ4U_XU_PqARav6SicgKQhDdyLHGtEJInnSBVmuZsUWEK0CNe9tDpw41y?key=4r-888oRZ4_LicCe8-3l6Q)

Metrics for the "mission" feature [4088](https://kisate.github.io/feature-dashboard/?targetFeature=4088)

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXejgcmKjwcl1G6GGPkjk_EG0E7y-USsbH67s8tMJY_aK6Rzh8PnNq1l0P7NW92WTpGOOqarl6xYk7Bi05U_75VmVep4gWu6BebWZNixMVI04d85OiWA6Mh56WNFjdfreq61PsZrPiT8hxDzBU9iW7JKiso?key=4r-888oRZ4_LicCe8-3l6Q)

"mission" feature [4088](https://kisate.github.io/feature-dashboard/?targetFeature=4088) self-explanations

Other experiments
=================

We explored two additional approaches in our experiments:

1.  [Classifier-free guidance](https://arxiv.org/abs/2306.17806) for self-explanation: We applied this using activation patching with the normalized mean of word embeddings as our unconditional prompt. This approach didn't significantly improve results, and performance degraded at scales above 2.
2.  Cross-entropy metric: This metric used the first answer token predicted distribution, similar to entropy calculation, but compared it with the distribution for an average token embedding. Unfortunately, it behaved similarly to entropy in most cases and wasn't particularly useful.

Evaluation
==========

Our evaluation process consisted of two main steps to measure agreement between our method and [auto-interp](https://openaipublic.blob.core.windows.net/neuron-explainer/paper/index.html), the current standard for SAE feature interpretation.

Step 1: Automated Evaluation 

We used half of the Gemma 2B layer 6 residual stream SAE features from neuronpedia. For each feature, we:

*   Generated 32 explanations at scales from 0 to 200
*   Removed those with low maximum self-similarity values
*   Used Llama 70B to score agreement with auto-interp explanations

We tried two setups:

*   All 32 explanations: achieved about 51% accuracy
*   Top-3 explanations by composite metric: reached approximately 54% accuracy

Step 2: Manual Evaluation 

We randomly sampled 100 features where the explanations disagreed in the first setup and manually evaluated them.

Comparison Challenges: 

Comparing auto-interp and self-explanation is tricky due to their different approaches:

*   Auto-interp examines maximum activating examples to extract patterns and summarize them
*   Self-explanation prompts the model to extract "meaning" from the SAE feature direction

This difference can lead to self-explanation capturing the meaning of the concept a feature represents while struggling to present the concept itself. The "**compile**" feature ([11866](https://kisate.github.io/feature-dashboard/?targetFeature=11866)) serves as a good example of this distinction.

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/701a8eea1e425371ee1df4163bff5910a614356b957b9b16.png)

Top-3 self-explanations for the "compile" feature [11866](https://kisate.github.io/feature-dashboard/?targetFeature=11866)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/e76820e2cc69045266c6909a61a8aee6573669396e3040b1.png)

"compile" feature [11866](https://kisate.github.io/feature-dashboard/?targetFeature=11866)  max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/404144731cc7fff27a1519f2bf6e299876c81ccf68ea5a71.png)

"compile" feature [11866](https://kisate.github.io/feature-dashboard/?targetFeature=11866)  lower activating examples

In the "**compile**" feature examples we can notice a common pattern found in many studied SAE features. The feature has all of its strongest activations specifically on the word "compile", while weakly activating on some synonyms. Auto-interp accurately identifies this as a "compile" feature, while self-explanation conveys the broader meaning of the word. This discrepancy led us to conduct two separate manual evaluations, each with a different level of interpretation flexibility for self-explanation results.

To address this issue, we explored additional explanation generation using a different prompt style, which we'll discuss in the next section.

Evaluation Results:

1.  More Forgiving Setup (out of 100 explanation pairs):
    *   Self-explanation is correct, auto-interp is not: 33
    *   Both methods are correct: 30 (contradicting Llama 70B's judgment)
    *   Both methods are incorrect: 15
    *   Feature is difficult to interpret: 8
    *   auto-interp is correct, self-explanation is not: 9
    *   Both are correct, but correct answer not in top 3: 5
2.  Stricter Setup (the same 100 pairs):
    *   Both methods are correct: 29
    *   Auto-interp is correct, self-explanation is not: 21
    *   Self-explanation is correct, auto-interp is not: 20
    *   Both methods are incorrect: 15
    *   Both are correct, but correct answer is not in top 3: 10
    *   Feature is difficult to interpret: 5

During manual evaluation, we noticed that auto-interp explanations from neuronpedia often seemed to use only a limited number of maximum activations. The authors later confirmed that these explanations were created using a simplified auto-interp setup that only considered a few maximum activating examples. They also used just a GPT-3.5 model to analyze them.

This observation highlights an advantage of our method: it doesn't require an expensive model to function effectively. The evaluation results suggest that self-explanation for SAE feature explanation may be at least as accurate as auto-interp, if not more so. Moreover, our method provides a more direct way to extract feature meaning while covering the full range of its activations simultaneously.

Limitations and improvements
============================

Recovering the activating token
-------------------------------

As discussed above, the self-explanation method still has several limitations. The most prominent issue is that the model currently struggles to produce the exact activating token, and not just its meaning in the explanation. This becomes very apparent, when the explained feature does not correspond to some meaning, but activates mostly on grammatical patterns (e.g. a single token feature, or a word with “j” in it feature). A good example of such a feature is the [14054](https://kisate.github.io/feature-dashboard/?targetFeature=14054) “Char” feature that activates just on words starting with “Char”.

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/0189a36875fc0f19cf8c364e6aab98ccd34c09ef3f0de0e8.png)

"Char" feature [14054](https://kisate.github.io/feature-dashboard/?targetFeature=14054)  max activating examples

While trying to explain this feature, the model sometimes generates explanations related to some word starting with “char”. For example: “a give or gift" (charity) or “'something that is beautiful, pleasant, or charming, especially”. Although it is practically impossible to determine, that this is actually just a “char” feature from these explanations.

To handle this issue, we additionally experimented with prompts similar to 

> <user> Repeat "X" four times exactly as it is written. <assistant> \\n1. "X"\\n2. "X"\\n3. "X"\\n4. “<model completes>

Prompts like this are aimed to make the model repeat the tokens that activate the feature, without trying to uncover the actual meaning behind this feature. And this method does actually work to some extent. For example, it gives these explanations for the “Char” feature at different scales:

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/75f77d46d372411ac59ba16173e416475f702d29bdc01c76.png)

The metrics in this case look like this:

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXchQ1ChsBuZRbUofFy0dBTJfDACHezrtEIH0h8sy_IDEIKBGrioOf1Vu0ilsfyCQ1QKp7SW6kGkyJW6B7LQLzFGK16aCUeUkEjHgdEBrVbcuSFVOia56z0fF_CZp-_6HPPmgJLgFjNv05nIEYYyo70Z0f8O?key=4r-888oRZ4_LicCe8-3l6Q)

“Char” feature [14054](https://kisate.github.io/feature-dashboard/?targetFeature=14054)  metrics  
Red: composite metric; blue: self-similarity; green: entropy.  
Metric value normalized by maximum plotted against scale

This prompt style allows us to generate complementary feature explanations to handle the cases, when the feature represents some token, and less the meaning behind it. Our scale optimization techniques also work with this form of the prompt, and usually show a bit higher self-similarity value. Although self-similarity charts are often similar for both prompts. This means that this method will not help in cases, when the self-explanation fails due to a low self-similarity.  

Failure detection
-----------------

While self-explanation is effective for many features, it doesn't perfectly explain every given feature. In some cases, it fails completely, though most of these instances were challenging to interpret even for the authors. Here's an overview of our current failure detection methods and their limitations:

### Maximum Self-Similarity Thresholding

This is our primary method for detecting failing cases. It effectively identifies many model mistakes but has both false positives and false negatives. For example:

*   False Positive: Feature [l12/2060](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=2060) (that we explain as "a reference from 'the first' to 'the second'") has low self-similarity, yet both prompt styles capture some of its meaning.
*   False Negative: The "Sara"/"trace" [8912](https://kisate.github.io/feature-dashboard/?targetFeature=8912) feature has high self-similarity, but both prompts fail to interpret it correctly.

### "Repeat" Prompt Failure Detection

Failures in the "repeat" prompt are generally easier to identify:

*   Most failures result in a " " or "repeat" prediction, with the latter likely copied from the prompt.
*   Complete failures typically produce " " or "repeat" across most scales, with disconnected tokens on the few remaining scales.

### Layer-Specific Thresholds

An additional complication is that features from different layers seem to have different average self-similarity scores. This means:

*   Self-similarity thresholds need to be optimized separately for different layer SAEs and probing layers.
*   This complexity makes the use of self-similarity thresholding more challenging.
*   However, a self-similarity score higher than ~0.01 generally indicates a successful explanation generation.

While our current failure detection methods are useful, they have limitations. Improving these methods to reduce false positives and negatives, and developing more robust layer-specific thresholds, remain areas for future refinement in the self-explanation approach.

Prior work
==========

As discussed in the introduction, [auto-interp](https://openaipublic.blob.core.windows.net/neuron-explainer/paper/index.html) is a key method for interpreting the linear features in Sparse Autoencoders. State-of-the-art auto-interp approach requires extensive large model inference, so our current scope we only use a simpler version already available at neuronpedia for comparison.   

Our method is very similar to [SelfIE](https://arxiv.org/abs/2403.10949), [Patchscopes](https://arxiv.org/abs/2401.06102) and [mwatkins’s earlier explanation method](https://www.lesswrong.com/posts/c6uTNm5erRrmyJvvD/mapping-the-semantic-void-strange-goings-on-in-gpt-embedding), but we apply these techniques to SAE features. We choose to focus on the explanation aspect and evaluate self-explanation as an alternative to auto-interp. We discover the importance of scale and develop metrics for tuning it and discovering when explanation does not work. Our entropy metric is similar to Surprisal from Patchscopes, but we apply it in a different context. We also apply the method to mass-explaining SAE features and discover that it can produce explanations for abstract features.

Examples
========

Gemma 2B
--------

### Random simple features

[L12/2079](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=2079), interjection feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/6a2193f99062fb588d5945ab73ea78fcc939f844de4a12ae.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/53a19fd4293c4c5f1b654fe8de42a8b8bd964f8bd4dc623b.png)

Top-3 self-explanations

[L12/2086](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=2086), “phone” feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/15a114048dd21fc242ba90b807c88cf3547f2a03def1c93a.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/722061c7dd3a22a1747e01e5a3ba36f1db06231cdf449334.png)

Top-3 self-explanations (meaning)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/0ce9ce4cba640eba914926ca7ddd63db1961fd4d5c6c77e5.png)

Top-3 "repeats"

[L6/4075](https://kisate.github.io/feature-dashboard/?targetFeature=4075), “inf” feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/512c27f4b7dbd01274aa977edb58a55a6b0585171f0aad42.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/5813f61b42809cac8f8ef00415df3867cc514f065c8fac92.png)

Top-3 self-explanations (meaning)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/b9af1c2f29b43269d3df8071a5249129994bc558d5c1935f.png)

Top-3 "repeats"

### More complex features

[L12/5373](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=5373), same word repetition feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/b4d1c6065f704089be3a7747d154528e11b639ca361fa007.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/c3926a2b36a33993667c69a729eca7052d6c22c426af23bd.png)

Top-3 self-explanations (meaning)

[L12/8361](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=8361), female + male "romantic" pair feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/69a633b3cb020fb517bde01f79e3bc14847c512ce0f3d95e.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/98fb755ee0320e71a94924c89e4a8d8c1e8277a6994307e4.png)

Top-3 self-explanations (meaning)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/53acdbc33dacd5c46c662058f52e3bebe85009bafcc7ca5f.png)

Some other lower scoring explanations

[L12/5324](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=5324), pair of names feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/a1a6abf80150a2d67f0e3aaaf249b5ffd984821dfd103dce.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/3393138483c93e5cf26fe5c3f96a8934358295ac6d3c93f5.png)

Top-3 self-explanations (meaning)

[L12/330](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=330), analogy/connected entities feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/8aa61e0a12beedd4685339f3c086238ad5fad31ddd582303.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/1abdc031c84e16a38331e01c6e1ac042a9fe5d4689900e32.png)

Top-3 self-explanations (meaning)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/d9f8c1cbd380e7294da008837717a2b27495d23de6a5f027.png)

Some other lower scoring explanations

[L12/3079](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=3079), Spanish language feature (possibly connected to some particular concept)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/a261491fb8a214067987e7c784f3eefaff31abd11487f751.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/5f98660999515d9cecbc5a8d3095c686f00525bc5fe54247.png)

Top-3 "repeats"

[L12/12017](https://kisate.github.io/feature-dashboard/?layer=12&targetFeature=12017), opposites feature

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/d623981973fb3a7be21103482a7168c6decf290fe5a494fd.png)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/d9548bb8abc6dbea367eef9e33dfd9d20e483904ef4d8c68.png)

Top-3 self-explanations (meaning)

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/43383741ad279a84727f829177788b9adf0087ed01e03715.png)

Some other lower scoring explanations

Phi-3 Mini
----------

We trained our own Phi-3 Mini SAEs using the setup discussed in the different post. Self-explanation also was able to explain Phi-3 Mini features, although we did not do thorough scale tuning. Some of the interesting features are present below.

### Random features

R5/L20/21147, opening bracket + math feature

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXdH16K_8FJmakPE_Cw1x0P8ZRMnekBBpPGImGvt7vZwe1ROg7r7vFb44cMKt3qiVVoUxPFWx1GDEKr5_l87rrnKoooORIfYY63WJlRSZ2Tw6VQ_-zyvOxPA8dHcUZCwh0ewGFrm31kiAmX53IvenoANVgzg?key=4r-888oRZ4_LicCe8-3l6Q)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/c7fcaec53fd197bb2bdb821538f1ad2b16e6e6c5e4c7abde.png)

Some of the self-explanations

R5/L20/247, “nth” feature

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXcyKpWPsf-JKiABJ95Yrk44ubal4sqL7b7_ngweaZyWo6nbmqvyaPbQPK0w3HHfRYdrvTzY9BgSCa4yXa6lHLSbi0IT1hoz_rMmpNKz1e2HwwuFH7MzAWou4WNf9Y_JE_KKHlj0VoY1oqYLRc8b1AnMO0Lz?key=4r-888oRZ4_LicCe8-3l6Q)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/2aff46ec6dc71c82adbb5047ec670329a45effd1e077f824.png)

Some of the self-explanations

R5/L20/22700, “For … to … “ feature

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeYAnq1hPhsM9ogMTasGuT9guuqbKBqYNwdXq-lqCNEab8R-R1Y36gIE6xk1qokee6Boy72cgCC_R4mdlpI3VGjmKUHrUC02TjmwIFfgNXxzybaW8ESHPL3XwMID6NfZDmoGCJsYpkSadrBodTdcm61hoU6?key=4r-888oRZ4_LicCe8-3l6Q)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/d061336cef68f3e5e18628c5556f47754fa93b80c9f1c83b.png)

Some of the self-explanations

### Refusal features

R6/L16/39432

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXd5sp0eBVw_geMsx28lTksyU6yd5R6H-1zwkK1bCARk1DbdruXIfRZgV0d55p1qzyCuZIIzj9qKwvRHUkcYRjnOtXRgvGTL4Olv_MBofjGK4dAmJoIwWhlyAb45NFYIj978beht1BC8ospXZGCArCj5rD5q?key=4r-888oRZ4_LicCe8-3l6Q)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/c737f4f71bb81a05baae63e686949c93bb1bee5cdc337ae2.png)

Some of the self-explanations

![](https://lh7-rt.googleusercontent.com/docsz/AD_4nXeCnrQM0GEA8YO8FU8-mUUylaLM8neZfweq0lHzlOA0AT-rVfoAY4onAr9HAAm7ao9Jh0jw31avbQrAkK4xbEYIJo00RcRxm4bcW07JvMpx_9IYXOZXufVVnUPg8xmSKEsNfzxzh9OTWk2qgxNs0FdYHKo?key=4r-888oRZ4_LicCe8-3l6Q)

Max activating examples

![](https://39669.cdn.cke-cs.com/rQvD3VnunXZu34m86e5f/images/9a5a3bcea5f4a5fbab54a23679cde01d76e757d58647f1d1.png)

Some of the self-explanations

Acknowledgements
================

This work was produced during the research sprint of Neel Nanda’s MATS training program.  We thank McKenna Fitzgerald for research management and feedback. We are grateful to Google for providing us with computing resources through the TPU Research Cloud.

Appendix
========

Entropy justification
---------------------

*Epistemic status: highly speculative; authors think the theoretical argument is correct but preliminary experiments show this argument is weak and you can safely ignore it.*

Another way to detect whether the model is going to write a generic or random explanation, is to look at the predicted distribution of the answer’s first token P(t|t…). Since we also insert the SAE feature direction in one of the prompt tokens, this distribution becomes P(t|t…, *f*), where *f* is the SAE feature.

In a case when the model is going to output the correct explanation of *f*, we expect the mutual information of t and *f* to be non-zero. On the contrary, if the model ignores *f* and tries to generate a random or generic explanation, this mutual information should be closer to zero.

If we have a set of features for which a particular scale works well, we can assume a uniform prior on features and calculate the unconditional entropy H. Then, the mutual information of the set of features *f* and t will be reflected in the conditional entropy H(t|t…, *f*), and this conditional entropy is expected to be lower for sets of features where the model decides to output the relevant explanation. If we additionally assume that conditional entropies have low variance for those sets of features, then using the conditional entropy is a reasonable way to predict mutual information for the set of features for this scale.