文章

因果干预与分布外表征论文精读

从 activation patching、DAS 与 SAE 的因果干预出发,分析干预如何制造偏离自然流形的内部表征、何时误导机制解释,以及 Counterfactual Latent 损失如何缓解。

因果干预与分布外表征论文精读
论文精读 · 机制可解释性

因果干预正在悄悄制造"从未存在过"的表征——这会不会让我们对模型内部机制的解释,从一开始就是错的?

原文:Addressing divergent representations from causal interventions on neural networks
作者:Satchel Grant, Simon Jerome Han, Alexa R. Tartaglini, Christopher Potts(Stanford University)
arXiv:2511.04638(v1 2025-11-06,本文基于 v5 / 2026-04 的 camera-ready 源码;模板为 ICLR 2026)· cs.LG, cs.AI
代码:github.com/grantsrb/rep_divergence

一句话:机制可解释性最信赖的工具——因果干预(activation patching、DAS、SAE……)——在"编辑"神经网络的内部状态时,往往会造出模型自己一辈子都不会产生的向量。而实验的成功指标(行为改变符合预期)完全看不见这件事。

三个层次:(1) 这种"跑偏"是普遍现象,甚至在简单情形下可以被证明是必然的;(2) 有些跑偏无害(落在权重零空间里),有些则会点亮"隐藏通路"、埋下"休眠行为",让实验结论看起来被证实、实际上被误导;(3) 作者给出一个可操作的缓解手段:Counterfactual Latent (CL) 损失,把干预后的表征拉回自然分布,代价几乎为零,还顺带提升了分布外泛化。

先补课:机制可解释性的手术刀长什么样

如果你已经熟悉 activation patching 和 DAS,可以直接跳到第 2 节。但这一节的几个概念是后面所有争论的地基,值得先立稳。

1.1 为什么非要"动手",光看不行吗

机制可解释性(mechanistic interpretability)想回答的问题是:模型内部的那些数字,到底在表示什么,又是怎么变成输出的。

最朴素的做法是"看":找一个神经元,统计它在什么输入下激活得最强,然后说"这是猫神经元"。问题在于,这只是相关性。一个方向可能跟"猫"高度相关,却根本不参与模型判断猫的计算——它可能只是某个和猫共现的东西(比如毛发纹理)的副产品。

所以这个领域的共识是:要下"机制"的结论,必须做因果干预。手法很直接——把模型内部某个数值改掉,看输出变不变。如果把某个方向改成"狗"的值,模型就真的输出了狗,那这个方向就有了因果地位。

值得记住的一点

连那些本质上是"相关性方法"的工具(比如稀疏自编码器 SAE、PCA),最后也要靠因果干预来裁决它们找到的特征是不是真的。因果干预是这个领域的终审法庭。这也正是本文的分量所在:它质疑的是终审法庭本身。

1.2 Activation Patching:给神经网络做器官移植

Activation patching(激活修补 / 激活补丁)是最基础的干预方式。流程是这样的:

  1. 让模型跑一遍输入 A,把第 ℓ 层的中间激活 \(h_{\mathrm{src}}\) 记下来(这叫 source,源);
  2. 让模型跑输入 B,跑到第 ℓ 层时,把 \(h_{\mathrm{trg}}\)(target,目标)的一部分替换成 \(h_{\mathrm{src}}\) 的对应部分;
  3. 让模型带着这个"缝合"出来的向量继续往下跑,看输出。

粒度可粗可细:整层、某个 attention head、某几个神经元。当只替换一部分维度、其余保留时,这叫 interchange intervention(交换干预)

本文有一个统一视角很重要:把子空间(而不是单个神经元)当作表征的原子单位。按这个视角,"替换第 3、7 号神经元"只是"在标准坐标轴方向上做子空间替换"的特例。这个视角来自叠加假设(superposition)——一个概念往往不是由一个神经元表示,而是分布在很多神经元构成的某个方向上。

1.3 DAS:先转个坐标系,再动手

既然概念藏在"斜着的"方向上,那就先找到那个方向。Distributed Alignment Search (DAS) 干的就是这件事。

它假设:隐藏向量 \(h\in\mathbb R^d\) 可以被一个可学习的可逆线性变换(对齐函数 alignment function)\(\mathcal A(h)=Wh=z\) 转到一个新的坐标系里,在这个新坐标系下,向量被切成几段,每一段对应一个可解释的变量:

