阶段 8 · 前沿范式

机械可解释性:前面 74 章都在造它
却没人能说清它里面在算什么

上一章《持续学习与遗忘》把「学新的会忘旧的」说透了,代价来自参数共享。
这一章正好接住:打开模型,看它里面在算什么。

1

先划清界限:看注意力图不算

很多人以为机械可解释性就是「把注意力权重画出来,看模型关注了哪些词」。 这是一种感觉很聪明但其实没什么用的做法。

比什么看注意力图机械可解释性
得到什么一张权重热力图 一个具体的计算机制
能回答什么「模型在看哪」 「模型怎么算出这个答案的」
根本问题 注意力权重只是中间产物,它经过后面十几层的 前馈网络和残差连接之后,可能完全被改写甚至被抵消 它追踪的是从输入到输出的完整因果链
类比 看着一个人的眼动轨迹,猜他在想什么 把他的神经回路拆开,找出具体哪几个神经元在传递这个信号
⚠️ 一个真实的教训

早期有大量论文靠「注意力图看起来很合理」来论证模型在正确推理。 后来的因果实验发现:把那些高权重的部分改掉,模型的输出可能一点不变。
这说明那张好看的热力图只是巧合,不是机制。 「看起来合理」是所有可解释性方法最大的陷阱。

来源:Jain & Wallace 2019《Attention is not Explanation》;Serrano & Smith 2019《Is Attention Interpretable?》。

机械可解释性的三个层次(由浅入深)

① 行为解释 —— 输入变了,输出怎么变 只动输入、只看输出,完全不碰模型内部。比如「同一句话换个说法,翻译结果会怎么变」。 能发现规律,但完全不知道原因。
② 表征解释 —— 内部激活里编码了什么 用探针(一个线性分类器,见第 2 节)从激活里读出某个概念。能回答「信息在不在这里」, 但回答不了「模型有没有在用这个信息」。
③ 电路解释 —— 哪些组件协作完成了这个计算 找出完成某个具体任务的最小计算子图。 这是唯一能说「我懂了」的层次,也是最难的——目前只在很小的模型上做到过。

把残差流想成一条公共传送带:第 1 层把一个方向放上去,后面每一层又往上传新的内容。 叠得越多,原来那个方向就越难认出来。

互动 · 同一个方向,走过 12 层之后还认得出来吗

2

五个工具:从「猜」到「证明」

工具怎么做能得到什么局限
探针 Probe 用一个线性分类器从激活里读出某个概念 能读出 → 信息确实在那 只能说「在那里」,不能说「在用」
激活修补
Activation Patching
把某个位置的激活换成另一个输入的,看输出怎么变 因果关系。这是它和探针最本质的区别 要跑很多次前向;选哪些位置有组合爆炸
稀疏自编码器 SAE 把叠加在一起的激活分解成稀疏的特征方向 单个神经元解释不了的,SAE 能拆成单义特征 训练成本极高;拆出来的特征未必是模型真在用的
电路分析
Circuit Analysis
逐层找出哪些组件对这个任务是必要的 一个完整的机制解释 只能在小模型上穷尽,规模一大就做不完
Logit Lens 把中间层的激活直接当最后一层,和词表里每个词比一遍 读出词表上的概率,看模型「中途在想什么」 只在后几层有意义,浅层的投影是乱的
💡 记住这条分界线

相关性 ≠ 因果性。探针和 Logit Lens 给的是相关性; 激活修补给的是因果性——因为它真的动手改了东西,然后看结果会不会变。
任何可解释性发现,如果没有做过因果验证,都只能算一个假说。

3

亲手训一个探针,再被它骗一次

下面的探针是一个 16 维输入的逻辑回归,在 96 个样本上训练、32 个样本上测试。 数据里埋了一个「概念」,你要看探针能不能把它读出来。

互动 · 探针:读出信息 ≠ 模型在用信息

⚠️ 现在把「编码强度」拉高、「模型是否使用」拉到 0

你会看到一种很危险的情况:探针准确率高达 95% 以上,但激活修补的效果是 0。
意思是:这个概念确实被编码在激活里,但模型做决策时根本没用它。
如果你只看探针准确率就下结论「模型在用这个概念做判断」,那就错了。 这就是为什么探针必须配合激活修补。

🎯 类比

你偷看一个人的日记,发现里面写着「我觉得这家餐厅不好吃」。
这证明了这个想法在他脑子里(探针能读出来)。 但他最后有没有真的因为这条信息而不去那家餐厅吃?那是另一回事。
要验证后者,你得动手改掉他的记忆,然后看行为变不变——这就是激活修补。
这个类比管到「读出来 ≠ 用上」为止:人的记忆不是向量,改激活也不等于改记忆。

