“从 Claude 3 Sonnet 里拆出 3400 万个特征”“在 GPT-4 上训练 1600 万个 latent”,这些数字说的是什么?为什么 Google DeepMind 的可解释性团队在 2025 年 3 月宣布暂缓基础 SAE 研究?稀疏自编码器(sparse autoencoder,SAE)把一个激活写成少数几个字典方向的加权和,不用标签就能找出大量读起来像样、还能用来引导模型的方向,适合拿来探索和调试;但重建得好、标签读着通顺,都不保证找到的是模型真正在用的特征,在有强基线(baseline)的下游任务上,它常常不如线性探针、均值差和提示词(prompt)。
待审核草稿。 这一篇还没有经过站主审阅,事实、取舍和措辞都可能修改;引用前请回到文中链接的一手资料核对。
目标:重建加稀疏
上一篇说,如果特征是叠加在一起的方向,就要把它们找出来。SAE 是字典学习的一种近似:一个很宽的单隐层自编码器,要求还原输入,同时隐层大部分是 0。Anthropic 在 Scaling Monosemanticity 里用的写法:
$$ f(x)=\mathrm{ReLU}(W_{\rm enc}x+b_{\rm enc}),\qquad \hat x=W_{\rm dec}f(x)+b_{\rm dec} $$
$$ L=\mathbb E_x\Big[\|x-\hat x\|_2^2+\lambda\sum_i f_i(x)\,\|W_{\rm dec}^{(i)}\|_2\Big] $$
$x\in\mathbb R^d$ 是模型某处的激活,$f(x)\in\mathbb R^F$ 是稀疏编码,$F\gg d$(过完备)。$W_{\rm dec}$ 的第 $i$ 列 $W_{\rm dec}^{(i)}$ 就是第 $i$ 个特征的方向。第一项要重建准,第二项是 L1 惩罚,$\lambda$ 决定两者怎么权衡;乘上解码列的范数,是为了防止模型把 $f_i$ 缩小、把解码向量放大来逃避惩罚。
| 变体 | 怎么控制稀疏 | 解决了什么 | 代价或问题 | 用在哪 |
|---|---|---|---|---|
| ReLU + L1 | 罚激活之和,调 $\lambda$ | 简单 | 收缩(shrinkage):非零激活被系统性低估 | Bricken 等 2023、Templeton 等 2024 |
| TopK | 每个 token 只保留最大的 $k$ 个,损失只剩重建项 | 直接设定稀疏度,没有 L1 带来的收缩 | 换随机种子时学到的特征更不稳定 | Gao 等 2024(OpenAI) |
| JumpReLU + L0 | 每个 latent 学一个阈值,直接罚非零个数 | 同样稀疏度下重建更准 | 阈值处不可导,要用直通估计器训练 | Rajamanoharan 等 2024、Gemma Scope |
| Transcoder | 用 MLP 的输入预测 MLP 的输出 | 可以直接替换 MLP,便于画电路 | 只是对 MLP 的近似,机制可能不同 | Dunefsky 等 2024,见第 3 篇 |
手算:一个 2 维激活,三个字典方向(教学例子)
取 $d=2$,字典里有三个单位方向:$d_1=(1,0)$,$d_2=(0,1)$,$d_3=(0.707,0.707)$。激活 $x=(1,1)$。为了看清目标函数(objective function)本身,这里直接求最优的非负系数,而不经过编码器:
$$ \min_{f\ge 0}\ \|x-Df\|_2^2+\lambda\,(f_1+f_2+f_3) $$
$\lambda=0$ 时,解有无穷多个:$(1,1,0)$、$(0,0,\sqrt2)$,以及两者之间的混合,都能完全还原。只要重建,目标函数挑不出哪一种“才是”特征。
加上 L1 就不一样了。完全还原时,只用 $d_3$ 的 L1 代价是 $\sqrt2\approx1.414$,用 $d_1+d_2$ 是 2。比较这两种方案在两个 $\lambda$ 下的最优系数:只用 $d_3$ 时 $a=\sqrt2-\lambda/2$;只用 $d_1,d_2$ 时 $b=1-\lambda/2$(把损失对系数求导、令其为 0 即得)。
| $\lambda$ | 方案 | 系数 | 重建 | 平方误差 | $\lambda\times$ L1 | 总损失 |
|---|---|---|---|---|---|---|
| 0.1 | 只用 $d_3$ | $a=1.364$ | (0.965, 0.965) | 0.0025 | 0.136 | 0.139 |
| 0.1 | $d_1+d_2$ | $b=0.95$ | (0.95, 0.95) | 0.005 | 0.190 | 0.195 |
| 1.0 | 只用 $d_3$ | $a=0.914$ | (0.646, 0.646) | 0.25 | 0.914 | 1.164 |
| 1.0 | $d_1+d_2$ | $b=0.5$ | (0.5, 0.5) | 0.5 | 1.0 | 1.5 |
两个 $\lambda$ 下都是只用 $d_3$ 更好(用 KKT 条件可以验证它是全局最优)。从表里能读出三件事:
- L1 偏爱少而“正对着”的方向。 如果数据里其实是两个独立特征经常同时出现,SAE 可能学出一个合并的方向,而不是两个原子特征。
- 收缩。 不加惩罚时 $d_3$ 的系数应是 $\sqrt2\approx1.414$。$\lambda=0.1$ 时少了 0.05;$\lambda=1.0$ 时只剩 0.914,误差 0.25,只还原了 $\|x\|^2=2$ 的 87.5%。$\lambda\ge2\sqrt2\approx2.83$ 时,最优解是全 0,什么都不激活。
- TopK 换了一种取舍。 取 $k=1$,选最能解释 $x$ 的一个方向 $d_3$,系数等于投影 $\sqrt2$,完全还原、没有收缩;代价是每个 token 激活几个 latent 是事先定死的。
真实 SAE 不会对每个输入单独求最优,而是用一层编码器直接算出系数,所以同一目标下只会和最优解持平或更差。