\[ z=\mathcal A(h)=\left[\,z_{\mathrm{var}_1};z_{\mathrm{var}_2};\ldots;z_{\mathrm{var}_n};z_{\mathrm{extra}}\,\right] \] // z_extra 是"和行为无关"的剩余部分,也就是行为零空间

然后交换干预就在这个新坐标系里做,做完再转回来:

\[ \hat h=\mathcal A^{-1}\!\left((I-D_{\mathrm{var}})\mathcal A(h^{\mathrm{trg}})+D_{\mathrm{var}}\mathcal A(h^{\mathrm{src}})\right) \] // D_var 是块对角的 0/1 矩阵,挑出属于该变量的那几维

怎么训练 W?用反事实标签。你手上有一个符号化的"因果抽象"(causal abstraction, CA),比如一个小程序。你问它:"如果变量 var 的值从 1 变成 4,其他都不变,正确输出应该是什么?"——那个答案 \(c\) 就是标签。模型权重全程冻结,只训练 W:

\[ \mathcal L_{\mathrm{DAS}}(\mathcal A)=-\frac{1}{N}\sum_k\log p_{\mathcal A}\!\left(c^{(k)}\mid x^{(k)},\hat h^{(k)}\right) \]

评价指标叫 IIA(Interchange Intervention Accuracy,交换干预准确率):干预之后,模型有多大比例真的输出了反事实标签要求的答案。IIA 高 → "我们找到了编码这个变量的子空间"。

Boundless DAS 是它的扩展:子空间该占几维事先不知道,于是用一个可微的边界参数把"选几维"也学出来。Wu et al. (2023) 用它在 Alpaca-7B 上跑通了大模型规模的对齐搜索,是本文实验的主要对照场景。

1.4 另外两把常见的刀

均值差向量修补(Mean Difference Vector Patching, MDVP)。最省事的做法:算出"条件 A 的平均激活"减去"条件 B 的平均激活",得到一个方向 δ,然后直接 \(\hat h=h+\delta\)。加上去模型就从 B 变 A——看起来漂亮,但下文会看到它可能是最危险的一种。

