第 17 讲:可解释性

Natural Language Processing with Deep Learning · Lecture 17。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应:Stanford CS224N Winter 2026 Lecture 15(嘉宾讲座:Interpretability)。 配套代码:code/lecture17/(需要 PyTorch;02 号文件用第 8 讲的玩具影评) 预计阅读时间:3.5 小时


0. 本讲导航

0.1 学完本讲,你应该能够

  1. 说出研究可解释性的几个动机,以及行为、归因、表示、机制四个层次的问题。
  2. 解释梯度 × 输入、积分梯度、遮挡三种归因方法,积分梯度的完备性,以及为什么要做健全性检查。
  3. 说出”注意力是不是解释”这场争论的要点,以及注意力可视化能说明什么、不能说明什么。
  4. 解释探针的做法和局限:探针能读出 ≠ 模型使用;控制任务和选择性;用干预检验因果作用。
  5. 解释机制可解释性的基本思路(残差流、电路),描述归纳头这个电路以及怎样用消融验证它。
  6. 解释叠加现象:为什么模型会用很少的神经元表示很多特征,以及多义神经元的由来。
  7. 解释稀疏自编码器怎样把叠加的特征拆开,它的成果和局限。
  8. 说出模型编辑(ROME)和激活引导的思路,以及可解释性研究面临的开放问题。

0.2 先修知识

知识点用在哪里最低要求
第 7 讲第 3、5 节多头注意力、残差连接、层归一化
第 9 讲第 4 节探针(第 9 讲用过线性探针检查上下文表示)
第 11 讲第 5 节上下文学习;归纳头的初步介绍
第 3 讲第 2 节梯度、反向传播

0.3 本讲地图

第1节  为什么要打开黑箱?
第2节  归因:哪些输入导致了这个输出?            ← 代码 02(演示 1、2)
第3节  注意力能当解释吗?
第4节  探针:表示里编码了什么?                  ← 代码 02(演示 3)
第5节  机制可解释性:电路、归纳头、叠加           ← 代码 03、01(演示 1)
第6节  稀疏自编码器:把叠加的特征拆开             ← 代码 01(演示 2)
第7节  模型编辑与激活引导
第8节  局限与开放问题
第9–13节 小结、与作业的关系、练习、延伸阅读、下一讲预告

关于本讲的实验数字:01、02 号代码编写讲义时完整运行过(分别约 7 秒、26 秒),讲义引用的是实际输出。03 号代码训练约一分多钟,编写时只做了冒烟测试,讲义只描述预期的现象。


1. 为什么要打开黑箱?

一个语言模型有几十亿个参数。它为什么给出这个回答?它”知道”什么?它内部是怎样一步步算出答案的?可解释性(interpretability)研究试图回答这些问题。动机有好几个:

  • 调试:模型出错时,知道它为什么错,才能有针对性地改进(第 8 讲);
  • 信任与问责:医疗、法律、金融等高风险场景,需要知道决策的依据;有些法规也要求解释;
  • 科学:语言模型学到的东西,可能告诉我们语言和认知本身的规律;
  • 安全:模型会不会在测试时表现良好、部署后做别的事?会不会”知道”自己在说谎?只看行为很难发现,需要看内部(第 14 讲讨论过思维链不一定忠实)。

可解释性的问题有不同的层次:

层次问题方法
行为模型在什么输入上做什么?构造测试集、对比实验(第 13 讲)
归因这个输出主要是由输入的哪些部分导致的?梯度、积分梯度、遮挡(第 2 节)
表示模型的隐藏状态里编码了什么信息?探针(第 4 节)
机制模型用什么”算法”、由哪些部件实现?电路分析、消融、稀疏自编码器(第 5、6 节)

越往下越深入,也越难。


2. 归因:哪些输入导致了这个输出?

2.1 三种方法

对一条具体的输入,问”每个词对输出贡献了多少”。设 FF 是模型的输出(比如”正面 logit − 负面 logit”),ete_t 是第 tt 个词的词向量。

梯度 × 输入:

at=∑d∂F∂et,d⋅et,da_t = \sum_d \frac{\partial F}{\partial e_{t,d}} \cdot e_{t,d}

