机制可解释性图解:从 Transformer 架构基础到前沿电路
从残差流、注意力头和 MLP 出发,系统梳理 probing、activation patching、Lens、SAE 与电路研究的证据边界和方法选择。
这一篇讲什么
机制可解释性(Mechanistic Interpretability,简称 MI)想做的事情只有一句话:不满足于观察模型说了什么,而是打开模型内部,搞清楚它是通过怎样具体的计算步骤得到这个输出的。这篇把这个领域拆成三层来讲:先是读懂内部结构必须知道的前置知识(残差流、注意力头、MLP层、层与层的分工),然后是目前几种主流研究方法各自的原理、代表性结论和精读清单(probing、activation patching、logit lens 系列、SAE、以及 Anthropic 的电路研究脉络),最后给一份”这个问题该用哪个方法”的实用向导和入门路线图。
全文尽量用真实的计算结构本身来解释——向量怎么相加、矩阵怎么投影、哪一步是线性的哪一步不是——而不是借助不精确的比喻。建议先看”方法全景”建立整体地图,再从”架构基础”开始顺序往下读;如果你已经熟悉 transformer 内部结构,可以直接跳到任何一个方法小节。
和前两篇的关系
如果你还没读过《模型真的”知道自己不知道”吗》和《SAE 与论文公式可视化精讲》这两篇,本文的 SAE 小节是浓缩版,建议需要时点回去看完整版;本文其余内容(probing、patching、lens 家族、Anthropic 电路脉络等)是全新展开,两篇不重复。
方法全景:先建立一张地图
机制可解释性的方法虽然五花八门,但可以先用一条线索把它们粗略分成两大阵营:只看不动手的观察类方法,和动手改一改再看变化的干预类方法。这个区分很重要,因为它直接决定了一个方法能证明什么——观察类方法只能告诉你”某个信息在这里能被读出来”,干预类方法才能告诉你”模型确实在用这个信息做判断”。
观察类(Observational)
冻结模型权重,只读取或解码激活值,不改变模型的计算过程本身。
- Probing —— 训练一个分类器,看某个属性能不能从激活值里被线性解码出来
- Logit Lens / Tuned Lens —— 把中间层的残差流提前投影到词表空间,看”这一层觉得答案是什么”
- SAE / 电路的”找特征”部分 —— 把叠加在一起的激活值分解成一堆更单一的方向
干预类(Interventional / Causal)
在前向传播过程中主动替换、擦除或添加某个激活值,观察输出如何变化。
- Activation Patching / 因果追踪 —— 把一次”干净”运行里的激活值移植进另一次运行,测试它是否足以改变输出
- Steering / 激活加法 —— 把一个方向直接加进残差流,测试它是否足以改变行为
- 因果抽象 / DAS —— 系统性地寻找模型内部的哪个子空间”实现”了一个假设中的高层算法
Anthropic 的”电路追踪”(circuit tracing)和最新的 J-Lens 之类方法,其实是把两个阵营接起来:先用 SAE 式的方法把激活值分解成单一特征(观察类的活),再用类似 patching 的归因方法搞清楚这些特征怎么互相连接、影响最终输出(干预类的活)。下面从最基础的架构知识讲起,逐步搭建起理解这些方法所需要的全部背景。
架构基础:从可解释性的视角重新看 transformer
下面不是一份通用的”transformer 是什么”教程,而是专门挑出机制可解释性研究者实际会用到的几个结构性事实——后面每一种方法,几乎都是在利用其中某一条。
残差流:所有层共享的同一条”通道”
一个 transformer 的核心对象不是某一层,而是残差流(residual stream):从 token 进入模型的那一刻起,就有一条向量在逐层向后传递;每一个注意力层、每一个 MLP 层做的事情,都只是从这条流里”读出”一份拷贝去计算,然后把计算结果加回去——不覆盖、不删除,只做加法。(Elhage et al., 2021)
最左侧 Embed 把 token 变成流里的第一个向量;最右侧 Unembed 把最后的向量变回词表上的分布。中间每一层的 Attn / MLP 都只从流上取值计算、再把结果加回流里——这也是后面 Logit Lens、Direct Logit Attribution 等方法能成立的根本原因:整条流量从头到尾都活在同一个坐标空间里。
这件事之所以重要,是因为它让残差流几乎成了一个纯线性的对象——这在神经网络里并不常见(哪怕是 ResNet,跳连接上通常也还带着归一化之类的非线性)。正因为纯线性,你才能把最终结果精确地拆分成”每一层、每一个头分别贡献了多少”,这是本文后面 Direct Logit Attribution 一节的数学基础。但线性也意味着一个硬约束:流的维度是固定的(比如 4096 维),而模型需要表达的概念数量远超这个维度——这正是”叠加”(superposition)现象出现的原因,SAE 一节会具体展开。
注意力头 = QK 电路 + OV 电路
Anthropic 的《A Mathematical Framework for Transformer Circuits》把每个注意力头精确拆成两个几乎独立的子电路:
QK 电路 —— 决定"看哪里"
由 Query 权重和 Key 权重组成,为每一对”查询位置-被看位置”算出一个匹配分数,softmax 之后就是这个头的注意力模式(attention pattern)。它只回答一个问题:这个位置该往哪儿看。
OV 电路 —— 决定"写什么"
由 Value 权重和输出权重组成,决定”一旦某个位置被看到,它会把什么内容写回残差流”。它只回答另一个问题:看到了之后,要往当前位置写入什么。
关键点在于:如果先把注意力模式(QK 电路的结果)当成已经算好、固定不变的东西,那么 OV 电路对残差流做的就是一次纯线性变换。这也是为什么研究者能把”注意力头在关注什么”和”注意力头在写入什么”当成两个独立问题分别研究。更进一步,多个头还可以通过”组合”(composition)间接协作——下一层的 QK 或 OV 电路,可以读取上一层某个头刚刚写入残差流的内容,从而实现单个头做不到的复合计算。
两个头分两步协作:第 1 层的 Previous-Token Head 在”B”这个位置写入”我的前一个 token 是 A”这条信息;第 2 层的 Induction Head 在末尾”?”位置发出查询,通过 K-组合匹配到”B”位置(因为它带着”前面是A”的标记),命中后用 OV 电路把”B”复制到输出。(Olsson et al., 2022;Elhage et al., 2021)
MLP 层:一个”键值记忆”
如果说注意力负责”跨位置搬运信息”,MLP 层负责的是”识别模式、写入内容”,而且可以精确类比成一个键值查找表 (Geva et al., 2021):
← 图较宽,左右滑动可看到完整的 x→Wup→非线性→Wdown→Δx 全流程 →
第一个矩阵的每一行是一个”键”——检测残差流里是否出现了某种模式(浅层的键识别表层的词形/n-gram,深层的键识别更抽象的语义模式);匹配到的键激活强度决定权重;第二个矩阵的每一行是对应的”值”——一个会被写回残差流、并直接影响输出词表分布的方向。整个 MLP 层的输出,就是这些”值”按激活强度加权求和的结果。
这个框架不只是理论类比——它有独立的因果证据支持。ROME 论文用”因果追踪”(下一节详细讲)发现,事实性知识(比如”埃菲尔铁塔在巴黎”)在 GPT-2-XL 里高度集中在中间层、主语最后一个 token 位置的 MLP(Meng et al., 2022),恰好符合”MLP 是可寻址记忆”这个预测——这也是后面 activation patching 一节会用到的关键背景。
LayerNorm:一处真实存在的”麻烦”
不是所有东西都是线性的
LayerNorm 里”除以标准差”这一步是残差流上少有的真非线性——它的除数取决于当前整条流的内容,会打断干净的线性归因。这不是一个可以忽略的细节:2025 年的一项工作证明,把 LayerNorm 从 GPT-2 XL 里彻底微调掉,验证损失只上升 0.03,之后 Direct Logit Attribution 的结果就变成了真正精确的贡献分解,不再受 LayerNorm 耦合的干扰 (Baroni et al., 2025)。这从侧面说明,LayerNorm 在业内普遍被当作一个方法论上的真实缺陷,而不是无关紧要的实现细节。
Embedding 与 Unembedding:一个贯穿始终的共享空间
Token 通过 Embedding 矩阵进入残差流,最终结果通过 Unembedding 矩阵变回词表分布。因为残差流全程只做加法、从不改变坐标系,中间任意一层的向量原则上都活在和最终层相同的空间里——这正是本文”Lens 家族”一节里 Logit Lens 之所以能成立的前提:直接把某个中间层的向量喂给 Unembedding,往往真的能读出一个有意义的”这一层此刻认为答案是什么”。
特权基:为什么”某个维度是否有意义”这件事很重要
一个基(坐标系)被称为”有特权”,是指架构里某个机制让这组具体坐标轴变得特殊、不能随便替换 (Elhage et al., 2022)。这个区分贯穿全文:
有特权基:非线性之后的神经元
ReLU / GELU 这类逐元素非线性,是分别作用在每一个坐标上的。如果你旋转了这个空间,模型的行为就会真的变化——所以”这个神经元代表什么”是一个有意义的问题,标准坐标轴本身携带信息。
无特权基:残差流本身
残差流没有任何逐坐标的非线性作用在它身上。设想把它整体旋转一个矩阵 M,同时把所有读写它的权重矩阵反向旋转,会得到一个行为完全相同、只是坐标轴换了个方向的模型——单个坐标本身不天然携带含义,只有某些方向(子空间)才携带含义,而这些方向未必和任何坐标轴对齐。
这正是 SAE、探针(probing)等方法存在的根本原因:既然残差流没有天然有意义的坐标轴,就需要专门的方法去找出”哪些方向”才是真正携带独立概念的方向。
层的分工:不是整齐的三段论,而是任务相关的动态分配
“浅层管语法、中层管语义、深层管输出”是一个流传很广的简化说法。它不算错,但如果止步于此,会错过 2024-2026 年这批工作里最有价值的部分:层的功能边界其实是随任务复杂度动态移动的,不是一条固定的线。下面先给出目前证据最扎实的一版分阶段框架,再说清楚它在哪些地方需要打折扣。
四阶段框架来自 Lad, Lee, Gurnee & Tegmark《The Remarkable Robustness of LLMs: Stages of Inference?》(2024),基于层删除 / 换序实验(模型在大量此类干预下仍能保留 72%-95% 的性能)加上 logit lens 证据得出。
但边界并不固定——它随任务复杂度和 token 类型移动
《Exploring Concept Depth》(Jin et al., 2024) 发现:简单任务(情感、城市识别)在早中层就能被线性解码,复杂任务(反事实推理、多步策略问题)要到深得多的层才行——不存在一条对所有任务通用的”语义在这里出现”分界线。《Demystifying the Roles of LLM Layers》(Song et al., 2025) 进一步发现层的重要性高度依赖具体任务:浅层对”检索/背知识”更关键,中深层对多步数学推理更关键,同一层对不同评价指标的重要性可以截然相反。《How Do LLMs Use Their Depth?》(Gupta et al., 2025/2026) 提出”先猜后修”的图景:早期层给出基于词频的廉价猜测(约 80% 会在后续层被修正),且深度分配本身是自适应的——同一次生成里,第一个事实性 token 可能要用满 27 层,后续 token 只需 12-20 层。
把这份框架当成一个方便记忆的脚手架就好,不要当成物理定律。后面每次用 activation patching 或 logit lens 说”某个信息在第几层出现”时,请记住:那个具体的层数几乎总是相对于某个特定任务而言的。
Probing:训练一个分类器,读一读激活值里到底有没有这个信息
观察类正被降级为”预筛选工具”
Probing 是最古老也最直接的一种方法:冻结模型权重,跑一遍前向传播,把某一层某个位置的激活向量取出来,训练一个独立的小分类器,看它能不能从这个向量里预测出你关心的属性(词性、句法树位置、事实真假、棋盘状态……)。如果分类器准确率很高,就说这个属性在这里”可以被线性解码”。(Alain & Bengio, 2016)
← 图较宽,左右滑动可看到完整的 4 个步骤 →
一个警示故事:Othello-GPT 的棋盘表征
这是整个 probing 文献里最常被引用的案例,因为它同时展示了 probing 的用处和它最大的陷阱。
- ① 线性探针失败用一个只训练在合法黑白棋对局记录上的 GPT,线性探针尝试解码"当前棋盘状态",错误率高达 20.4%——看起来棋盘状态不是线性编码的。
- ② 非线性探针成功换成两层 MLP 探针,错误率骤降到 1.7%。研究者据此认为模型确实维护着棋盘状态,只是编码方式是非线性的 (Li et al., 2023)。
- ③ Neel Nanda 发现:其实是线性的,只是基选错了棋盘格子被编码成"我方 / 对方"而不是"黑 / 白"——每走一步,同一个格子在"黑白"这个基下的含义都会翻转一次。换成"我方/对方"这个基之后,线性探针重新变得近乎完美。
这个故事的教训不是”probing 没用”,而是”probing 的失败可能只是选错了基,而不是信息真的不存在”——这也是为什么后面几种方法都试图跳出”手工挑一个基”的限制。
结构探针:整棵句法树都能被一个线性变换找出来
Hewitt & Manning (2019) 的结构探针不预测离散标签,而是假设”词与词之间的句法树距离”可以直接用变换后向量间的欧氏距离来近似——用一个单一的线性变换 B 同时拟合一整句话里所有词对的树上距离。
核心争议:读得出 ≠ 用得上
Belinkov (2022) 的综述把这一点讲得很清楚:probing 提供的是观察性、相关性证据——它能告诉你某个属性”在这里、可以被读出来”,但不能证明模型在做预测时真的使用了这个属性。Hewitt & Liang (2019) 进一步证明,如果探针本身表达能力太强(比如深层 MLP),它甚至能在完全随机、无意义的”控制任务”上取得和真实任务差不多的准确率——这说明高准确率有可能只是探针自己在”记住”规律,而不是在读模型。Elazar et al. (2021) 用”失忆探测”直接做因果验证:把探针认定的方向从表征里抹掉,发现探测准确率很高的属性,被抹掉后模型下游表现不一定明显下降——准确率和因果重要性可以脱钩。
2025-2026 年的共识大致是:probing 没有消失,但从”金标准证据”降级成了”低成本的第一轮假设生成工具”——真正有分量的机制性结论,现在几乎都要求配合下一节的因果干预方法。
Activation Patching / 因果追踪:移植一段激活值,看输出会不会跟着变
干预类因果证据
如果说 probing 是”看这里有没有信息”,activation patching 问的是完全不同的问题:如果我强行把这里的激活值换成另一次运行时的值,输出会不会变?这是一次真正的因果实验,而不是被动观察。
三次运行的范式:干净、损坏、拼接
“去噪”(denoising):主运行是损坏的,拼接进干净激活,测试它是否足以恢复正确行为;”加噪”(noising):主运行是干净的,拼接进损坏激活,测试它是否是必需的。这两者并不对称——一个组件可能”足够”却不”必需”,因为其他冗余组件会自动补位(”Hydra 效应”),这也是只做单向测试容易得出误导性结论的原因 (Heimersheim & Nanda, 2024)。
案例一:ROME 的因果追踪——事实知识存在哪里
做法:干净跑一遍事实性提示(如”埃菲尔铁塔位于___“),缓存全部激活;给主语 token 的嵌入加噪声得到一个”损坏”版本;再让损坏版本在每一个(层, 位置)组合上分别单点恢复干净激活,测量恢复了多少正确答案的概率——这样能画出一张完整的因果热力图。(Meng et al., 2022)
案例二:IOI 电路——26 个注意力头怎么合作猜出”该给谁”
任务:”After John and Mary went to the shop, John gave a bottle of milk to ___” → 模型应该输出 Mary(间接宾语),而不是重复 John。Wang et al. (2023) 用 path patching(比普通 patching 更精细的”边级”拼接,只固定住指定的信息通路)逆向出了一条完整的 3 阶段算法,横跨 GPT-2 small 里 26 个注意力头:
展开:Backup 头与"Hydra 效应"——为什么单向 patching 会骗人
论文还发现了 8 个 Backup Name Mover Heads:平时贡献很小,但一旦主力 Name Mover Heads 被消融,它们会立刻自动补上大部分丢失的效果。这正是”去噪能恢复≠加噪一定必需”的活证据——如果只做加噪测试,很容易误以为主力头不重要,因为损坏它们之后模型表现下降有限。IOI 论文也是”忠实性、完整性、最小性”这套电路评估标准的出处,后来被 ACDC 等自动化方法直接继承。
方法论的自我修正:2024-2026 年的严格化
Zhang & Nanda (2024) 系统比较了不同的损坏方式(加高斯噪声 vs. 替换成另一个 token)、不同的度量指标(logit 差 vs. 概率 vs. KL 散度)后发现,”哪个组件重要”这个结论对这些看似次要的选择相当敏感,因此给出了一套操作规范:先粗粒度(整层/整位置)再细粒度、用 logit 差作为默认指标但要求多指标收敛、明确结论只在训练时用的那个 prompt 分布下成立。Miller et al. (2024) 更进一步发现,电路”忠实性”分数本身对粒度、消融值选择、位置选择等一整套方法论细节都很敏感——这提醒我们,任何”我们找到了一个电路”的说法,都值得先问一句”用的是哪种度量、哪种损坏方式”。
Lens 家族:提前偷看模型”此刻”的判断
观察类
这一整个家族利用的都是同一个结构性事实:残差流全程共享同一个坐标空间(见”架构基础”一节)。既然如此,能不能不等模型跑完全部层,就在中间”提前读一下”它当前的判断?四种方法沿着这个思路各自往前推进了一步。
| 方法 | 怎么"读出"结果 | 需要训练吗 | 本质 |
|---|---|---|---|
| Logit Lens | 直接用最终层的 Unembedding 矩阵 | 不需要 | 近似:假设中间层已经和最终层同一个基 |
| Tuned Lens | 先过一个该层专属的学习到的仿射变换,再 Unembedding | 需要(每层单独训练) | 近似但经过校准:学出真实的基变换 |
| Direct Logit Attribution | 把最终 logits 精确拆成每个组件贡献之和 | 不需要 | 精确:不是"提前看",是"事后算总账" |
| Patchscopes | 把激活值移植进一个全新的目标 prompt,让完整前向传播去解读 | 可选 | 最灵活:输出不再局限于单个 token |
| J-Lens2026新 | 用该层到最终层的真实平均雅可比矩阵做变换 | 需要(离线拟合一次) | 用模型自己真实的敏感度,替代"假设"或"学出的近似" |
Logit Lens:直接借用最终层的”读数表”
做法极简:拿某个中间层的残差流向量,不做任何修正,直接套用模型最后一步的 LayerNorm + Unembedding,看看”如果计算到这里就被迫回答,模型会说什么” (nostalgebraist, 2020)。
它有一个没被验证过的假设
Logit Lens 默认中间层的向量已经和最终层”用同一套坐标系”——但没有任何机制保证这一点。实践中它在 GPT-Neo、BLOOM、OPT 等一些模型家族上会直接失灵,产出无法解读的乱码分布。
Tuned Lens:给每一层配一个”专属翻译官”
Tuned Lens 保留 Logit Lens 的读出方式,但在读出之前,先让向量经过一个该层专属、通过学习得到的仿射变换:
训练目标是让 TunedLensℓ 的输出分布尽量贴近模型真实最终输出的分布(用 KL 散度衡量),模型本身权重保持冻结,只训练这些”翻译官”。初始化为恒等变换时它就是 Logit Lens 本身——所以可以把 Logit Lens 看成 Tuned Lens 在 A=单位矩阵、b=0 时的特例。训练完成后,各个层的困惑度全面下降,而且在 Logit Lens 失效的那些模型家族上依然可靠 (Belrose et al., 2023)。
Direct Logit Attribution:把最终答案精确地”分账”
这个方法问的是另一个问题:不是”某一层此刻怎么想”,而是”最终答案里,每一个具体的头、每一个具体的 MLP 层,各自贡献了多少”。因为残差流是纯加法结构,最终 logits 可以精确地展开成每个组件贡献的总和:
它和 Logit Lens 的区别是”看深度”还是”看宽度”:Logit Lens 固定”读出全部累积贡献”、改变”看到第几层为止”;DLA 固定”看到最后一层”、改变”拆到多细的组件”。两者可以拼在一起——从头累加到第 ℓ 层的 DLA 贡献,经过最终 Unembedding,正好就是 Logit Lens 在第 ℓ 层的读数。
Patchscopes:不局限于”读一个词”,而是”讲一段话”
Patchscopes 把上面的思路彻底推广:不再要求”读出方式”必须是套用 Unembedding,而是把某个位置的激活值,移植进任意一个新的目标 prompt(可以换一句话、换一个位置、甚至换一个模型),让完整的前向传播去处理它、并用自然语言说出这个向量”代表什么” (Ghandeharioun et al., 2024)。
Logit Lens / Tuned Lens
目标 prompt = 原 prompt 本身;读出方式固定为”过 Unembedding”;输出永远是单个 token 的概率分布。
Patchscopes
目标 prompt 可以是全新设计的模板,比如 "[PATCH] 也被称为"(问身份)或 "[PATCH]:所在的国家是"(问属性);输出可以是完整的、开放式的自然语言。
这个框架的意义在于:Logit Lens 和 Tuned Lens 都可以被重新描述成 Patchscopes 的特例(目标 prompt=原 prompt、读出函数=恒等或学习到的仿射变换);而 Patchscopes 本身能做到前两者做不到的事情——在早期层依然给出有意义的结果(因为目标上下文帮它做了额外的计算),以及支持跨模型:把一个小模型的表示”翻译”给一个更大、更强的模型,让大模型帮忙”解读”小模型的内部状态。
J-Lens:一周前刚发布的最新方法
2026年7月6日发布Anthropic
如果你是从别处零散听说”J lens”这个词,大概率说的就是这个——它新到本文写作时才发布了 9 天,是 Lens 家族里最新的一名成员,出自 Anthropic 2026 年 7 月的论文《Verbalizable Representations Form a Global Workspace in Language Models》(Gurnee, Sofroniew, Pearce, Lindsey, et al.)。
核心想法:与其假设或学习”翻译方式”,不如直接算出模型真实的敏感度
回顾一下前面的问题:Logit Lens 假设中间层和最终层”用同一套坐标”(往往不成立);Tuned Lens 用一个学出来的仿射变换去近似真实的坐标转换关系。J-Lens 换了一个思路:直接计算模型自己真实的、从这一层到最终层的平均雅可比矩阵(一阶导数),把它当成”翻译矩阵”来用——不是假设,也不是拟合出来的近似,而是模型本身真实的局部线性敏感度。
用它发现了什么:”J-space”(可报告的隐藏空间)
论文用 J-Lens 为每一个词表 token 找出”模型此刻有多大程度上’准备好要说出这个词’“的方向,把所有输入里真正处于”活跃可报告”状态的方向集合起来,称为 J-space。作者认为它满足一个受认知科学”全局工作空间理论”(Global Workspace Theory)启发的五项标准:
一个关键的因果结果:移除 J-space 里的活动后,模型依然能流畅生成语言,但多步推理能力被破坏——这被作者解读为 J-space 承担着”把多步计算的中间结果保留下来、供后续步骤读取”的功能。论文还展示了几个实用场景:探测模型是否”私下怀疑自己正在被测试”、识别编造数据的时刻、在故意错位的模型样本里揪出隐藏的恶意目标。
该往哪个方向保持谨慎:技术本身 vs. “意识”叙事
论文随附了三方独立学者的书面评论。DeepMind 的 Neel Nanda 报告在另一个模型(Qwen 3.6 27B)上独立复现了核心结论,认为 J-Lens 是一个有用但不完美的”假设生成工具”,同时提醒“J-lens 没有照到的地方,不代表信息不存在”。全局工作空间理论的提出者 Stanislas Dehaene 与 Lionel Naccache 指出模型缺乏真实的循环动力学和具身经验,这是和人类意识理论的重要不对称之处。Eleos AI 的 Patrick Butlin、Robert Long 等人提醒:证明存在”可访问性”证据,并不等同于证明存在”现象性意识”。技术层面的发现(存在一个稀疏、可报告、影响推理的表征子集)目前证据相对扎实;”这构成意识的证据”这类更强的哲学解读,仍然高度存疑、值得保持怀疑。
SAE:把叠加在一起的激活拆成单一特征(浓缩版)
观察类(为主)
如果你还没读过专门讲 SAE 的那篇,这里先给一个最简版本:残差流里的一个向量,经常是几十个概念叠加挤压在一起的结果(”叠加”问题,见”架构基础”一节)。SAE 的做法是训练一个”编码器→筛选→解码器”的小网络,把这个挤压的向量重新展开成一个维度大得多、但绝大多数取值为 0 的稀疏向量——在这个更大的空间里,理想情况下每个维度只对应一个干净、单一的概念(这样的一个维度叫一个”latent”)。
完整的公式推导(编码/解码/损失函数/JumpReLU/steering/分离度评分/MaxMin/正交化/统计判据)在专门的 SAE 公式精讲一文里逐条拆开讲过,这里不重复,直接看当前进展。
当前进展(截至 2026):规模在涨,质疑也在涨
Anthropic 电路研究脉络:2020-2026 完整时间线
前面几节介绍的方法,在 Anthropic 的”电路”(Circuits)研究议程里几乎都被用上了——这条研究线索本身也是观察这个领域怎么演进的一个很好的样本:从”神经网络里有可复用的特征和电路”这个哲学假设开始,逐步发展出可以在生产级大模型上落地的具体工具。
2025年3月的转折点:给大模型做一次”解剖”
《On the Biology of a Large Language Model》是这条时间线上信息量最大的一篇,Anthropic 自己把这套方法称为”AI 显微镜”——因为”光靠和模型对话,能了解到的东西是有限的”,所以他们选择直接打开模型内部看。以下是论文里几个案例研究:
和第一篇解读的直接呼应
如果你读过本系列第一篇《模型真的”知道自己不知道”吗》,会发现”实体识别与幻觉”这个案例研究,和那篇论文的核心发现几乎是同一件事的两种做法:那篇论文用 SAE 找到已知/未知实体的分离方向、再用 steering 因果验证;这里 Anthropic 用跨层转码器+归因图,把”已知实体特征抑制默认拒答”这条完整的因果链路直接画了出来。两条独立的研究路线,落在了同一个机制性结论上。
电路研究之外:其他机构在做什么
circuit-tracer 开源之后,归因图方法已经不只是 Anthropic 内部的工具:
延伸方法:三个经常被一起提起的邻居
下面三个方法不完全属于前面的分类,但和机制可解释性关系密切、经常被放在一起讨论,值得知道它们大致是什么、和”正统”机制可解释性方法的边界在哪里。
自动化电路发现:从 ACDC 到又快又忠实
手工做 activation patching 找电路(就像 IOI 那样)很费人力:挑指标、挑数据、一个个组件测试。ACDC (Conmy et al., 2023) 把这个过程自动化——从完整计算图出发,对每一条边做 patching 测试,效果变化小于阈值就剪掉这条边,反复做直到收敛。
- 2023:ACDC——能跑,但慢且脆弱需要给每条边单独跑一次前向传播,对阈值选择、损坏方式都很敏感,容易漏掉"逻辑或"式的冗余组件(比如 IOI 里的 Negative Name Mover 头就曾被漏掉)。
- 2023-2024:Attribution Patching / EAP——快了几个数量级用一次梯度反传,线性近似"patch 每一个组件会带来多大影响",把需要的前向传播次数从上千次降到几次,代价是牺牲了一些精确度。
- 2024-2025:EAP-IG / AtP* / RelP——把精确度找补回来用积分梯度、系统性修正已知的假阴性模式、或改用逐层相关性传播替代单点梯度,让"快"和"忠实于真实电路"不再是两难选择。
Steering / Representation Engineering:不问”为什么”,只证明”这个方向管用”
这类方法的做法是:设计一组对比样本(比如”体现谄媚的回答” vs. “不谄媚的回答”),取激活值的均值差作为一个方向,推理时直接把这个方向加进残差流,测试模型行为是否被系统性改变(Zou et al. 2023 的 RepE;Rimsky et al. 2023 的对比激活加法 CAA;Turner et al. 的 ActAdd)。
它是”行为层面”的证据,不是”机制层面”的证据
能找到一个方向、加上去就能可靠改变行为,只能证明”这个方向对这个行为是因果充分的”——并不能说明模型正常运作时是否真的这样使用这个方向、上游是哪些组件计算出它、下游又是怎么被读取的。可以把它类比成药理学实验(这种药能改变这个症状)而不是神经环路研究(这条环路怎么实现这个功能)。2025-2026 年的工作还发现 steering 方向存在”不可辨识性”——很多不同的方向能产生几乎相同的行为效果,这提醒我们不要轻易把”能 steering 成功的方向”直接等同于”模型内部代表这个概念的唯一方向”。
因果抽象 / DAS:给”这个网络实现了这个算法”一个严格定义
因果抽象(Geiger et al., 2021)提供了一个形式化框架,用来精确回答”一个神经网络的内部计算,是否实现了某个人类可理解的高层算法”——不是靠肉眼觉得像,而是要求:对高层算法的某个变量做干预,和对网络内部对应的子空间做同样的干预,必须产生一致的下游效果(”交换干预”)。DAS (Geiger et al., 2022) 把”对应哪个子空间”这件事本身变成可以梯度下降求解的问题——学习一个旋转矩阵,把假设的高层变量对齐到激活空间里的某个子空间(不要求是坐标轴对齐的,天然兼容叠加),而不是像最早的版本那样,笨拙地枚举”哪几个神经元”。Boundless DAS (Wu et al., 2023) 进一步把这套方法用到了真实的指令微调大模型(Alpaca)上,而不仅仅是玩具任务。
方法怎么选:把研究问题对应到工具
这些方法不是互相替代的关系,而是分别回答不同的问题。下面是一份实用对照表:
| 你想知道…… | 推荐从这个方法入手 |
|---|---|
| 某个属性/知识在模型的哪一层"看起来"存在 | Probing(快速、廉价的第一轮排查) |
| 模型是否真的依赖某个组件做出这个判断 | Activation Patching(因果验证,probing 的必要补充) |
| 模型"此刻"倾向于输出什么答案,不想等它算完 | Logit Lens / Tuned Lens |
| 某个具体的头/层对最终答案的精确贡献是多少 | Direct Logit Attribution |
| 某个中间表示"到底代表什么概念",想要自然语言描述 | Patchscopes(或最新的 J-Lens/NLA) |
| 把一个挤在一起的激活向量拆成一堆单一概念 | SAE / 跨层转码器 |
| 一整条从输入到输出的完整计算路径长什么样 | 归因图(Attribution Graphs,建立在 SAE/转码器之上) |
| 只是想快速验证"这个方向能不能改变行为",不深究机制 | Steering / Representation Engineering |
| 想严格证明"网络实现了这个具体算法",而不只是差不多像 | 因果抽象 / DAS |
| 想在大规模模型/数据集上自动找电路,而不是手工一个个测 | ACDC 及其后继方法(EAP、AtP*、RelP) |
入门资源:如果你想真的动手做研究
路线图
Neel Nanda 的”入门四步”至今仍是最常被推荐的路线:① 打好 ML/PyTorch 基础(能跑通在 MNIST 上训练一个 MLP);② 吃透 transformer 架构(能从零实现一遍 GPT-2);③ 学会用 TransformerLens 之类的工具做实验;④ 挑一个具体问题动手复现——他和合著者们后续维护的”200 个具体开放问题”清单,按 8 个方向、A-D 难度分级,是找到第一个可以上手的问题的最佳起点。2025 年 Sharkey et al. 的《Open Problems in Mechanistic Interpretability》是这份清单在全领域、多机构共识层面的更新版,覆盖面更广但没有那么手把手。
课程
ARENA(Alignment Research Engineer Accelerator)提供了目前最接近”教科书+习题集”的结构化课程,第一章专门覆盖 transformer 可解释性:从零实现 GPT-2、TransformerLens 基础、归纳头、复现 IOI 电路、叠加与 SAE,循序渐进;BlueDot Impact 的 AI Safety Fundamentals 课程里也有一个更轻量的可解释性单元,适合作为更低门槛的入口。
工具库
研究机构与项目
综述论文(了解全局的捷径)
术语速查卡
把全文出现过的核心术语汇总在这里,读论文时可以随时回来对照。
| 术语 | 含义 |
|---|---|
| 残差流 residual stream | 贯穿模型始终、只做加法的共享向量通道,所有层都从它读、往它写 |
| QK / OV 电路 | 一个注意力头的两个独立子部分:QK 决定看哪里,OV 决定写什么 |
| 归纳头 induction head | 能在上下文里"照抄"重复模式的电路,由前一token头和归纳头两层协作组成 |
| 特权基 privileged basis | 因为非线性而变得"有意义"的一组具体坐标轴;残差流本身没有特权基 |
| 叠加 superposition | 模型把比维度数更多的特征,非正交地挤压编码进同一组维度 |
| Probing | 训练外部分类器读取冻结激活值,判断某属性是否可被线性解码——只是观察性证据 |
| Activation Patching | 把一次运行的激活值移植进另一次运行,因果测试其对输出的影响 |
| 去噪 / 加噪 denoising / noising | 拼接干净激活测试"是否足够"/拼接损坏激活测试"是否必需",二者不对称 |
| Path Patching | 比普通 patching 更精细的边级拼接,只固定指定的信息通路,可画出完整电路连线图 |
| Logit Lens | 把中间层激活直接投影到词表空间,看"这一层此刻认为答案是什么" |
| Tuned Lens | Logit Lens 的校准版,每层配一个学习到的仿射"翻译"变换 |
| Direct Logit Attribution | 把最终 logits 精确拆分成每个组件贡献之和的代数分解 |
| Patchscopes | 把激活值移植进全新目标 prompt,让完整前向传播给出自然语言解读 |
| J-Lens | 2026年7月最新方法,用真实平均雅可比矩阵做翻译,发现"J-space" |
| SAE 稀疏自编码器 | 把叠加的激活值拆解成大量稀疏、单一语义方向的小网络 |
| 跨层转码器 cross-layer transcoder | SAE 思路的扩展:读一层、写入之后所有 MLP 层,用于构建归因图 |
| 归因图 attribution graph | 用跨层转码器特征画出的、跨越整个模型深度的因果计算图 |
| Steering / 激活加法 | 把一个方向直接加进残差流,因果验证它是否足以改变行为(行为层面证据) |
| 因果抽象 / DAS | 用交换干预严格定义"网络是否实现了某个高层算法",DAS 用学习到的旋转矩阵找对应子空间 |
| ACDC | 自动化电路发现算法,通过逐边 patching+剪枝找出候选电路 |