稀疏自编码器(SAE)。把 \(h\) 编码到一个超高维、极稀疏的空间 \(E(h)\),再解码回来 \(h'=D(E(h))\)。希望稀疏基底上的每一维对应一个单义(monosemantic)的特征,从而把叠加"拆开"。注意:重建向量 h' 本身就已经是一次干预了——它替换掉了原始的 h。

1.5 怎么量"跑偏了多少"

本文要衡量"干预出来的表征分布"和"模型自然产生的表征分布"差多远,用了四把尺子:

  • EMD(Earth Mover's Distance / Wasserstein 距离):把一堆点搬成另一堆点所需的最小"搬运成本",是全文的主力指标。实现上用 GeomLoss 的 Sinkhorn 近似(p=2, blur=0.05)。
  • Local PCA Distance:在最近的自然样本邻域里做 PCA 得到局部切平面,量干预点到这个切平面的正交残差。大 → 垂直于流形跑出去了。
  • Local Linear Reconstruction Error:能不能把干预点写成邻近自然点的凸组合。写不出来 → 不在局部流形上。
  • KDE 负对数密度:干预点在自然分布下的典型程度。
一个关键的方法论细节

光说"干预分布和自然分布 EMD = 30"没意义,因为采样本身就有误差。所以论文永远配一个 baseline EMD:拿"自然分布"和"另一批同样大小的自然分布样本"算 EMD。只有干预 EMD 显著超过 baseline,才说明真的跑偏了。

核心质疑:手术台上的还是原来那个病人吗

现在来到论文的起点。因果干预有一个几乎从不被检验的隐含假设

被默认为真的前提

干预所创造的"反事实模型状态",对目标模型而言是真实可能出现的状态

如果这个前提不成立会怎样?你得到的是关于"一个从未存在过的模型状态"的因果结论,然后把它当作对真实模型机制的解释。作者举了个刺眼的例子:Anthropic 2025 年那篇 biology of LLM 的工作里,某些 activation patching 实验把特征值乘到了 15 倍。你很难相信那还落在模型的自然分布里。

2.1 表征流形:一个必要的直觉

把第 \(\ell\) 层的隐藏向量想成高维空间里的点。模型在真实数据上跑出来的所有 \(h\),并不会均匀铺满整个 \(\mathbb R^d\)——它们聚集在一个低维、弯曲的流形上,某一类输入的表征又聚成流形上的一小团(记作 \(\mathcal S_K\),类 \(K\) 的支撑集)。

论文对"跑偏"给出的定义就很直白:若干预后本应属于类 K 的表征 \(\hat h\notin\mathcal S_K\),就称它是 divergent(发散的 / 分布外的)

2.2 一个小到可以手算的证明:坐标拼接几乎必然出界

设类 K 的表征落在一个二维圆盘里:中心 c_K,半径 r_K。取两个都合法的自然表征 \(h_{\mathrm{src}}=c_K+u\)、\(h_{\mathrm{trg}}=c_K+v\),做最普通的坐标修补——第 1 维取 src 的,第 2 维取 trg 的:

\[ \begin{aligned} \hat h&=\left[h_1^{\mathrm{src}},h_2^{\mathrm{trg}}\right] \;\Longrightarrow\; \hat h-c_K=(u_1,v_2),\\ \lVert\hat h-c_K\rVert_2^2&=u_1^2+v_2^2. \end{aligned} \]

只要取 \(u=(r_K,0)\)、\(v=(0,r_K)\)——两个都在圆周上的完全合法的点——就得到 \(\lVert\hat h-c_K\rVert_2=r_K\sqrt2>r_K\)。拼接出的点飞到了圆盘外面。

论文在附录把这个结论推广成一个漂亮的刻画定理

定理(论文附录 A.2)

定理本体:令 \(I_i=\pi_i(\mathcal M)\) 是 \(\mathcal M\) 在第 \(i\) 个坐标上的投影。\(\mathcal M\) 对所有坐标拼接封闭(patch-closed),当且仅当 \(\mathcal M=I_1\times\cdots\times I_d\),即它恰好是自己各坐标投影的笛卡尔积。

凸情形推论:如果 \(\mathcal M\) 还是凸的,每个 \(I_i\) 就是一个区间,于是 \(\mathcal M\) 必须是轴对齐的超矩形。反过来说:任何非轴对齐超矩形的凸集——球、椭球、斜面多面体——都一定存在合法的 \((\mathrm{src},\mathrm{trg})\) 组合,其拼接结果落在集合之外。样本量够大时,跑偏不是可能,是必然。

(论文正文 §3.1 把这句话概括成"除轴对齐超矩形外的所有流形形状",比附录的定理略宽——附录的推论明确限定在凸集上。非凸的例子确实存在:{0,1}² 这四个点就是 patch-closed 但不是超矩形。)

下面这个演示可以直接体验:拖动两个橙色点,看蓝色的拼接点什么时候飞出去;再把流形形状切成矩形,看它为什么永远飞不出去。

交互演示 1
坐标拼接如何把表征推出流形
拖动两个橙色的自然表征点,蓝色点是"第 1 维取 src、第 2 维取 trg"的拼接结果。
自然表征(src / trg) 拼接结果 ĥ 落在流形之外的 ĥ
‖ĥ − c‖ / r
采样越界比例
拖动看看。
切到"轴对齐矩形"你会发现越界比例恒为 0%——这正是定理说的:在凸集里,轴对齐超矩形是唯一对坐标拼接封闭的形状。真实网络的类流形几乎不可能长成轴对齐的盒子,所以跑偏是结构性的,不是运气问题。

2.3 那真实模型里呢?三种主流方法,全都跑偏

理论归理论。作者在真模型上量了三种最常用的干预:

  • 均值差修补:复现 Feng et al. (2024) 的实体绑定实验,Llama-3-8B-Instruct 第 10 层(已经是所有层里 EMD 最小的一层),100 个上下文 × 4 个 token 位置;
  • SAE:SAELens 的预训练 SAE,Llama-3-8B-Instruct 第 25 层,2000 个向量;
  • Boundless DAS:Wu et al. (2023) 的原始设置,1000 个向量。
论文图 2:三种干预方法产生的表征发散
论文 Figure 2(原图)。(a) 坐标修补的示意——把一个自然表征(橙)的某一维换成另一个的值,蓝色的拼接结果最终铺满了外接方形,跑出了圆形流形。(b) 自然表征(橙)与对应干预表征(蓝)在前两个主成分上的投影,三种方法各一栏。(c) 干预分布 vs 自然分布的 EMD(深色),与自然-自然的 baseline EMD(浅色)对照。

结论一眼可见:三种方法的干预 EMD 都高于各自的 baseline。要注意的是,三根柱子之间不能横向比大小——它们来自不同模型、不同层、不同任务,绝对量级没有可比性。有意义的是每种方法相对自己 baseline 的超出量:按这个读法,Boundless DAS 的超出最明显(≈31 vs ≈7),SAE 的绝对值虽然最高但 baseline 也高(≈32 vs ≈25),均值差修补最温和(≈9.5 vs ≈4)。论文本身没有给这三者排序。

作者的克制

论文特意写了一句:"这个结果并不意味着这些方法无效或它们的结论是错的;这些图只是为了说明发散存在。" 这个克制很重要,也是全文的基调——问题不是"这些工具没用",而是"我们从来没检查过这个维度"。

什么时候无害,什么时候致命

发散普遍存在。那它要紧吗?论文的回答分成两半,而且反复强调一个前提:有害与否,取决于你想下什么结论。

3.1 无害的一类:躲进零空间

权重矩阵 W 的零空间是 \(\mathcal N(W)=\{v:Wv=0\}\)。如果你的干预带来的偏移 v 恰好落在这里面,那么:

\[ W(h+v)=Wh+Wv=Wh+0=W(h+0) \]

下游什么都感觉不到。论文把这个概念从矩阵推广到任意函数——对第 ℓ 层之后的全部计算 \(f_{\ge\ell}\) 定义行为零空间

\[ \mathcal N(\psi,X)=\left\{v\in\mathbb R^d:\forall x\in X,\ \psi(x+v)=\psi(x)\right\} \]

落在行为零空间里的发散,对"这个子空间编码了变量 var"这类功能层面的论断是无害的。

但有个陷阱

\(Wv=0\) 意味着 \(W_{i,j}v_j=0\)。整体矩阵乘法的结果没变,不代表其中每一步子计算没变——它们只是互相抵消了。所以:对"这一层整体做了什么"的论断无害,对"第 i 行第 j 列这个乘法在干什么"的论断可能致命。你的结论粒度越细,能容忍的发散就越少。

一个精巧的构造:行为二值子空间

论文举了个例子说明"发散甚至可能是想要的"。设子空间 \(z_{\mathrm{var}_b}\) 是行为二值的——它只通过符号影响下游输出,具体数值无关紧要:

\[ \operatorname{sign}\!\left(D_{\mathrm{var}}\mathcal A(h)\right) = \operatorname{sign}\!\left(D_{\mathrm{var}}\mathcal A(h')\right) \;\Longrightarrow\; f(h)=f(h') \]

再设 \(z_{\mathrm{var}_a}\) 和 \(z_{\mathrm{var}_b}\) 协变(在自然数据里总是一起变)。现在从 \(x_{\mathrm{low}}\) 取 \(\mathrm{var}_b\)、从 \(x_{\mathrm{high}}\) 取 \(\mathrm{var}_a\) 拼在一起——这个组合在自然分布里从未出现过(因为它们协变),所以确实是发散的;但因为 \(\mathrm{var}_b\) 的符号没变,行为纹丝不动。

这时候的发散是无害的,甚至是目的本身:你正是要打破自然协变,才能确认哪个方向真的在起作用。论文更进一步指出,你甚至可能刻意想去干预零空间——为了因果地验证"它确实是零空间"。

3.2 致命的一类之一:隐藏通路(hidden pathways)

隐藏通路的定义:某个单元、方向或子电路,在给定语境的自然表征上从不激活,但在干预之后被点亮,并且影响了行为。

论文给了一个能手算的最小反例。两层电路,中间过 ReLU,最后加总得到分数 \(s\),\(s>0\) 判为 A 类:

\[ \begin{aligned} s&=\mathbf 1^{\mathsf T}\operatorname{ReLU}(W_\ell h^\ell+b_\ell),\\ W_\ell&= \begin{bmatrix} 0.75&0.25&0&0.5\\ 0&1&0&0\\ 1&1&-1&-1 \end{bmatrix}, \qquad b_\ell= \begin{bmatrix}-0.5&-0.5&0\end{bmatrix}. \end{aligned} \]

自然表征只有四个(两类各两个 case)。关键观察:在全部自然输入上,第 3 个隐藏单元 \(u_3\) 永远是 0(被 ReLU 截掉)。它在自然状态下是"死的"。

现在做均值差修补:\(\delta=\mu_A-\mu_B=[0.5,0.5,0,-0.5]\),加到 B 类表征上。行为上大获成功——\(s\) 从 0 变成正数,B 被翻成了 A,实验"验证"了你的假设。但是:

交互演示 2
均值差修补如何点亮一条自然状态下永远沉默的神经元
拖动强度 \(\alpha\),看 \(\hat h=h_B+\alpha\delta\) 在三个隐藏单元上的响应。留意 \(u_3\)。
分数 s
判定
u₃(隐藏通路)
表征u₁u₂u₃s说明
自然 A(case 1)0.25000.25走 u₁ 通路
自然 A(case 2)00.5000.50走 u₂ 通路
自然 B(两个 case)0000全灭
干预后 B→A(case 1)000.500.50只走 u₃——自然界不存在的通路
干预后 B→A(case 2)0.25000.25走 u₁,恰好是自然通路
这就是整篇论文最扎心的地方:case 1 和 case 2 的行为结果完全一样(都翻成了 A),但内部走的是完全不同的通路。只看 IIA / 行为指标,你分辨不出来。而勾选"投影回 conv(𝒮_A)"——把干预点拉回 A 类自然表征的凸包——u₃ 的激活消失了,决策边界也不再被跨过,说明原本那次"成功"完全是发散造成的,跟模型的自然机制无关。

3.3 致命的一类之二:休眠行为(dormant behavioral changes)

更隐蔽的一种。有些干预在你测试的那些上下文里看起来完全无害——行为一点没变——但换一个上下文,它就爆炸了。形式上:

\[ \mathcal V(\psi,X,\mathcal C_1,\mathcal C) = \mathcal N(\psi,X,\mathcal C_1)\setminus\mathcal N(\psi,X,\mathcal C) \] // 在上下文子集 𝒞₁ 里是零空间,在全体上下文 𝒞 里不是

论文把上面的电路再接一层:加一个恒为 0 的第 4 维,加一个上下文向量 \(v=[0,0,0,v_4]\),再接一个仿射层输出三类 logits(A / B / C)。

关键数字:自然状态下 \(h_3\) 恒为 0,所以 \(\hat y_3=v_4-1\);要在 \(\arg\max\) 上压过 \(\hat y_2=0.25\),需要 \(v_4>1.25\)。但干预之后 \(h_3=0.5\)(就是上面那个隐藏通路留下的痕迹),\(\hat y_3=v_4-0.5\),阈值提前到了 \(v_4>0.75\)

(一个小出入:论文正文写的是“\(v_4\) 低于 1 时不会自然产生 C 类预测,因为 bias 阈值”,把危险窗口记作 \(1>v_4>0.75\)。那是只看 \(\hat y_3\) 何时转正(\(\mathrm{bias}=-1\))的说法;若按三类 \(\arg\max\) 严格算,自然状态要到 \(v_4>1.25\) 才会输出 C,窗口是 \(0.75<v_4<1.25\)。本文和下面的演示用后者,结论方向完全一致。)

交互演示 3
同一次干预,换个上下文就翻车
拖动上下文值 v₄,对比自然表征与干预后表征的预测。注意中间那条红色危险带。
自然 B 表征 → 预测
干预后表征 → 预测
0.75 < v₄ < 1.25 这一段里,干预后的模型输出 C,而自然状态下这个上下文根本不可能产生 C。如果你的评测集恰好只覆盖了 v₄ < 0.75,你会得出"这次干预行为上是安全的"——完全正确,也完全误导。
论文由此给出建议:因果干预实验应当 (1) 报告零空间之外引入了多少表征发散,(2) 显式测试干预结果对上下文的敏感性。要穷举所有上下文当然不现实——这正是问题的难处。

附赠彩蛋:平衡子空间

附录里还有第三个例子。设某层输出 \(y=h_1-h_2+\tfrac12h_3+\tfrac12h_4\),而在所有自然数据上恰好 \(h_1=h_2\)——两个方向互相抵消,形成"平衡子空间"。在自然分布上,h₁ 和 h₂ 对输出毫无因果影响。但只要你单独干预 h₁ 或 h₂ 而不动另一个,抵消就被打破,y 的符号可以被翻转。你会拿到一个漂亮的"因果证据",证明一个在自然状态下根本不起作用的机制。

(论文老实承认这种结构在真实模型里不太可能精确出现,因为它要求权重矩阵有两行是彼此的标量倍数;但在低秩输入的情况下,局部近似地出现是有可能的。)

论文图 1:隐藏电路与休眠行为示意
论文 Figure 1(原图)。(a) 虚线是 A、B 两类的自然通路;被修补的表征走的却是实线——橙线通向看似验证了假设的输出(misleadingly confirmatory),红线通向一个你从没测试过的输出(untested)。(b) 同一批干预表征(浅色)相对自然表征(深色)的发散,落在什么样的"功能地形"上决定了它无害(上)还是致命(下):橙色区域是隐藏电路区,红色区域是休眠行为区。
这一节最该带走的一句话

无害与致命不是互斥的,也不是表征本身的属性——它取决于你打算用这次干预支撑什么样的机制论断。同一个发散,对"这个子空间编码了 X"是无害的,对"这条电路是模型计算 X 的方式"可能是致命的。

解药:Counterfactual Latent 损失

诊断完了,怎么治?

已有的思路是"事后投影":把干预出来的表征硬拉回自然流形。但作者想要的是更有原则的东西——让生成干预的那个函数本身,就倾向于产出自然的表征。于是他们借用了 Grant (2025, Model Alignment Search) 里的 Counterfactual Latent (CL) 损失

4.1 反事实潜向量:一个朴素但好用的想法

核心问题是:干预之后,\(\hat h\) 应该长什么样?我们没有 ground truth……真的没有吗?

其实有。假设你做的干预是“把 \(\mathrm{var}_u\) 设成 \(u\)、\(\mathrm{var}_w\) 设成 \(w\)”。那么去自然数据里找那些本来就满足 \(\mathrm{var}_u=u\) 且 \(\mathrm{var}_w=w\) 的样本,把它们的表征平均一下:

\[ h_{\mathrm{CL}}=\frac{1}{m}\sum_{i=1}^{m}h_{\mathrm{CL}}^{(x_i)} \] // 每个 xᵢ 在 CA 标注下都有 var_u=u, var_w=w

这就是反事实潜向量(counterfactual latent vector)——"如果干预成功了,模型自然状态下本该长成的样子"。它是免费的监督信号:只要你的因果抽象能给数据打标签,你就能构造它。

然后把它当作 \(\hat h\) 的回归目标,L2 + 余弦各占一半:

\[ \begin{aligned} \mathcal L_{\mathrm{CL}}(\hat h,h_{\mathrm{CL}}) &= \frac12\lVert\hat h-h_{\mathrm{CL}}\rVert_2^2 - \frac12\frac{\hat h\cdot h_{\mathrm{CL}}}{\lVert\hat h\rVert_2\lVert h_{\mathrm{CL}}\rVert_2},\\ \mathcal L_{\mathrm{total}} &= \varepsilon\mathcal L_{\mathrm{CL}}+\mathcal L_{\mathrm{DAS}}. \end{aligned} \] // ε 是可调权重

4.2 在 7B 大模型上:EMD 掉下去,IIA 没掉

作者直接改了 pyvene 里复现 Wu et al. (2023) 主结果的 Boundless DAS notebook(Llama 系 7B 模型),只加一项 CL 损失,其他超参一律不动。

论文图 3:CL 损失的效果
论文 Figure 3(原图)。(a) Boundless DAS 场景下自然(橙)与干预(蓝)表征的 PCA:上为 ε=0,下为 ε=6,两者最终 IIA 相同。(b) IIA(橙)与 EMD(紫)随 CL 权重 ε 的变化——小 ε 区间里 IIA 稳住甚至略升,EMD 单调下降。(c) CL 损失的示意图。(d)(e) 合成任务的两个因果特征维度:深色为自然表征,浅色为干预表征;(d) 只用行为损失训练的 DAS,(e) 只用 CL 损失训练。(f) 跨任务(OOD)迁移的 IIA。

图 (b) 是全文最有说服力的一张图:在 ε 不太大的区间里,IIA 几乎不掉(甚至略微上升),而 EMD 一路下降。也就是说,减少表征发散不需要牺牲可解释性方法本身的效力——这在方法论上是"免费午餐"。ε 继续加大,IIA 才开始塌,那是 CL 项压过行为项的正常代价。

4.3 改进版:只约束因果维度

原版 CL 损失约束的是整个 \(\hat h\),包括那些和行为无关的 \(z_{\mathrm{extra}}\)。作者把它改成只作用在 DAS 找到的因果子空间上:

\[ \begin{aligned} \hat h^{\mathrm{var}_i} &= \mathcal A^{-1}\!\left(D_{\mathrm{var}_i}\mathcal A(\hat h)\right),\\ h_{\mathrm{CL}}^{\mathrm{var}_i} &= \operatorname{stopgrad}\!\left(\mathcal A^{-1}\!\left(D_{\mathrm{var}_i}\mathcal A(h_{\mathrm{CL}})\right)\right),\\ \mathcal L'_{\mathrm{CL}} &= \sum_i\left[ \frac12\lVert\hat h^{\mathrm{var}_i}-h_{\mathrm{CL}}^{\mathrm{var}_i}\rVert_2^2 - \frac12\cos\!\left(\hat h^{\mathrm{var}_i},h_{\mathrm{CL}}^{\mathrm{var}_i}\right) \right]. \end{aligned} \]

这个版本可以脱离行为损失单独使用(对应上图 (e))。它只管"因果维度上的值对不对",不去管零空间里发生了什么——这恰好呼应第 3 节的理论:零空间里的发散本来就是相对无害的。

合成实验的设置

为了能精确控制"真值",作者构造了一个玩具数据集,模拟某个中间层的表征:

  • 两个因果特征维度:\(x_1\in\{-1,1\}\),\(x_2\in\{0,1,2,3,4\}\),笛卡尔积得到 10 个类
  • 每个网格点周围加高斯噪声(\(\sigma=0.1\))并引入协变结构;
  • 再拼上 16 个独立的纯噪声维度 → \(h\in\mathbb R^{18}\);
  • 在这上面训一个小 MLP(BatchNorm → 128 宽隐层 → ReLU → dropout 0.5 → BatchNorm → 10 类),然后冻结,只训 DAS 对齐矩阵。

定量结果:只用行为损失,因果维度上的 EMD 是 0.032 ± 0.003;只用 CL 损失,降到 0.007 ± 0.001——降了约 4.5 倍。而 IIA 分别是 0.997 ± 0.001 和 0.9988 ± 0.0005,CL 版本反而更高

交互演示 4
IIA 满分的干预,表征可以烂成什么样
按论文的合成任务思路重建的模拟。切换损失函数,观察 IIA 和表征发散这两个指标的脱钩
自然表征 干预后表征 ĥ 虚线 = 决策边界
IIA · 行为指标
越界比例 · 表征指标
簇面积比(理想 1.00)
把协变强度 ρ 拉大,你会看到自然表征(橙)收缩成一条倾斜的细带,而干预表征(蓝)却摊成一团与坐标轴对齐的方形云——因为交换干预把 Dim 1 和 Dim 2 的联合结构拆散了:它保留了目标点的 Dim 1 偏移、换上了源点的 Dim 2 偏移,而这两个偏移在自然数据里本该是绑定的。这些"从未同时出现过"的组合,正是论文 4.1 节讨论无害发散时用的那个"因果子空间协变"例子。
关键在于:越界比例(干预点落在自然簇 95% 等高线之外的比例)一路飙到接近一半,IIA 却纹丝不动地停在 100%——因为这些点虽然离开了自然簇,却还留在同一个决策格子里。这就是论文反复强调的:行为指标对表征发散是盲的。切到「加上 CL 损失」并调大 ε,干预表征被拉向反事实潜向量——自然数据里变量值本就正确的那些表征——两个指标才终于一致(ε ≈ 0.85 时越界比例回到 3–4%,簇面积比回到 1 附近)。
实现说明:论文把 hCL 定义为一组同变量值自然表征的均值;本演示把 ε 建模为向单个自然反事实表征的插值,以避免均值目标在 ε→1 时把整簇压成一个点。论文里 ε 过大同样有代价——Figure 3(b) 显示 ε 继续增大后 IIA 会开始下滑。
(此演示为按论文数据生成方式与 DAS/CL 机制重建的模拟,用于建立直觉,非论文原始实验数据;论文原图见上方 Figure 3(d)(e)。)

4.4 发散真的会带来实际代价吗:OOD 迁移实验

到这里有人会问:既然 IIA 一样高,干预表征漂不漂亮有什么实际差别?

作者设计了一个漂亮的检验。把 10 个类切成两个分区——一个"稀疏"(类间距大)、一个"稠密"(类间距小),各自训一个 MLP 和一套对齐矩阵,然后拿在稀疏分区上训的对齐矩阵去测稠密分区,反之亦然

论文附录图:合成任务的稠密/稀疏分区
论文附录图(原图)。左:默认任务的两个分区(各 8 类,互相包含对方的留出类)。右:OOD 任务,稀疏分区(粉)与稠密分区(蓝)在类间距上严格分离,10 类中有 2 类被完全排除。

结果:CL 损失训出来的对齐矩阵,跨分区迁移的 IIA 更高(论文 Figure 3f;论文只给了均值与误差棒,没有报告显著性检验)。更进一步,作者把 30 次训练(2 分区 × 5 种子 × 3 种损失配置)的"训练时 EMD"对"OOD IIA"做了个 OLS 回归:

\[ \begin{aligned} \mathrm{IIA}&=0.9885-0.3424\times\mathrm{EMD},\\ R^2&=0.729,\qquad F(1,28)=75.28,\qquad p=2.0\times10^{-9},\\ 95\%\ \mathrm{CI}&=[-0.423,-0.262]. \end{aligned} \]

训练时的表征发散越大,对齐矩阵迁移到新分布时越不灵。发散不只是"哲学上不干净",它是可测量的性能损失。

作者自己划的界

"最小化发散的幅度并不能保证消除隐藏通路;它只是缩小了风险面。" 论文把这句话放在第 5 节的开篇,等于先给自己的解法划好了边界。CL 损失是一把钝器——它无差别地压制所有发散,包括那些无害甚至有用的。真正针对"致命发散"的方法,作者留给了未来工作。

实践清单与评价

5.1 如果你明天要做一个 patching 实验

把论文的建议整理成可执行的检查表:

  1. 报告发散,而不只是 IIA。算一下干预表征和自然表征的距离(EMD / local PCA 残差 / KDE 密度),并且一定要配 baseline(自然-自然的同规模比较)。
  2. 做投影对照实验。把干预点投影回目标类的凸包或局部 PCA 子空间,重跑一次。如果效应消失了(像演示 2 里那样),说明你原本测到的是发散的产物,不是自然机制。
  3. 做 ReLU / 激活模式审计。检查干预后有没有单元、注意力头或子电路被点亮,而它们在所有自然样本上都是沉默的——那就是隐藏通路。
  4. 测上下文敏感性。同一个干预换到别的上下文、别的 prompt 模板、别的位置上再跑。休眠行为只有这样才会现形。
  5. 写清楚你的论断粒度。"这个子空间编码了 X"和"模型用这条电路计算 X"是两种强度完全不同的论断,能容忍的发散量也完全不同。别让读者(和自己)混淆。
  6. 如果你在训练对齐函数,考虑加一项 CL 损失。只要你的因果抽象能给数据打标签,反事实潜向量就是免费的;小权重下几乎不损失 IIA。

5.2 这篇论文的分量与局限

它做对的:把一个大家隐约不安、但从没被系统检验的假设摆到台面上,并且给了三层递进的证据——数学上的必然性(超矩形刻画定理)、真实模型上的普遍性(三种方法的 EMD)、以及具体的失效机制(隐藏通路 + 休眠行为的最小反例)。最后还附了一个可操作、代价近乎为零的缓解方案,并用 OOD 回归证明这不只是洁癖。这是一篇结构非常完整的"方法论体检报告"。

它没做到的(作者自己也承认):

  • 没有一般化的"有害性判定"方法。附录给了个基于局部 PCA + 行为测试的算法,但它自己声明"只是近似,不保证成功",而且对休眠行为基本无能为力——要检出休眠行为,原则上需要遍历所有上下文。
  • CL 损失不区分好坏发散。它把无害的、有用的发散一起压掉了。而第 3 节明明论证了"有时候你就是想制造发散"(比如为了打破自然协变、或者为了验证某个方向确实在零空间里)。
  • 改进版 CL 损失只在极简的合成设定里验证过——18 维、单隐层 MLP、10 个类。7B 模型上跑的是原版 CL 损失,测的也只是 EMD 和 IIA,没有跨分布迁移的证据。
  • CL 损失需要一个能给数据打标签的因果抽象。在你已经知道答案的玩具任务上这很容易;在你正想搞清楚模型在算什么的真实场景里,这个前提本身就很强。论文在 Boundless DAS 实验里也不得不专门生成含有合法 CL 向量的 token 序列,因为原数据集里几乎找不到。

5.3 更大的图景

论文最后一节写得挺坦率,我把它的意思翻译一下:

按本文的理论框架,任何落在网络层零空间之外的发散,原则上都可能是致命的。这对"用现有工具达成对神经网络的完整机制理解"这个愿景来说,是一个不小的打击。

但作者的结论并不悲观,理由有二:其一,很多实际的机制研究项目,只要收集足够大的干预评测集,就已经能满足需求;其二,像 CL 损失这样的方法还有很大发展空间。

我自己的感受是,这篇论文最有价值的贡献不是那个损失函数,而是它提供了一个新的诊断维度。在此之前,一个 patching 实验的质量只有一个坐标轴——IIA / 行为指标。这篇论文加上了第二个轴:表征保真度。而演示 4 想说明的正是:这两个轴是可以完全脱钩的。一个 IIA 99.9% 的实验,其内部状态可能离模型的自然分布相当远。

如果这个第二坐标轴能在社区里变成标配(就像机器学习论文里报告 std 和随机种子那样),这篇论文的目的就达到了。

本文由作者按照 CC BY 4.0 进行授权