一阶泰勒展开的直觉:F(e)≈F(0)+∇F⋅eF(e) \approx F(0) + \nabla F \cdot e,每个词向量的”线性贡献”。问题是饱和:如果模型已经非常确定(输出在 sigmoid 的平坦区),梯度很小,归因也很小,尽管那个词非常重要。

积分梯度(integrated gradients,Sundararajan 等 2017):从一个基线输入 e′e'(比如全零的词向量)沿直线走到真实输入 ee,把一路上的梯度平均起来:

IGt=∑d(et,d−et,d′)∫01∂F(e′+α(e−e′))∂et,d dα\text{IG}_t = \sum_d (e_{t,d} - e'_{t,d}) \int_0^1 \frac{\partial F\big(e' + \alpha(e - e')\big)}{\partial e_{t,d}}\, d\alpha

它满足完备性(completeness):所有词的归因加起来恰好等于 F(e)−F(e′)F(e) - F(e')。输出的变化被完整地分配给了各个输入。

遮挡(occlusion):把第 tt 个词去掉(或换成基线),看输出变了多少。直观,但每个词都要重新跑一次模型,而且只能衡量”单独去掉一个词”的效果。

还有 LIME、SHAP 等基于扰动的方法,思路类似:在输入附近采样很多扰动,拟合一个简单的模型来解释。

2.2 一个例子

代码 02 在第 8 讲的玩具影评上训练一个小 GRU 情感分类器(测试准确率 98.8%),对 “the plot was not boring . i loved it .” 做归因(正数 = 推向正面):

词梯度 × 输入积分梯度遮挡
not0.104.494.97
boring−0.35−3.670.41
loved1.124.907.66
it0.282.313.87

三种方法大体同意 “loved”、“not” 很重要,但细节不同,“boring” 的归因甚至符号都不一样:积分梯度认为它推向负面,遮挡认为去掉它反而略微降低了正面程度。不同的方法回答的是不同的问题(局部斜率、整条路径、删掉之后的变化)。而对于词和词之间有相互作用的情况(“not” 和 “boring” 合起来才是正面),“每个词贡献多少”本来就没有唯一的答案。

2.3 检查解释本身

完备性检查:代码 02 的演示 2 里,积分梯度的归因之和是 11.185,F(输入)−F(基线)=11.204F(\text{输入}) - F(\text{基线}) = 11.204,误差来自积分的离散近似。

健全性检查(sanity check,Adebayo 等 2018):一个好的解释方法,在模型被”毁掉”之后应该给出完全不同的归因。代码 02 把 GRU 和输出层的参数随机化(词向量不变),比较新旧归因图的 Spearman 相关:梯度 × 输入 +0.06,积分梯度 −0.05,遮挡 +0.04,都接近 0,三种方法都通过了检查。Adebayo 等发现,图像领域一些流行的显著性图方法在模型参数被随机化之后几乎不变:它们反映的是输入本身的结构(比如物体的边缘),而不是模型学到了什么。解释方法本身也需要被验证。


3. 注意力能当解释吗?

Transformer 的注意力权重看起来是现成的解释:“模型在预测这个词时看了哪些词”。注意力热图(第 6、7 讲画过)非常直观,被广泛用来”解释”模型。但它靠得住吗?

  • Jain & Wallace(2019,Attention is not Explanation)发现:注意力权重和梯度类的归因经常不一致;而且常常可以找到一组完全不同的注意力分布,模型的输出几乎不变。
  • Wiegreffe & Pinter(2019,Attention is not not Explanation)反驳:能找到另一组注意力分布不代表原来的注意力没有意义;在一些设置下注意力确实提供了有用的信息。

几点共识:

  • 注意力是信息流的一部分,不是全部:注意力权重告诉你”从哪里取信息”,但取来的值向量经过了 WVW_V、WOW_O 的变换,可能很小或者被后面的层抵消;残差连接和前馈网络也在改变表示。
  • 多层混合:第 5 层的”第 3 个位置”早已混合了前面所有位置的信息,看第 5 层的注意力并不等于看原始输入的词。
  • 有些头确实有清晰的功能:Clark 等(2019,What Does BERT Look At?)发现 BERT 有的头专门关注直接宾语、有的关注介词的宾语、有的做指代消解,准确率相当高。第 7 讲的迷你 GPT 也有专门”盯着主语”的头。

结论:注意力可视化是提出假设的好工具,但要用干预(第 4.3 节、第 5 节的消融)来验证。


4. 探针:表示里编码了什么?

4.1 做法

探针(probe):冻结模型,取某一层的隐藏状态,训练一个简单的分类器(通常是线性的)去预测某种性质:词性、句法依存关系、实体类型、情感……如果能预测准,就说”这一层的表示里编码了这个信息”。第 9 讲用过探针检查预训练模型的上下文表示。

一些有影响的发现:

  • Tenney 等(2019,BERT Rediscovers the Classical NLP Pipeline):BERT 的低层更多编码词性等局部信息,中间层编码句法,高层编码语义角色、指代等,大致重现了传统 NLP 的处理流程;
  • Hewitt & Manning(2019,结构探针):BERT 的表示空间里存在一个线性变换,使得变换后两个词向量的距离近似等于它们在依存树上的距离。句法树”藏”在表示的几何结构里。

4.2 探针的陷阱

代码 02 的演示 3 用 GRU 每个位置的隐藏状态预测三个标签,比较训练好的 GRU 和随机初始化的 GRU、线性探针和 MLP 探针(测试准确率):

任务训练好的·线性训练好的·MLP随机的·线性随机的·MLP多数类
是情感形容词92.5%99.4%90.8%99.7%89.7%
(形容词处)被否定了吗100.0%100.0%88.4%100.0%75.4%
控制任务(随机的词标签)78.0%97.5%83.0%99.9%64.7%

三个教训:

  1. 探针能读出 ≠ 模型学会了:MLP 探针在随机初始化的 GRU 上也能 99.7% 地读出”是不是情感形容词”。隐藏状态里本来就保留着当前的词是什么,探针只要记住哪些词是形容词就行。要和随机模型(或其他基线)对照。
  2. 探针可能自己在学:控制任务(Hewitt & Liang 2019)给每个词一个随机的固定标签,这个”性质”没有任何语言学意义。MLP 探针在控制任务上也接近 100%:它在记忆,而不是在读出表示里的结构。选择性 = 真实任务准确率 − 控制任务准确率,比单看准确率更有意义。探针越强大,选择性越低。
  3. 简单探针 + 对照才能看出训练带来了什么:需要结合上下文的”形容词有没有被否定”,训练好的 GRU 用线性探针就能 100% 读出(它必须理解否定才能做好情感分类),随机 GRU 的线性探针只有 88.4%。

4.3 从”编码了”到”使用了”

即使探针能干净地读出某个信息,也不能证明模型用了它来做判断。要回答因果问题,需要干预:

  • 失忆探针(amnesic probing,Elazar 等 2021):从表示里把某个信息”擦除”(投影掉探针找到的方向),看模型在任务上的表现是否下降;
  • 激活修补(activation patching / causal tracing):把一次运行中某个位置、某一层的激活,替换成另一次运行(比如换了一个词的输入)的激活,看输出怎样变化,从而定位”哪个部件在哪一步传递了哪个信息”(Meng 等 2022 用它定位事实知识的存储位置,第 7 节)。

这引出了机制可解释性。


5. 机制可解释性:电路、归纳头、叠加

5.1 思路

机制可解释性(mechanistic interpretability)的目标是把模型的计算”逆向工程”成人能理解的算法,就像逆向工程一个编译好的程序。几个关键概念(Elhage 等 2021,A Mathematical Framework for Transformer Circuits):

  • 残差流(residual stream):Transformer 每一层都是 h←h+f(h)h \leftarrow h + f(h)。可以把 hh 看成一条”信息总线”,每个注意力头和前馈层从总线上读信息、再把结果加回总线。
  • 注意力头 = 两个独立的电路:QK 电路决定”从哪里读”(哪个位置关注哪个位置),OV 电路决定”读到什么、写进去什么”。
  • 组合:后面层的头可以利用前面层的头写进残差流的信息,比如用前面的头的输出来构造自己的查询或键。
  • 电路(circuit):模型里一小组部件(几个头、几个神经元)协作实现一个可以描述的算法。

5.2 归纳头

最著名的电路是归纳头(induction head,Olsson 等 2022),第 11 讲已经提过。它完成”……[A][B] …… [A] → 预测 [B]”:

  1. 第 1 层的一个前一个词头:每个位置关注它的前一个位置,把”我前面的词是什么”写进残差流;
  2. 第 2 层的归纳头:当前位置的词是 A,它的查询去匹配”前一个词是 A”的位置(这个信息是第 1 层写进去的),也就是上一次 A 出现的位置的下一个位置,把那里的词 B 复制过来。

代码 03 训练一个只有注意力、没有前馈网络的 2 层 Transformer,任务是”一串随机的词元重复两遍,预测下一个词元”。前半段随机,没法预测;后半段只要照抄前半段就能完全预测。预期(编写时只做了冒烟测试):

  • 前半段的损失一直停在 ln⁡64≈4.16\ln 64 \approx 4.16 附近;后半段的损失先缓慢下降,然后在某个时刻突然降到接近 0(“相变”)。Olsson 等在真实的语言模型里也看到了这种相变:归纳头突然形成的时刻,恰好是模型上下文学习能力突然提升的时刻。
  • 第 1 层有一个头的”前一个词分数”接近 1,第 2 层有一个头的”归纳分数”接近 1。
  • 消融:把这两个头的输出置零,后半段的损失大幅上升(接近瞎猜);关掉其他头影响很小。注意力图只是相关的证据,消融才是因果的证据。

另一个经典的例子是 Wang 等(2022)在 GPT-2 small 里找到的间接宾语识别电路:“When Mary and John went to the store, John gave a drink to ___“(应该填 Mary)。他们用激活修补找到了由二十多个注意力头组成的电路,分成”找出重复的名字""抑制重复的名字""把剩下的名字复制到输出”等几类,每一类的作用都可以用干预验证。

5.3 叠加:为什么神经元是多义的

如果每个神经元都对应一个清晰的概念,解释模型就容易多了。但实际上,很多神经元是多义的(polysemantic):同一个神经元对学术引用、韩文、HTTP 请求都有反应。为什么?

Elhage 等(2022,Toy Models of Superposition)用一个极简的模型给出了解释:

h=Wx(W:5×20),x′=ReLU(W⊤h+b),损失=∑iIi(xi−xi′)2h = W x \quad (W: 5 \times 20),\qquad x' = \text{ReLU}(W^\top h + b),\qquad \text{损失} = \sum_i I_i (x_i - x'_i)^2

把 20 个特征压进 5 维再还原;IiI_i 是特征的重要性;每个特征以概率 1−S1 - S 出现(SS 是稀疏度)。代码 01 的演示 1:

稀疏度 SS每个特征出现的概率被表示的特征数平均干扰
0100%50.000
0.730%100.111
0.910%120.129
0.973%160.147
0.991%180.154
  • 特征不稀疏时,模型只表示最重要的 5 个特征,每个占一个正交的方向(干扰为 0),就像 PCA。
  • 特征越稀疏,模型表示的特征越多,远远超过 5 个:它把多个特征叠加(superposition)在同样的 5 个维度上,方向不再正交。这时任何一个隐藏神经元都同时参与表示好几个特征,这就是多义神经元。
  • 直觉:两个特征很少同时出现,偶尔的干扰代价很小(ReLU 还能把小的干扰截掉),而多表示一个特征的收益很大。真实世界的特征(“这段文本是关于某位历史人物的”)大多非常稀疏,所以 Elhage 等认为大模型里普遍存在叠加:模型表示的特征数远多于神经元数。

叠加意味着”看单个神经元”这条路走不通。要找到模型真正使用的特征,需要别的办法。


6. 稀疏自编码器:把叠加的特征拆开

6.1 做法

如果模型把很多稀疏的特征叠加在少数几个维度里,那么反过来,用一个过完备(隐变量比维度多)且强制稀疏的字典去分解激活,就有希望把它们一个个拆出来。这就是稀疏自编码器(sparse autoencoder,SAE):

f=ReLU(Wenc(h−bdec)+benc),h^=Wdecf+bdec,L=∥h−h^∥2+λ∥f∥1f = \text{ReLU}\big(W_{\text{enc}}(h - b_{\text{dec}}) + b_{\text{enc}}\big),\qquad \hat{h} = W_{\text{dec}} f + b_{\text{dec}},\qquad \mathcal{L} = \|h - \hat{h}\|^2 + \lambda \|f\|_1

ff 的每一维是一个”特征”的激活强度(大部分为 0),WdecW_{\text{dec}} 的每一列是这个特征在激活空间里的方向。训练时要把 WdecW_{\text{dec}} 的列归一化,否则模型可以把列变大、把 ff 变小来逃避 L1 惩罚。

6.2 在玩具模型上

代码 01 的演示 2 在 S=0.99S = 0.99 的玩具模型(表示了 18 个特征)的 5 维隐藏激活上训练有 40 个隐变量的 SAE。SAE 看不到原来的 20 个特征,只看到 5 维的激活。每个输入平均有 0.20 个真实特征出现:

L1 系数 λ\lambda余弦 > 0.9 的特征余弦 > 0.99平均激活的隐变量重建 R2R^2
0.014 / 180 / 181.470.999
0.116 / 188 / 180.900.959
0.318 / 1818 / 180.250.858
  • 稀疏惩罚太弱时,40 个隐变量能完美重建 5 维的激活,却不必”拆开”特征:字典方向和真实特征对不上。重建得好不等于找到了真正的特征。
  • 稀疏惩罚足够强时,SAE 几乎完美地找回了每个特征的方向(18 个都 > 0.99),每个输入激活的隐变量数(0.25)和真实特征数(0.20)差不多,每个隐变量对应一个”干净”的特征(单义的)。代价是重建变差。λ\lambda 怎么选,是训练 SAE 时最关键的权衡。

6.3 在真实的语言模型上

  • Bricken 等(2023,Anthropic,Towards Monosemanticity)在一个单层 Transformer 的 512 个 MLP 神经元上训练 SAE,得到几千个特征,绝大部分是单义的、可解释的:DNA 序列、阿拉伯文、Base64 编码、法律文本……
  • Templeton 等(2024,Scaling Monosemanticity)把 SAE 扩展到 Claude 3 Sonnet,训练了多达三千多万个隐变量,找到了大量抽象的特征:代码里的安全漏洞、谄媚、欺骗、某个具体的地标(金门大桥)……而且这些特征是多语言、多模态的:同一个”金门大桥”特征对英文、中文的描述和图片都有反应。把这个特征人为调大,模型会在任何话题上都扯到金门大桥(“Golden Gate Claude”),说明特征确实因果地影响行为。
  • OpenAI(Gao 等 2024)在 GPT-4 上训练了千万级别的 SAE;Google DeepMind 发布了 Gemma Scope(Gemma 2 各层的 SAE),供研究者使用。
  • 更进一步的工作用 SAE 的变体(transcoder)替换模型的 MLP 层,构建”归因图”,追踪模型在具体任务上的计算过程,比如两步推理时先想到中间的实体、写押韵的诗时提前”计划”好韵脚(Anthropic 2025)。

6.4 局限

  • 找到的特征就是模型用的特征吗? 在玩具模型里我们知道真实的特征,能验证;在真实模型里不知道。SAE 学到的特征可能部分是 SAE 训练目标的产物。
  • 特征分裂:字典越大,一个概念会被分成越来越细的子特征(“猫”分成”猫的照片""关于猫的文字”……),“真正的”粒度是什么并不清楚。
  • 重建误差:SAE 不能完美重建激活,剩下的误差(被称为”暗物质”)里可能藏着重要的计算;把 SAE 的重建结果放回模型里,模型的表现会下降。
  • 死特征、评估困难:很多隐变量从不激活;怎样定量评价一个 SAE 的”可解释性”,仍没有公认的标准。

7. 模型编辑与激活引导

如果知道知识存在哪里、行为由哪个方向控制,能不能直接修改它?

7.1 编辑事实知识

Meng 等(2022,ROME)用因果追踪(第 4.3 节)发现:GPT 里”埃菲尔铁塔 → 巴黎”这样的事实关联,主要存储在中间层的前馈网络里,在处理主语最后一个词时被调用。他们把前馈层看成一个”键 → 值”的存储,用一个秩为 1 的权重修改,就能把”埃菲尔铁塔在巴黎”改成”埃菲尔铁塔在罗马”,而且模型在改写过的问法里也会用新的事实。MEMIT(Meng 等 2023)把它扩展到一次编辑上千条事实。

但编辑有副作用:改了”埃菲尔铁塔在罗马”,模型知道”埃菲尔铁塔所在城市的市长是谁”吗?Cohen 等(2023)发现,编辑后的知识往往不能正确地”波及”到相关的推论上,有时还会破坏不相关的知识。这说明知识在模型里的存储方式比”一个键值对”复杂得多。

7.2 激活引导

另一条路是在推理时直接修改激活:

  • 引导向量(steering vectors,Turner 等 2023;表示工程,Zou 等 2023):用一对对比的输入(比如”爱”和”恨”)算出激活的差,在推理时把这个差向量加到残差流上,就能把模型的输出往某个方向推(更积极、更诚实……)。
  • 拒绝方向:Arditi 等(2024)发现,对话模型拒绝有害请求的行为,在很多开源模型里由残差流里的一个方向控制:把这个方向从激活里投影掉,模型就不再拒绝;把它加上,模型连无害的请求都拒绝。这既说明了可解释性的力量,也暴露了安全训练的脆弱。
  • 用 SAE 找到的特征做引导(第 6.3 节的金门大桥)是同一类方法。

这些发现支持一种线性表示假说:很多概念在模型的激活空间里对应一个方向(或一个低维子空间)。


8. 局限与开放问题

  • 解释的忠实性:一个看起来合理的解释,不一定反映模型真实的计算。所有可解释性方法都需要用干预去验证(第 2.3、4.3、5.2 节)。Bolukbasi 等(2021)讨论过”可解释性错觉”:在一个数据集上看起来单义的方向,换一个数据集可能完全是另一回事。
  • 规模:在 GPT-2 small 里找一个电路要几个月的人工分析;对几千亿参数的模型,需要自动化的方法(自动电路发现、用大模型解释神经元 / 特征)。
  • 完整性:我们能解释模型行为的百分之几?目前对大模型来说,能解释的部分仍然很小。
  • 用于安全:能否通过内部表示发现模型在”欺骗”、在”计划”不该做的事?这是可解释性最受关注的应用方向之一,但离可靠的检测还有很长的路。
  • 过度自信的风险:一个看似漂亮的解释可能让人过度信任模型;解释也可能被用来”洗白”有问题的系统。

9. 本讲小结

  1. 动机与层次:调试、信任、科学、安全;行为、归因、表示、机制四个层次。
  2. 归因:梯度 × 输入(局部、会饱和)、积分梯度(满足完备性)、遮挡;不同方法回答不同的问题,词之间有相互作用时没有唯一答案;解释方法本身要做健全性检查。
  3. 注意力:是信息流的一部分而不是全部,可以用来提出假设,要用干预来验证;有些头确实有清晰的功能。
  4. 探针:能读出 ≠ 模型学会 ≠ 模型使用;要和随机模型对照、用控制任务算选择性、用简单的探针;因果问题要用失忆探针、激活修补等干预。
  5. 机制可解释性:残差流、QK / OV 电路、组合;归纳头由前一个词头和归纳头组合而成,形成时有相变,用消融验证;间接宾语识别电路。
  6. 叠加:特征越稀疏,模型越把多个特征叠加在少数维度上(玩具模型里 5 维表示了 18 个特征),这是多义神经元的来源。
  7. 稀疏自编码器:过完备 + L1 稀疏的字典学习,把叠加的特征拆开;稀疏惩罚太弱时重建好却找不到真实特征;在 Claude、GPT-4、Gemma 上找到了大量可解释、可引导的特征;局限是不知道”真实特征”、特征分裂、重建误差。
  8. 编辑与引导:ROME 定位并修改事实知识,但有波及问题;引导向量、拒绝方向说明很多概念对应激活空间里的方向。

10. 与作业的关系

  • CS224N 近几年没有专门的可解释性作业,但第 9 讲的探针、第 7 讲的注意力可视化都在作业里出现过。
  • 期末项目:可解释性是很受欢迎、而且算力要求不高的项目方向:在小模型上找电路、训练 SAE、做激活修补、比较归因方法的忠实性。TransformerLens、SAELens 等开源工具让这类研究容易上手很多。本讲的三个代码文件都可以作为起点。

作业的具体题目以当年官方发布的版本为准。


11. 练习

练习 1(梯度 × 输入的饱和)★:F(x)=σ(10x)F(x) = \sigma(10x),x=2x = 2。(a) 梯度 × 输入是多少?(b) 用基线 x′=0x' = 0 的积分梯度是多少?(c) 哪个更好地反映了 xx 的贡献?

参考答案

(a) F′(x)=10σ(20)(1−σ(20))≈10×2×10−9F'(x) = 10\sigma(20)(1 - \sigma(20)) \approx 10 \times 2 \times 10^{-9},乘以 x=2x = 2,约 4×10−84 \times 10^{-8},几乎为 0。 (b) 完备性:IG=F(2)−F(0)=σ(20)−0.5≈0.5\text{IG} = F(2) - F(0) = \sigma(20) - 0.5 \approx 0.5。 (c) 积分梯度。xx 从 0 变到 2 让输出从 0.5 变到接近 1,贡献显然很大;梯度 × 输入因为函数在 x=2x = 2 处饱和而几乎为 0。

练习 2(完备性)★★:证明对一维函数,积分梯度满足 IG=F(x)−F(x′)\text{IG} = F(x) - F(x')。对多维的情况,为什么各维的 IG 之和也等于 F(x)−F(x′)F(x) - F(x')?

参考答案

一维:IG=(x−x′)∫01F′(x′+α(x−x′)) dα\text{IG} = (x - x')\int_0^1 F'(x' + \alpha(x - x'))\,d\alpha。令 u=x′+α(x−x′)u = x' + \alpha(x - x'),du=(x−x′)dαdu = (x - x')d\alpha,积分等于 ∫x′xF′(u) du=F(x)−F(x′)\int_{x'}^{x} F'(u)\,du = F(x) - F(x')。 多维:沿直线路径 γ(α)=x′+α(x−x′)\gamma(\alpha) = x' + \alpha(x - x'),ddαF(γ(α))=∑i∂F∂xi(xi−xi′)\frac{d}{d\alpha}F(\gamma(\alpha)) = \sum_i \frac{\partial F}{\partial x_i}(x_i - x'_i)(链式法则)。对 α\alpha 从 0 到 1 积分,左边是 F(x)−F(x′)F(x) - F(x'),右边就是各维 IG 之和。

