Sparse Autoencoders (SAE)
稀疏自编码器(SAE)将网络激活拆分为大量特征,每次只有少数特征处于激活状态,是解释 LLM 的核心工具。
稀疏自编码器(SAE)是一种自编码器,它通过隐藏层重建输入;对于任何给定输入,隐藏层中只有少数单元会被激活。在当前 AI 研究中,SAE 使用大型语言模型(LLM)或视觉模型的内部激活进行训练,隐藏单元数量远多于输入维度,因此每个隐藏单元(称为特征或潜变量)往往会响应一种人类可识别的概念。它们是机制可解释性的重要工具:Anthropic 于 2024 年开展的《扩展单义性》研究在 Claude 3 Sonnet 的激活上训练了最多包含 3,400 万个特征的 SAE,并发现了金门大桥、代码错误和欺骗等概念对应的特征。
稀疏特征为何有助于可解释性#
大型模型中的单个神经元通常具有多义性,会响应多个互不相关的概念。Anthropic 在《超位置的玩具模型》中研究的超位置假说解释了原因:只要同一时间只有少数概念处于激活状态,具有 d 个维度的层就能以近乎正交的方向表示远多于 d 个概念。SAE 会搜索这组过完备方向。它生成的稀疏激活编码会列出其中出现的少数方向及其强度,因此比数千个混合的神经元值更容易理解。
稀疏自编码器的工作原理#
编码器将激活向量映射为一个宽得多的潜变量向量,随后经过 ReLU 处理;解码器则将激活重建为各列的加权和,因此每个解码器列都表示一个特征的方向。训练会最小化重建误差,同时施加稀疏性约束。经典做法是在潜变量上施加 L1 惩罚,这是一种正则化;OpenAI 的 TopK SAEs 对每个输入只保留最大的 k 个潜变量,并将其扩展为一个针对 GPT-4 激活、包含 1600 万个潜变量的 SAE;而 Google DeepMind 的 JumpReLU SAE 会将所有低于学习所得阈值的潜变量置零。训练完成后,SAE 的潜变量主要有两种用途:
下面的玩具示例将 64 个已知特征方向压缩到 32 个维度中,因此没有任何单一维度与某个特征一一对应;然后训练 TopK SAE 来还原这些特征:
import torch
import torch.nn.functional as F
torch.manual_seed(0)
# Toy activations: 64 feature directions packed into 32 dimensions (superposition), ~3 active per sample
features = F.normalize(torch.randn(64, 32), dim=1)
acts = (torch.rand(8192, 64) * (torch.rand(8192, 64) < 0.05)) @ features
encoder, decoder = torch.nn.Linear(32, 256), torch.nn.Linear(256, 32) # 256 latents: 8x overcomplete
optimizer = torch.optim.Adam([*encoder.parameters(), *decoder.parameters()], lr=1e-3)
for step in range(3000):
# TopK sparsity: keep each sample's 4 largest latents and zero the rest
values, idx = encoder(acts).topk(4, dim=-1)
latents = torch.zeros(len(acts), 256).scatter(-1, idx, F.relu(values))
loss = (decoder(latents) - acts).pow(2).sum(-1).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
directions = F.normalize(decoder.weight.T, dim=1) # one learned direction per latent
print(f"Unexplained variance: {loss.item() / (acts - acts.mean(0)).pow(2).sum(-1).mean().item():.3f}")
print(f"Features matching a single neuron: {(features.abs().max(dim=1).values > 0.9).sum().item()} of 64")
print(f"Features matching an SAE latent: {((directions @ features.T).max(dim=0).values > 0.9).sum().item()} of 64")每个样本最多激活 4 个潜变量时,SAE 留下了 7.1% 无法解释的方差。64 个预置特征中,没有任何一个与单个输入维度的余弦相似度超过 0.9;而这 64 个特征都能与某个 SAE 潜变量的解码器方向对齐。
应用场景#
- 特征发现:研究人员会收集最能激活某个潜变量的输入,并为每个潜变量添加标签;他们通常会让 LLM 撰写标签,然后利用这些特征审查模型所表示的内容。
- 引导:将某个特征钳制在较高值会改变模型行为,这与添加引导向量的效果类似。2024 年 5 月,Anthropic 曾短暂发布 Golden Gate Claude,这是一个放大了大桥特征的版本,以至于几乎每个回答都会提到大桥。
- 电路追踪:Anthropic 于 2025 年发布的归因图使用跨层转码器(一种 SAE 变体,它读取一层的激活并重建后续 MLP 层的输出),以追踪 Claude 3.5 Haiku 内部的多步计算。
- 开放 SAE 套件:Google DeepMind 发布了 Gemma Scope,其中包含 Gemma 2 2B 和 9B 每一层的 JumpReLU SAE;Gemma Scope 2 则为参数量从 270M 到 27B 的 Gemma 3 模型新增了 SAE 和转码器。SAELens库可以训练和加载这类 SAE。
- 视觉模型:在 CLIP 和 Vision Transformer 激活上训练的 SAE 同样能发现可解释的视觉概念。SAE 需要激活向量数据集,而 Ultralytics YOLO26中的
model.embed()会为任意层索引返回每张图像的一个平均池化激活向量,默认使用倒数第二层。
局限性#
SAE 对激活的重建并不完美;用重建结果替换某一层的激活会显著增大模型损失。发现的特征取决于字典大小和训练过程,因为更宽的 SAE 会将一个特征拆分为多个更细的特征,而且某些潜变量从不激活。2025 年 3 月,Google DeepMind 的可解释性团队报告称,基于 SAE 特征构建的探针在检测分布外提示中的有害意图时,表现不如普通线性探针;该团队还表示,将降低基础 SAE 研究的优先级,同时继续把 SAE 作为多种工具之一。
SAE 与相关概念的区别#
- 标准自编码器:通过比输入更窄的瓶颈压缩数据,以实现压缩或降维。SAE 会扩大隐藏层并强制施加稀疏性,以分离不同概念。
- 线性探针:训练有监督分类器来检测预先选定的某个概念。SAE 属于无监督方法,无需标签即可发现特征。
- 表示工程(RepE):通过对比成对提示上的激活来寻找概念方向,而 SAE 的特征仅通过重建获得。
- 稀疏编码:一种较早的字典学习方法,SAE 通过单次编码器前向传播来近似它,而不是针对每个输入单独优化。Olshausen 和 Field(1996)证明,从自然图像中学习到的稀疏编码会产生局部化、定向、类似边缘的滤波器,与初级视觉皮层简单细胞的感受野相似。










