你的电路图可能是假的
你花了一个月,用激活修补把模型里跟某个行为有关的组件挑了出来:四个注意力头,三条残差流边。你画了一张漂亮的结构图,写成博客。可就在准备发布之前,你随手做了一次反事实实验:把电路之外的组件全部置零。模型竟然还保持着92%的正确率。你愣住了——剩下那8%是谁在回答?更麻烦的是,你为什么不能确定自己找到的就是“完整电路”,而不是某个恰好有效的局部拼图?

这个问题在可解释性领域有个专门的名字:电路完成度评估(circuit completeness evaluation)。它回答的不是“哪些组件参与了”,而是“哪些组件已经够用,而且缺一不可”。
- 电路(circuit)
- 神经网络中负责完成某一特定行为的原子组件集合,包括注意力头、MLP、以及它们之间的边。
- 完成度(completeness)
- 给定一个电路,把电路外所有组件消融后,模型行为保留的程度。
- 充分性(sufficiency)
- 仅保留电路内部组件时,能否复现目标行为。
- 必要性(necessity)
- 移除电路中任意一个组件,目标行为是否显著受损。
注意,完成度不是二元的。它更像一个百分比:你找到的电路能解释多少行为,而不能解释的那部分又藏在哪里。
影响大的头,不等于电路的一部分
我最早做机制分析时,用过activation patching,一下子筛出40多个对输出影响很大的位置。当时我特别兴奋,以为这就是模型内部的“完整地图”。可后来用zero ablation把电路外组件全部归零,行为几乎不受影响。再细看,那40多个位置里,有一半是可以被其他组件替代的。而真正不可替代的组件,有一些反而影响分数不高。
这件事让我困惑了很久:为什么一个组件对输出的影响很大,却不是必要的?后来我才想明白:模型的分布式表示让很多组件可以互相备份。你修补某个位置时,其他位置会补偿它的变化。所以“有影响”只能说明它在因果链上,不能说明它不可替代。一个真正的电路,应当通过“外部清零”和“内部删除”双重测试的组件组合。
三种主流评估方法,各有各的盲区
目前用得最多的评估方法有三种。它们不是为了证明“这个行为由这些组件完成”,而是为了回答“这些组件之外,还有没有别的关键东西”。
| 方法 | 核心操作 | 能证明 | 盲区 |
|---|---|---|---|
| 零消融(Zero Ablation) | 把电路外的组件输出设为中性值 | 外部清零后行为保留→电路充分 | 中性值选择影响结果;无法区分冗余路径 |
| 激活修补(Activation Patching) | 用其他输入的激活替换目标位置 | 定位因果必须的节点和边 | 容易遗漏冗余备份;只能证明局部因果 |
| 自动电路发现(ACDC) | 从完整模型出发,按因果影响逐层剪枝 | 生成最小充分电路,完整性较高 | 搜索策略基于贪心,可能剪掉低影响协同组件 |
如果把模型比作一家公司,零消融就像是“让所有不参与该项目的部门放假”,看项目还能不能交付;激活修补则是“临时抽走某个人的工位,看项目会不会卡壳”。前者回答“这套班子够不够”,后者回答“哪个角色不可少”。
ACDC 是怎样从“全图”逼近“最小电路”的?
有一个很自然的提高完成度的方法:不要从局部组件往上拼,而是从完整模型往下剪。这就是ACDC(Automated Circuit Discovery)的做法。论文里描述得很清楚:先把模型的每条边看作一个待剪枝的候选。然后反复运行模型,对每条边计算“去掉它之后,目标行为损失增加多少”。如果损失增加小于某个阈值,就剪掉。如此迭代,直到无法再剪为止。
“我们称这种方法为ACDC,它能够在不牺牲任务性能的前提下,生成一个稀疏且完整的电路。”——Conmy et al., 2023
听起来像贪心算法,实际搜索空间更大。ACDC的早期版本需要递归地在边上做剪枝决策,对每条边都要做一次前向传播,成本很高。但它在解释质量上有一个本质优势:只要剪枝过程是可靠的,最终电路就是充分的。因为你保留的每一条边,都已经被验证为“剪掉就会让行为下降”,而你剪掉的边,已经被验证为“剪掉不影响行为”。所以从理论上,它没有给“未发现的组件”留下多少空间。
当然,ACDC也有自己的陷阱:如果任务定义得不好,比如只用一个批次的样本计算损失,剪枝结果会过拟合到那一批样本上。所以评估时,必须用独立的测试集来测量完成度。
一个实用的完成度分数:行为保留率
不管用哪种方法,最终你都要回答一个问题:这个电路的完成度是多少?业界常用的指标很简单,就是行为保留率。
- 选定目标任务和一组测试样本。
- 记录原始模型在这组样本上的正确率(或其他行为指标)。
- 对电路外所有组件做中立化处理(置零或替换为均值激活)。
- 重新计算模型的行为指标,除以原始指标,得到保留率。
保留率越接近100%,电路越充分。如果只有60%,说明有40%的行为依赖外部组件。这时候你就该回到第三步,去搜索那些被遗漏的组件。
这里有一个细节很多人第一次想不到:选择什么样的“中性值”会直接影响结果。把注意力头置零,和把残差流置零,效果完全不同。因为模型里的层归一化对数值范围很敏感。所以你在报告完成度时,必须写明消融协议,否则别人无法复现。
IOI 电路的验证:一个经典样板
GPT-2的间接宾语识别(IOI)研究,是我见过的比较严谨的完整性验证。研究者先手工猜测了一组组件:26个注意力头和少量MLP。然后他们做了两步。
第一步,只保留这些组件,把电路外的其他所有头都“随机化”或替换成其他样本的激活。结果模型仍能稳定完成IOI任务,正确率几乎没有下降。这证明了充分性。
第二步,逐个移除电路内的组件,替换成来自错误句子的激活,观察行为指标的下滑幅度。结果几乎每个被测试的组件都在因果链上,没有一个可以被安全移除。这证明了必要性。
“这些实验表明,IOI电路是模型执行该行为的核心机制,而不是我们心血来潮挑出的一组相关头。”——Wang et al., 2022
这两步合起来,就构成了一种完整的验证范式。如果你只想记住一条实操规则,那就是:在证据链里,既要有“去掉外面还能跑”的正面证据,也要有“去掉里面就崩”的反面证据。
为什么说完成度总是相对的
不过,即使你完成了这样的双重验证,也仍然不能拍着胸脯说“这就是所有情况下的完整电路”。原因有三。
- 冗余路径:模型可能存在多条等效电路。你发现了一条完整的,但另一条在原始模型里也在工作。如果你定义“完整”为“实际工作时的全部机制”,那一条电路永远不够。
- 数据分布:在训练集上保留率100%的电路,到了分布外样本上可能只保留30%。因为模型面对不同输入时,可能会使用不同的内部路径。
- 模型版本:GPT-2 small上的IOI电路,在GPT-2 medium上就已经不完全适用了。宽度变大会改变组件的分工模式。
所以,严谨的写法不是在论文里说“我们找到了完整电路”,而是说“我们在当前模型版本、当前任务定义、当前测试分布下,找到了一个保留率达到98%的充分电路”。把限定条件写全,你的结论就不会被轻易推翻。
为什么激活修补经常“找不到”遗漏的组件?
因为激活修补是局部因果测试。当你修补某个组件时,其他组件会通过残差连接补偿它的影响。这就导致该组件的影响被掩盖。只有当你系统性地关闭多条冗余路径,真正的必要组件才会现形。这也是我从“只做激活修补”转向“先搜索后消融”的原因。
有没有可能证明“绝对完整”?
在可解释性领域,绝对完整需要证明“不存在任何外部组件能影响该行为”。这无异于枚举所有并行路径,在指数级的子图搜索下,现实中的模型很难做到。所以大多数研究接受的底线是:电路外组件同时被消融后,行为保留率不低于某个阈值(比如95%)。这是工程上的完整,而非哲学上的完整。
我的判断
如果你现在要评估一个电路的完成度,我会建议你用这个组合拳:
- 先用ACDC或类似的自动搜索生成候选电路,保证一定的覆盖率;
- 再用双重消融(外部清零+内部删除)验证充分性和必要性;
- 最后在多个独立测试集和随机种子下重复,报告行为保留率的平均值和方差。
如果你发现保留率总在90%以下,别急着相信“模型不可解释”。更有可能的是,你的电路确实只抓到了一部分。这时不妨增大搜索范围,或者重新审视你的任务定义——也许你想要的“行为”本身就不是一个独立子图。
进阶阅读
想深入理解搜索算法的细节,推荐读ACDC原文(arXiv:2305.01610);想看手工电路验证的标准样本,读IOI电路(arXiv:2211.00593);想了解电路框架的最初想法,可以看Anthropic的Transformer Circuits(A Mathematical Framework)。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/702.html