练习 3(探针的选择性)★:一个探针在词性标注上准确率 97%,在控制任务上 92%;另一个在词性标注上 95%,在控制任务上 70%。你更相信哪个探针反映了表示里的句法信息?

参考答案

第二个。选择性分别是 5 和 25 个百分点。第一个探针在毫无语言学意义的控制任务上也能达到 92%,说明它主要靠自己的容量记忆”词 → 标签”;第二个探针记忆能力弱,在真实任务上的高准确率更可能来自表示里本来就有的结构。

练习 4(归纳头)★★:(a) 对序列 “x y z w x y z w”,归纳头在第 6 个位置(第二个 y)应该关注哪个位置?它要预测什么?(b) 为什么一个注意力头单独做不到,需要两层?

参考答案

(a) 第 6 个位置的词是 y,上一次 y 出现在第 2 个位置,它的下一个位置是第 3 个(z)。归纳头关注第 3 个位置,预测下一个词是 z。 (b) 归纳头要找”前一个词是 y 的位置”,而一个位置的初始表示只包含它自己的词和位置,不知道自己的前一个词是什么。需要先有一个”前一个词头”把前一个词的信息写进每个位置的表示,后面层的头才能用这个信息作为键来匹配。这就是两个头的组合(K 组合)。

练习 5(叠加)★★:在 2 维空间里放 3 个特征方向,让它们两两之间的点积的绝对值尽可能小。(a) 最好的放法是什么?点积是多少?(b) 两个特征同时出现时会发生什么?(c) 为什么特征越稀疏,这种放法越划算?