死 latent、特征分裂与吸收
死 latent。 上面的例子里,$x$ 落在对角线上时 $d_2$ 永远不会被选中。如果整个训练集都不让某个 ReLU latent 激活,它从重建项拿不到梯度,就再也回不来。Anthropic 把在 $10^7$ 个 token 上都没激活过的特征算作死特征:1M、4M、34M 三个 SAE 分别约有 2%、35%、65% 是死的,34M 那个只有约 1200 万个活着(Templeton 等,2024-05)。OpenAI 报告,不加缓解措施时死 latent 可达 90%;用解码矩阵的转置初始化编码器,再加一个让死 latent 去拟合重建残差的辅助损失(AuxK),1600 万宽的 SAE 只有 7% 是死的(Gao 等,2024-06)。
特征分裂。 字典变大,一个特征会分成几个更细的。Bricken 等在单层模型里看到一个 base64 特征分成三个;Templeton 等看到 1M SAE 里的一个 “San Francisco” 特征,在 4M 里分成 2 个,在 34M 里分成 11 个。不同大小的字典相当于不同的分辨率。
吸收。 Chanin 等(2024-09)发现,当特征有层级关系时,看起来单义的父特征会在该激活的地方不激活,它的作用被子特征“吸收”了;他们认为这是优化稀疏度造成的,改字典大小或稀疏度解决不了。
换种子就变。 Paulo & Belrose(2025-01)在 Llama 3 8B 的一个 MLP 上训练 131K 宽的 SAE,只换随机种子,只有约 30% 的特征是共同的;TopK SAE 比 L1 的更依赖种子。作者的结论是,SAE 找到的特征应看作“a pragmatically useful decomposition of activation space, rather than an exhaustive and universal list …”,即一种实用的分解,不是模型“真正在用”的特征的完整清单。
怎么给特征贴标签:自动解释和它的边界
几百万个特征没法人工看,于是用模型给模型贴标签。流程是:收集某个特征激活最强的上下文,让一个 LLM 写一句解释,再给解释打分。Bills 等(OpenAI,2023-05)用 GPT-4 解释 GPT-2 XL 的神经元,打分方式是模拟:另一个模型只看解释去预测激活,再算预测和真实激活的 Pearson 相关。Paulo 等(2024-10)补了几种更便宜的打分,并加了干预打分。
| 打分方式 | 问的是 | 看不到什么 |
|---|---|---|
| 模拟 | 只凭解释能否预测激活值(activations) | 这个特征对输出起什么作用 |
| 检测、fuzzing | 只凭解释能否分出激活和不激活的上下文(或 token) | 好几个不同特征是不是被同一句话描述 |
| 干预打分 | 只凭解释能否预测改动这个特征后输出怎么变 | 自然输入上模型是否这样用它 |
边界有三层。第一,标签说的是“什么时候激活”,不是“它做了什么”:Huang 等(2023-09)检查 Bills 等的解释,发现即使最有把握的那些,错误率也很高,因果作用几乎为零。第二,要有随机基线:Heap 等(2025-01)发现,在随机初始化的 Pythia 上训练的 SAE,自动解释分数和重建指标在很多设置下与训练过的模型差不多。第三,标签会撞车:一篇单作者预印本(McCann,2026-05)重新分析了 722 个人工标注的特征(Gemma 2 2B 和 Pythia 70M),平均每个标签被 3.07 个特征共用,82.1% 的特征至少和另一个特征同名,“plural nouns” 一个标签就对应 101 个特征;作者证明检测类打分对这种撞车完全不敏感。
所以 Anthropic 在 2024 年的工作里,除了看激活样例,还会把特征钳高钳低,看行为是否符合标签(上一篇的金门大桥就是一例)。
规模化:几组公开数字
| 工作 | 模型与位置 | 字典大小 | 训练数据 | 报告的数字 |
|---|---|---|---|---|
| Towards Monosemanticity(Anthropic,2023-10) | 单层 Transformer 的 MLP,512 个神经元 | 512 到 131,072(1×–256×) | 80 亿个激活样本 | 人工和自动评估都认为大多数特征可解释 |
| Scaling Monosemanticity(Anthropic,2024-05) | Claude 3 Sonnet 中间层残差流 | 1M、4M、34M | 未公开 | 每个 token 平均激活不到 300 个特征;至少解释 65% 的方差(variance);死特征约 2%、35%、65% |
| TopK SAE(OpenAI,2024-06) | GPT-4 残差流,约 5/6 深度处 | 16M | 400 亿 token | 死 latent 7%;把 SAE 换进 GPT-4 后,语言建模损失相当于只用 GPT-4 预训练(pre-training)算力 10% 训出的模型 |
| Gemma Scope(Google DeepMind,2024-08) | Gemma 2 2B、9B 的全部层和子层,27B 的部分层 | 400 多个 SAE,共 3000 万以上特征 | 每个 40 亿到 160 亿 token | 用了超过 GPT-3 训练算力 20% 的计算;存了约 20 PiB 激活 |
| Gemma Scope 2(Google DeepMind,2025-12-19) | Gemma 3 的 270M 到 27B,每一层 | SAE、transcoder、skip transcoder、跨层 transcoder | 未在博客中给出 | 自报:存储约 110 PB 数据,训练的总参数超过 1 万亿 |
怎么读这些数字:“解释了多少方差”和“换进模型后损失多少”是两回事。OpenAI 指出,以“激活全置零”为基线算损失恢复比例,很差的 SAE 也能得高分(他们的 16M SAE 按这种算法是 98.2%),所以改用“相当于多少预训练算力”;10% 的意思是,换进去以后,模型的表现退回到一个小得多的模型的水平。Anthropic 自己也写道,他们很可能离“找全所有特征”差几个数量级,而真要找全,算力可能比训练模型本身还多。
2025–2026 的批评:在下游任务上
| 工作 | 任务 | 比较的基线 | 结果 |
|---|---|---|---|
| Kantamneni 等(2025-02) | 稀疏探测:数据少、类别不平衡、标签噪声、分布偏移(distribution shift) | 线性探针等 | SAE 偶尔在单个数据集上更好,但把它加进组合也不能稳定胜过只用基线的组合 |
| Google DeepMind 团队(2025-03-26) | 识别用户有害意图,测分布外泛化(Gemma 2 9B IT 第 20 层) | 残差流上的线性探针,分布外 AUROC 0.999 | k 个 latent 的 SAE 探针分布外明显更差;团队暂缓基础 SAE 研究 |
| AxBench(2025-01) | 引导与概念检测(Gemma 2 2B、9B) | 提示词、微调(fine-tuning)、均值差 | 引导:提示词最好,其次微调;检测:均值差最好;两项上 SAE 都没有竞争力 |
| SAEBench(2025-03) | 8 项指标,200 多个 SAE | 8 种架构互相比较 | 代理指标的提升不能可靠地变成实际表现 |
| Anthropic(2024-10) | 生物武器相关提示的分类 | 原始激活上的线性分类器 | 特征分类器有时相当或略好;原始激活是强基线;特征的好处是能看出训练数据里的伪相关 |
SAE 也有派上用场的时候,多半是“不知道要找什么”的场合。Anthropic 的审计游戏里,一支允许用 SAE 的队伍,一个人 90 分钟就通过一个“奖励(reward)模型偏差”特征找到了隐藏目标;但论文也写明,这个解法用更简单的 embedding 语义搜索也能复现(Marks 等,2025-03)。OpenAI 用 SAE 比较微调前后的模型,找到一个 “toxic persona” 特征,它最强地控制着“涌现的不对齐”,还能预测模型会不会出现这种行为(Wang 等,2025-06)。Google DeepMind 团队也说,SAE 对探索性调试和找数据集里的伪相关有用,值得留在工具箱里。
2026 年两种声音都有:一篇预印本称,用有监督的流程挑选并标注特征后,SAE 在 AxBench 上能接近 LoRA 参考水平(Jørgensen & Hansen,2026-05);Google DeepMind 团队 2025-12 的务实路线则主张先用提示、引导、探针,不够再加复杂度。实用的结论是:已经知道要找哪个概念、手里有标签时,先试线性探针或均值差;不知道要找什么、需要无监督地冒出假设时,SAE 才有优势。
往哪走:transcoder、跨层字典与自然语言读出
SAE 只重建同一处的激活,不说明计算怎么从一层流到下一层。Transcoder 改为用 MLP 的输入预测它的输出,作者报告在 120M、410M、1.4B 的模型上,稀疏度、忠实度和可解释性至少不输 SAE;Anthropic 的 crosscoder(2024-10)让一个特征跨多层读写,也用来比较两个模型。跨层 transcoder 是第 3 篇里归因图的基础。
另一条路是放弃固定字典,直接让模型把激活翻译成文字。Anthropic 的 NLA(2026-05-07)用两个从目标模型初始化的模块,一个把激活写成解释,一个从解释还原激活,用 RL 联合训练以还原残差流。作者报告它在 Claude Opus 4.6 的部署前审计里有用,同时列出局限:会编造上下文里没有的细节,说不清解释依据的是激活的哪一部分,两个模块表达能力太强,训练和使用都贵。
这条线接下来看什么
- 在强基线面前能不能赢? 截至 2026-10,Kantamneni 等、Google DeepMind 和 AxBench 的结果都是 SAE 不占优。能改变判断的结果:新的字典方法在事先固定的代理任务上,稳定胜过线性探针和均值差。
- 标签能不能信? Heap 等(2025-01)的随机模型基线、McCann(2026-05)的撞车问题都说明现有打分会高估。能改变判断的结果:主要的 SAE 发布开始默认报告随机模型基线,并用能惩罚撞车的指标。
- 特征稳不稳? 只换种子、约 30% 共同特征(2025-01)。能改变判断的结果:跨种子、跨架构重合度明显更高的训练方法,并说明这些共同特征在模型里被用到。
- 字典还是文字? NLA 论文报告,在它自己的自动审计基准上,配 NLA 的 agent 胜过配 SAE 的基线(2026-05,Anthropic 自报)。能改变判断的结果:第三方在其他模型和基准上复现这个比较,并量化编造的比例。
下一篇:电路、归因与因果干预。
本页术语 10
- 编码器 encoder
- 把原始输入压成向量的那一半模型
- 基线 baseline
- 用来比较新方法的参考方法或配置
- 提示词 prompt
- 提供给模型的任务说明、上下文和示例
- 目标函数 objective function
- 训练直接优化的数学量;它不一定等于最终产品目标
- 激活值 activations
- 神经网络前向计算的中间输出;训练时会保存部分中间结果供反向使用,显存占用取决于长度、batch 和重计算策略
- 方差 variance
- 估计量的波动幅度;重要性加权最容易在这里爆炸
- 预训练 pre-training
- 先用大量数据学习通用表示和能力,再适配具体任务
- 分布偏移 distribution shift
- 训练时和使用时的数据分布不一致
- 微调 fine-tuning
- 在预训练权重上继续训练以适配具体任务
- 奖励 reward
- RL 里指导策略更新的标量信号