4

为什么不能直接读神经元

最自然的想法是:找一个神经元,看它对什么输入响应最强,就知道它在检测什么。
这个想法在真实的模型上基本是错的。原因是「叠加」(superposition)。

模型要表示的特征数量,远远多于它拥有的维度数(GPT-2 的激活只有 768 维, 却要表示上万个特征;Llama-2-70B 也只有 8192 维)。 怎么办?让特征方向不必互相垂直——在几千维空间里塞进成千上万个 「几乎但不完全正交」的方向。代价是它们会互相干扰,这就是叠加。 后果是任何一个神经元都同时响应好几个毫不相关的概念, 这种神经元叫多义神经元(polysemantic neuron)。

互动 · 12 个特征挤进 6 个维度,再用稀疏编码拆开

左起:① 神经元看到的 6 个激活值(一共只有 6 个数) ② 字典矩阵——每一行是一个神经元,深色格表示它有明显权重。 看每一行有几个深色格:那就是这个神经元混进去的特征数 ③ 真实的 12 个特征(只有 2 个亮着) ④ SAE 恢复出来的(应该也能恢复出那 2 个)

激活的重构误差
—
恢复出的特征数
—
与真值的匹配度
—

稀疏惩罚 λ 的权衡(这个曲线是真的算出来的)

这就是阶段 1 讲过的正则化的一种:λ 太小 → 恢复出的特征又多又杂(把噪声也当成特征); λ 太大 → 该有的特征也被压成 0(丢失信息)。中间那个拐点才是好的分解。

💡 这一章的关键画面

这一章全部的内容都藏在这两张图里。左边 6 个数根本看不出是哪两个特征被激活; SAE 用「宽瓶颈(6 → 12)+ L1 稀疏」把它们拆成 12 个清清楚楚的位置, 再用 λ 平衡「拆得准」和「拆得少」。拖那个 λ 滑块,看它什么时候刚好恢复出 2 个。

把上面那两张图,写成一行公式

前面两张图里真的跑了一遍 ISTA(近端梯度法:每步先沿梯度下降一小步,再把接近 0 的系数压成 0)。 它每轮迭代都在优化这一行:â = argmin(重构误差 + λ · 非零系数总量)—— 在「拼得像」和「用得少」之间找平衡。正式的三层公式卡在 数学那一节,那里每个符号都对着图上具体的一块。

盯住这两个量:‖x − D·a‖² 是「拼得像不像」, ‖a‖₁ 是「用了几个特征」。 ‖a‖₁ 之所以能逼出稀疏,是因为它的等高线是菱形: 菱形有尖角,而尖角正好落在坐标轴上,所以最优解天然会把某些位置压成整零。 换成 ‖a‖₂(圆形等高线)就没这个效果。

这就是阶段 4 那章自编码器里那个稀疏自编码器的主场: 普通自编码器的瓶颈是窄(维度变少);SAE 的瓶颈是宽(维度变多), 但加一个 L1 惩罚逼它稀疏。窄瓶颈逼模型压缩,宽 + 稀疏逼模型解耦, 所以它能拆开叠加。

5

已经找到的东西

这一节不是展望,是已经做出来的具体发现。 四条里,① 归纳头和 ② 事实回忆电路过了因果验证;③「知道和说出」只到「信息在那里」, ④ SAE 特征是不是模型真在用,是第 7 节要说的最大问号。

① 归纳头(Induction Head):上下文学习的机制基础

这是机械可解释性最漂亮的一个成果——一个具体的两层电路,功能是「复制之前出现过的模式」。

输入: … A B … A
预测:      B    ← 找上一次 A 出现在哪,把它后面那个词复制过来
层它干什么类比
第一个头
(前一层)
对每个位置,找出「上一个和它相同的 token 在哪」 「上一集的这个演员」
第二个头
(归纳头)
把那个位置后面一个词的内容搬过来 「那他下一句说了什么,接着说」

上下文学习(in-context learning)是 GPT-3 之后最神秘的能力—— 你给几个例子,模型就会做新任务,不用训练。 归纳头给了一个具体的机制解释:模型在做的,就是「照着前面的例子抄」。 训练中归纳头一成型,上下文学习的准确率就跳上去; 这条结论过了因果验证:把这个头消融掉,能力也跟着掉。

互动 · 一个真的「归纳头」:两层头合起来就是一次抄写

下面是真的两个注意力头:token 向量是真的随机向量,注意力权重是真的点积再 softmax 算出来的。 输入的 token 序列是 A B C D A B C,最后一个 C 就是提问位置。

② 事实回忆电路:知识存在哪、怎么取出来

「巴黎是法国的首都」这种事实,到底存在模型的哪里?答案是分工明确的三个环节:

环节谁负责做什么
定位注意力头 把主语「巴黎」这个词的信息搬运到最后一个位置
提取前馈层 MLP 它其实是一张键值表—— 用「巴黎」当键,取出「法国」这个值
输出最后的投影层 把提取到的内容变成词表上的概率
⚠️ 顺带说清了阶段 3 的一个疑问

在 Transformer 那一章我们说过「注意力不存储知识,真正存知识的是前馈层, 它占了 2/3 的参数」。机械可解释性证实了这个说法—— 因果实验发现:把特定的 MLP 层破坏掉,模型就答不出对应的事实,但语言流畅度不受影响。
这就是「找对了地方」的感觉。

互动 · 前馈层真的就是一张键值表

③ 「知道」和「说出」是分开的

一个很反直觉的发现:模型经常知道正确答案,但输出了一个错误的答案。
证据是:在某些错误回答的样本上,如果你把某一层中编码了正确答案的激活「修补」回去, 模型立刻就会改口说对。
这意味着「幻觉」不完全是「不知道」——有时候是「知道但没说」。 这个区分对安全研究极其重要:前者需要补知识,后者需要改行为。

互动 · 把正确答案的激活「修补」回去

④ SAE 在真实模型上找到了什么

在大模型上训练 SAE 之后,研究者找到了大量单义、可命名的特征。几个真实的例子:

特征它的行为
金门大桥 对「金门大桥」这个具体地点响应,跨语言、跨模态—— 中文、英文、图片都能触发同一个特征
代码里的错误 对不安全的代码、有 bug 的代码响应
谄媚 对「附和用户、而不是说出真相」的文本响应
讽刺 对反讽、阴阳怪气的表达响应
各种抽象概念 数学推理、语法错误、代码 bug、未公开的手写签名……

这些特征不是按「词」组织的,是按「意思」组织的: 一个「金门大桥」特征,中文、英文、文字、图片都会让它亮起来。 金门大桥这条还做过干预验证——把它调到最大,模型的话题就会全变成金门大桥。 不过这不等于「所有 SAE 特征都在被模型使用」:单个特征是不是真的在用,要一条条过因果验证 (第 7 节第三条)。

6

这个领域的方法家族

互动 · 机械可解释性的方法演进

方法核心手段它回答的问题
Probing 2016 线性分类器读激活某个概念在不在激活里
Logit Lens 2020 中间层激活直接投影到词表模型中途倾向于输出什么
Causal Tracing 2022 破坏 + 恢复激活,找出关键位置事实存在哪、怎么被取出来
Activation Patching 2022 换激活看输出变化因果关系,而不是相关
Induction Head 2022 找出实现「复制模式」的两层电路上下文学习的机制基础
Toy Models of Superposition 2022 用玩具模型研究特征怎么挤进更少的维度为什么神经元是多义的
稀疏自编码器 SAE 2023- 把叠加的激活分解成单义特征大规模提取可解释特征
Attribution Graphs 2025 自动追踪一条完整的计算路径把「电路分析」自动化

Causal Tracing 和 Activation Patching 是同一家族:前者问「关键位置在哪」, 后者问「改这里真的会改变输出吗」——一个找位置,一个验因果。

M

数学 · 一个菱形,和一堆干扰

下面那个 λ 可以想成一颗约束球:λ 越大球越小,解越容易被挤到坐标轴上—— 这就是公式里 argmin 在几何上的样子。

动画 · 为什么 L1 会把答案按在坐标轴上

公式卡 · 每个符号管图上的哪一块

三个真实数字:GPT-2 small 约 85M 参数(12 层 × 768 维); SAE 字典通常是激活维度的 16~64 倍(768 → 12288 个特征槽起步), 自己的参数量往往和被解释的模型同一量级;训练最贵的一步是把几十亿 token 的激活从显存读出, 和《硬件与算力账本》里 KV Cache 是同一个瓶颈。

7

为什么说它是唯一没答案的方向

问题说明什么时候真的会痛 → 换什么
① 规模上根本做不完 70B 模型有 5120 个注意力头(80 层 × 64 头),逐个分析算不过来,只能抽样。 要保证「没有藏着的电路」时:抽样给不出这个保证 → 靠自动化归因图,现在仍不完整
② SAE 的训练成本极高 要为每一层单独训一个 SAE(各层激活分布不同,一个字典套不上所有层)。 算力/带宽有限时:只能挑几层做 → 想看全模型,先付一份和预训练同量级的账单
③ 找到的「特征」未必是真的 SAE 找到的只是一个数学上方便分解,未必是模型内部真正使用的单元。 就像你可以把一段音乐分解成傅里叶分量,但这不代表作曲家在按正弦波作曲。 拿 SAE 特征当解释、当安全依据之前:先做激活修补 → 改不动输出,它就只是方便分解
④ 可解释 ≠ 可控 就算你看懂了某个机制,也未必能安全地改掉它—— 在叠加的表示里,特征之间本来就是纠缠的 想直接删掉危险特征时:干预会牵动别的行为 → 逐条测副作用,不能一次删一串
⑤ 目前还不能作为安全保证 看到一部分机制,不等于掌握了全部。 一个模型可能在你看不到的地方藏着危险的电路。 要拿它给「模型安全」签字时:不能用「我没找到」推出「它没有」 → 现在只能当线索