参考答案

(a) 三个方向两两相隔 120°(正三角形),两两点积 cos⁡120°=−0.5\cos 120° = -0.5。 (b) 用 W⊤hW^\top h 还原时,第三个特征的读数会被另外两个特征的方向”污染”:比如特征 1 和 2 同时出现(各为 1),特征 3 的读数是 −0.5−0.5=−1-0.5 - 0.5 = -1,ReLU 截成 0 还好;但特征 1 和 2 自己的读数也会互相干扰(各自多出 −0.5)。 (c) 特征越稀疏,两个特征同时出现的概率越小(约 (1−S)2(1-S)^2),干扰带来的损失越小;而多表示一个特征的收益(约 1−S1-S)相对更大。

练习 6(SAE 的 λ)★:训练 SAE 时,(a) λ = 0 会发生什么?(b) λ 非常大呢?(c) 为什么要归一化解码矩阵的列?

参考答案

(a) 没有稀疏压力,过完备的 SAE 可以用任意的稠密组合完美重建激活,学到的方向不必对应任何有意义的特征(代码 01 里 λ = 0.01 时就已经如此)。 (b) 所有隐变量都被压到 0,重建很差(只剩偏置),什么都学不到。 (c) 否则模型可以把解码列放大 cc 倍、把 ff 缩小 cc 倍,重建不变,L1 惩罚却变成原来的 1/c1/c,于是通过无限放大列来规避稀疏惩罚。

练习 7(思考:注意力与解释):一个情感分类的 Transformer,最后一层的注意力几乎全部放在句号上。这能说明句号决定了情感判断吗?你会怎样验证?

参考答案

不能。到了最后一层,句号位置的表示早已混合了整句话的信息(前面各层的注意力把信息搬了过来),关注句号不等于关注”句号这个符号”。有些模型会把句号、[SEP] 当作”无事可做时停靠的位置”(注意力汇点,第 7 讲)。验证:对句号位置做激活修补或消融;把句号换成别的符号看输出是否变化;用积分梯度看原始输入里哪些词对输出贡献大。

练习 8(动手):

(a) 运行代码 03,记录相变发生的步数、找到的前一个词头和归纳头,以及消融的结果。和预期一致吗? (b) 在代码 03 里把层数改成 1,还能学会照抄吗?为什么? (c) 在代码 01 里把特征的重要性改成全部相等,叠加的规律会怎样变化? (d) 在代码 02 里,用积分梯度找出测试集上平均归因最大的 10 个词,它们是不是情感词?有没有意外的词? (e) 在代码 02 的探针实验里加一个”位置是否在句子的前半段”的任务,训练好的和随机的 GRU 有区别吗?


12. 延伸阅读

  • Sundararajan et al.,Axiomatic Attribution for Deep Networks(2017):积分梯度;Adebayo et al.,Sanity Checks for Saliency Maps(2018)。
  • Jain & Wallace,Attention is not Explanation(2019);Wiegreffe & Pinter,Attention is not not Explanation(2019);Clark et al.,What Does BERT Look At?(2019)。
  • Tenney et al.,BERT Rediscovers the Classical NLP Pipeline(2019);Hewitt & Manning,A Structural Probe for Finding Syntax in Word Representations(2019);Hewitt & Liang,Designing and Interpreting Probes with Control Tasks(2019);Belinkov,Probing Classifiers: Promises, Shortcomings, and Advances(2022);Elazar et al.,Amnesic Probing(2021)。
  • Elhage et al.,A Mathematical Framework for Transformer Circuits(2021);Olsson et al.,In-context Learning and Induction Heads(2022);Wang et al.,Interpretability in the Wild: A Circuit for Indirect Object Identification in GPT-2 Small(2022)。
  • Elhage et al.,Toy Models of Superposition(2022);Bricken et al.,Towards Monosemanticity(2023);Templeton et al.,Scaling Monosemanticity(2024);Gao et al.,Scaling and Evaluating Sparse Autoencoders(2024)。
  • Meng et al.,Locating and Editing Factual Associations in GPT(2022,ROME);Cohen et al.,Evaluating the Ripple Effects of Knowledge Editing(2023)。
  • Zou et al.,Representation Engineering(2023);Arditi et al.,Refusal in Language Models Is Mediated by a Single Direction(2024)。
  • Neel Nanda 的机制可解释性入门材料,以及 TransformerLens、SAELens 等开源工具。

13. 下一讲预告

到目前为止,本课的模型只处理文字。但人类的交流远不止文字:我们看图、听声音、看视频。

下一讲(多模态)讨论怎样让语言模型”看见”和”听见”:

  • CLIP:用对比学习把图像和文字放进同一个向量空间,实现零样本图像分类;
  • 图像怎样变成”词元”:图像块(patch)嵌入与视觉 Transformer;
  • LLaVA 式的视觉—语言模型:视觉编码器 + 投影层 + 语言模型;
  • 早融合与混合模态模型;语音模型简介;多模态带来的新问题。
← 返回课程目录