互动 · 解释一个模型,要再花掉多少模型的钱

⚠️ 关于第三点,值得说透

这是整个领域最大的方法论危险。SAE 的损失函数是「重构得好 + 稀疏」, 它优化的是这两个目标——不是「找到模型真正在用的特征」。
所以完全可能出现这种情况:SAE 找到了一个重构得很好、名字也起得很漂亮的特征, 但你做激活修补时发现改它对模型输出毫无影响。
这又回到了这一章开头那条分界线:相关性 ≠ 因果性。 任何 SAE 发现,最后都要过因果验证这一关。
同样的道理,第 5 节 ③「知道和说出是分开的」给的是相关性证据:从激活里读出了正确答案, 说明信息在那里,还不能推出模型会用——它也没过因果这一关。

8

小结

它对应哪条线 它对应七条主线里的 ④ 学习即压缩——而且是全书这条线的最极端形态。
前面各章的压缩都是「把 N 个数压成 K 个数」(N > K)。 这一章反过来:模型把 12 个特征塞进 6 个维度(N < K), 靠的是「同一时刻只有少数几个特征在起作用」。
压缩可以突破维度上限——前提是你对被压缩的东西有先验。 这里的先验就是「稀疏」。(七条主线见首页。)
一句话 模型不是「一个神经元记一个概念」的, 而是让几千个概念各自占用一个几乎不重叠的方向,挤在同一个维度空间里。 叠加的本质是在有限维度里用方向换容量——代价是每个神经元都成了多义词。
它牺牲了什么 牺牲了可读性(回扣暗线 B)。 为了在 768 维里装下上万个特征,模型必须让这些方向「几乎但不完全正交」。 这就意味着它们互相干扰。后果是:你没法再指着单个神经元说「它在干什么」—— 而「能指着某个部件说它在干什么」,恰恰是一切理解的起点。想拿回可读性,就得再花算力训 SAE。
🎬 自己验一遍:你现在能指着哪个互动说这句话

回到第 4 节第二张图「稀疏惩罚 λ 的权衡」。 把中间那个 λ 滑块从最左拖到最右,慢慢拖。

你会看到那条曲线先下降、再上升,中间有个最低点。 而上方那个「恢复出的特征数」读数,会从 > 2 一路收敛到 = 2, 再掉到 < 2。

那个「刚好等于 2」的位置,就是「用 6 个维度装下 12 个特征」这件事成立的地方。 往左一点,压缩就漏了(噪声也被当成特征);往右一点,压缩就损了(真特征被压成 0)。

它在暗线里站在哪

暗线这一章的回答
B 什么被牺牲了 可读性换容量。叠加在数学上比「一个神经元一个概念」更能表示稀疏特征(Toy Models 的核心结论), 所以「模型不可解释」不是工程没做好,是它在效率上做的一个理性选择。
E 它假设了什么 假设这一章的一切推理都建立在一个没被证明的前提上: 「特征在激活空间里是线性方向」(线性表示假设)。
SAE 做的分解 x ≈ D·a 是一个纯线性操作, 它假定每个概念对应一个固定方向、可以线性叠加。
如果模型其实用的是非线性编码,那 SAE 找出来的「特征」就是它自己的幻觉。 (另外还隐含假设「特征稀疏」——这两个假设合起来才让分解成立。)
F 违背了哪个直觉 「维度数 = 能装下的概念数」。
这是最符合常识的一条:6 个数字只能表达 6 个自由度,怎么可能装 12 个特征?
答案是可以,只要你允许它们互相干扰一点。 因为真实世界里 12 个特征几乎不会同时亮(稀疏), 所以「偶尔串台」的代价远小于「多装一倍的货」的收益。
这是全书最违反常识的结论之一——它推翻的是你从第 1 章就带着的那个默认假设。

它给下一章留了什么:还没看清它在算什么,下一章《递归自我改进》就要把决定权交给模型。

一句话带走

看注意力图不算解释,权重只是中间产物。 探针能读出信息、SAE 能拆开叠加,但只有激活修补给出因果。 在你能看懂一个系统之前,别把关键的事交给它。

9

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式