一、九个留到最后的问题

这门课一路走来,有一类问题反复出现,每次都被推到了这一讲:

讲 留下的问题
第 3 讲 向量的几百个维度,没有一维是人能读懂的
第 9 讲 注意力权重常被当成"模型在关注什么",这个解读靠得住吗
第 12 讲 MoE 的专家分工,不是人类能读懂的"专业化"
第 19 讲 推理模型写下的推理过程,是它真实的思考过程吗
第 20 讲 行为对齐了,我们知道它为什么这样做吗
第 26 讲 嵌入向量这张"意思的地图",为什么这样画
第 28 讲 ReAct 写下的"思考",是不是真实的决策过程
第 29 讲 模型内部,有没有"它其实知道自己不确定"的痕迹
第 30 讲 能不能在内部看到"它正在把一段外部内容当成指令"

这些问题有一个共同点:我们只看到了模型的输出,想知道输出背后发生了什么。 研究这件事的领域叫可解释性(interpretability)。

这一讲讲清楚它为什么难、现在有哪些办法、各自能做到哪一步,然后逐条回到上面这张表。先说一个整体判断:这是一个进展很快、但远没有完成的领域。 对上面大多数问题,现在的答案是"有部分证据,没有可靠的通用方法"。

二、打个比方:能读每一个神经元的脑科学家

设想一位脑科学家面对的,是一个可以被完美测量的大脑:每一个神经元在每一刻的读数,都能精确记录下来,没有噪声,可以随意暂停、倒带、复制,甚至可以手动改写任何一个神经元的读数,看看会发生什么。

这听起来是脑科学家梦寐以求的条件。但他依然会面对一个问题:几十亿个读数全都摆在眼前,他看不懂它们在表示什么。

研究语言模型的可解释性,就是这个处境。模型的每一个权重、每一层每一个位置的向量,都实实在在地存在显存里(第 22 讲算过它们占多大),都可以被原样读出来。访问从来不是问题,理解才是。

三、为什么看不懂

维度不是概念

第 3 讲就说过:词向量的几百个维度,“绝大多数情况下没有一个是人类能直接读懂的含义”。这不只是词向量,模型每一层里的向量都是如此。一个很自然的期待是,也许某一个维度对应"是否在谈论食物",另一个对应"语气是否正式"。实际上,单独拿出一个维度来看,它往往在很多毫不相干的情况下都会变大。

概念是方向,而且可以叠在一起

为什么会这样?一个被广泛接受的解释是:模型把概念存成空间里的方向,而不是单个维度;并且它存的概念,远多于维度的数量。

这听起来不可能——一个 4096 维的空间,怎么能存下多于 4096 个概念?答案在于高维空间的一个反直觉的性质。

第 3 讲讲过,余弦相似度为 0 表示两个方向完全无关(垂直)。在二维平面里,和一个方向垂直的方向只有一个。但在 4096 维的空间里,随手取两个随机方向,它们几乎总是接近垂直的:

在 4096 维空间里随机取 200 个方向,两两计算余弦相似度(共约 2 万对):
  平均绝对值 ≈ 0.012
  95% 的对   < 0.031
  最大的一对 ≈ 0.062

⭐ 这意味着,一个 4096 维的空间可以容纳远多于 4096 个“彼此几乎无关"的方向。模型可以把成千上万个概念,各自存成一个方向,它们之间只有很小的相互干扰。这种现象被称为叠加(superposition)。

代价是:任何一个维度,都同时参与了很多个概念的表示。你去看第 37 维,它在"食物"“法律"“代码缩进"几个毫不相关的场景里都会有读数,因为这几个概念的方向恰好都在第 37 维上有分量。这就是为什么"逐个维度去看"注定看不懂。

四、注意力权重为什么会误导

第 9 讲留下过一个问题:softmax 算出的注意力权重,经常被直接当成"模型在关注什么"的证据,比如"生成这个词的时候,模型 60% 的注意力放在第 3 个词上”。这个解读有一个根本的问题。

第二层的"位置 1”,已经不是第 1 个词了

回到第 9 讲的手算例子:两个 token,第一层注意力之后,位置 1 的输出是 0.670 × V₁ + 0.330 × V₂。也就是说,第一层之后,“位置 1"的向量里,大约 67% 来自第 1 个词,33% 来自第 2 个词。

到了第二层,注意力再一次按类似的权重混合。现在,如果第二层的位置 1 把 67% 的注意力放在"位置 1"上,它拿到的并不是 67% 的"第 1 个词”,而是 67% 的"一个已经混合过的向量”。按来源一层层追踪(为了手算方便,假设每一层都用同样的 67% / 33% 混合):

经过的层数 位置 1 的内容,来自第 1 个词 来自第 2 个词
1 67.0% 33.0%
2 55.8% 44.2%
3 52.0% 48.0%
5 50.2% 49.8%

⭐ 仅仅两层之后,“位置 1"里就只剩约 56% 来自第 1 个词了。一个几十层的模型,在中间某一层说"注意力集中在第 3 个位置”,那个位置上早已不是原来的第 3 个词,而是被前面每一层反复混合过的东西。

真实情况比这张表好一些:第 10 讲的残差连接会把每个位置自己的信息不断加回来,混合没有这么快。但结论不变:注意力权重说的是"从哪个位置取了多少",不是"用了哪个词的多少信息"。

还有两个原因

注意力不是唯一的通道。 第 10 讲说过,每一层还有前馈层,还有残差连接让信息绕过注意力直接往上传。一个结论可能主要是在前馈层里算出来的,注意力权重对此什么也没说。

不同的注意力模式可以得到同样的输出。 有研究发现,在一些模型和任务上,可以构造出和原来差别很大的注意力权重,而模型的输出几乎不变。如果换一套权重结果一样,原来那套权重就很难被当成"解释"。

所以注意力权重是一个有用的线索,但它不是模型推理过程的可靠记录。

五、探针:在内部找一个方向

既然概念是方向,一个自然的做法就是:去找那个方向。

做法

准备一批已知答案的例子——比如一些真陈述和一些假陈述——让模型逐一读过,记录下某一层的向量。然后训练一个最简单的分类器:找一个方向 w,让真陈述的向量在这个方向上的投影(第 3 讲的点积)偏大,假陈述偏小。 这个分类器叫探针(probe)。

用四个示意的二维向量手算:

真陈述 1:[2.0, 0.5]      真陈述 2:[1.5, 0.2]
假陈述 1:[0.4, 1.8]      假陈述 2:[0.3, 1.1]

取方向 w = [1, −1],算点积:
真 1:2.0 − 0.5 = 1.5     真 2:1.5 − 0.2 = 1.3
假 1:0.4 − 1.8 = −1.4    假 2:0.3 − 1.1 = −0.8

以 0 为界,四个例子被完全分开。如果这个方向在大量新的例子上也能分开真假,就说明模型内部确实存在某种和"真假"高度相关的信息,而且它大致排列在一个方向上。

公开研究中,人们用这类方法在模型内部找到过和"陈述是否为真"“模型是否知道答案"相关的方向——这正是第 29 讲问的"有没有’它其实知道自己不确定’的痕迹”。类似的方法也被用来检测输入里是否混进了可疑的指令(第 30 讲)。

为什么这还不够

⚠️ 能分开,不代表模型在用这个方向。 回到手算的四个点:换一个方向 w' = [1, 0]、以 1 为界,同样能把它们分开(真陈述的第一维是 2.0 和 1.5,假陈述是 0.4 和 0.3)。能分开这组数据的方向不止一个,探针找到的是其中一个和真假相关的方向,但模型在生成回答时实际依赖的,可能是另一个方向,也可能根本不依赖任何一个。相关不是因果。

⚠️ 探针学到的可能是别的东西。 如果训练用的真陈述恰好都比较短,探针找到的可能是"句子长短"的方向。它在这批数据上表现很好,换一批数据就失效。

六、干预:动手改,才算证据

怎么判断模型是不是真的在用某个方向?动手改它,看输出会不会跟着变。

拿探针找到的方向 w,在模型处理一个假陈述时,把那一层的向量沿着 w 的方向推一段距离,让它在这个方向上"看起来像真陈述",然后让模型继续往下算:

  • 如果模型的回答随之从"这是错的"变成了"这是对的",说明模型的后续计算确实读取了这个方向上的信息。
  • 如果回答纹丝不动,说明这个方向只是和真假碰巧相关,模型并不用它。

⭐ 第二节的比方说过,这位脑科学家"甚至可以手动改写任何一个神经元的读数"。这是研究语言模型相比研究真实大脑的一个巨大优势:干预是精确的、可重复的、没有伦理顾虑的。 同样的思路还可以反过来用:把模型处理输入 A 时某一层的向量,替换成处理输入 B 时的向量,看输出变成了什么,以此定位"哪一层、哪个位置在承载哪部分信息"。

沿着某个方向推动内部向量、从而改变模型行为的做法,也被用来控制模型:比如找到一个和"语气"相关的方向,推一推,输出就变得更正式。它说明这些方向是真实起作用的,但也提醒了第 30 讲的一件事:能被用来控制的地方,也能被用来操纵。

七、把叠在一起的概念拆开

第三节说,概念以方向的形式叠在一起,所以逐个维度看不懂。那么,能不能把这些方向找出来?

一类方法正是在做这件事,通常称为字典学习,其中常用的一种工具叫稀疏自编码器(sparse autoencoder):训练一个辅助的小网络,要求它把模型某一层的向量,表示成一大组候选方向的组合,并且每次只能用其中很少几个方向。候选方向的数量远多于原来的维度,比如 4096 维的向量,配上几万甚至几百万个候选方向。

“每次只能用很少几个"这个约束,逼着每个候选方向去对应一个相对独立的东西。公开研究报告,用这种方法找到的方向里,有相当一部分是人能读懂的:有的只在提到某个特定城市时激活,有的只在代码里出现某种错误时激活,有的对应某种情绪或语气。进一步,还可以追踪这些方向之间怎么在层与层之间传递,拼出模型完成某个具体小任务时的"计算路线”。

⚠️ 关于时效性:这是可解释性里发展最快的一块,工具和结论都在快速更新。但有几个局限在目前的研究里反复出现:找到的方向并不都能读懂;用这些方向重建原来的向量总有误差,误差里的那部分信息就没被解释;对最大的模型做完整的分解,成本极高;而"这个方向对应’某城市’“这类标签,本身也是研究者根据激活的例子归纳出来的,可能有偏差。

八、写下的推理,是否忠实

第 19 讲和第 28 讲都留下了同一个问题:推理模型写下的推理过程、ReAct 写下的"思考”,是不是模型真正得出答案的方式?

这个问题的难点在于:写下的推理本身也是生成出来的文字(第 1 讲),它受到的训练压力是"让最终答案对"(第 19 讲),而不是"如实记录内部的计算"。没有任何训练信号直接要求它忠实。

检验它是否忠实,思路和第六节的干预相同——改变推理,看答案变不变:

  • 截断:只保留推理的前一半,让模型直接给答案。如果答案和完整推理时一样,说明后一半推理对答案没什么影响。
  • 篡改:在推理中间故意改错一步。如果最终答案不受影响,说明答案并不依赖这一步。
  • 给暗示:在题目里悄悄放一个提示(比如"一位专家认为答案是 C"),看模型是否因此改变了答案,以及它的推理里有没有承认用到了这个提示。

公开研究中已经观察到:模型有时会受到这类暗示的影响而改变答案,但在写下的推理里并不提及它;推理过程读起来像是独立推出的结论。⭐ 这说明写下的推理可以是一个事后看起来合理的说明,而不一定是真实的计算过程。它依然很有用——它经常是忠实的,而且是我们能读懂的少数线索之一——但不能被当成对模型内部的可靠记录。

九、九个问题,现在的答案

回到第一节的表:

问题 现在的答案
维度读不懂(第 3 讲) 原因大致清楚:概念是方向并且叠加。字典学习能把一部分方向拆出来,拆不干净
注意力权重是不是推理过程(第 9 讲) 不是。它是有用的线索,但层层混合、还有其他通道,不能直接当解释
专家分工(第 12 讲) 观察到的分工更多是统计意义上的(比如按 token 的类型),而不是按人类理解的主题,同样受叠加影响
推理是否忠实(第 19、28 讲) 不总是。有实验证据表明写下的推理会遗漏真正影响答案的因素
知不知道它为什么这样做(第 20 讲) 对具体的、小范围的行为,可以通过干预找到部分原因;对"它在所有情况下是否都会这样做",无法保证
嵌入的地图(第 26 讲) 能找到一些可解释的方向,但整张地图为什么这样画,没有完整的说明
内部有没有"不确定"的痕迹(第 29 讲) 有部分证据:探针能找到相关的方向,但离可靠地用它来检测幻觉还有距离
能否看到"把外部内容当指令"(第 30 讲) 有研究在尝试,可以作为一层额外的检测;按第 30 讲的结论,它也是概率性的,不能代替门外的保证

⭐ 这张表的整体情况是:我们能对模型的局部、在特定条件下,给出有实验支撑的解释;但我们还不能对一个大模型的整体行为,给出一个完整、可验证的说明。 第 20 讲说"行为对齐不等于我们知道它为什么这样做",这句话在今天依然成立。这也是为什么第 27、30 讲反复强调:真正的保证,只能放在我们能完全理解的地方——门外的程序里。

十、全课回看

这是第 31 讲,也是正文的最后一讲。在结束之前,回头看这门课一路反复出现的三条线。

第一条线:它优化的,永远是一个代理

第 1 讲说,预训练的目标只承诺"看起来合理",不承诺"真实"。此后,这个结构一次又一次地出现:

讲 被优化的东西 我们真正想要的
第 1、4、15 讲 下一个词的交叉熵损失 懂语言、懂世界
第 17 讲 奖励模型的打分 人真正想要的回答
第 18 讲 隐式奖励 同上
第 19 讲 验证程序判定的对错 真正解决了问题
第 26 讲 余弦相似度 真正相关、有用的资料

每一个都是一个能被计算的量,每一个都和我们真正想要的东西高度相关,但都不等于它。第 17 讲的古德哈特定律,第 29 讲的幻觉,第 30 讲的越狱,都发生在这两者之间的缝隙里。

第二条线:每一个能力,都用一个代价换来

讲 换来的 付出的
第 5 讲 非线性的表达能力 没有解析解,只能迭代逼近
第 9 讲 任意两个位置直接交流、可以并行 n² 的计算
第 12 讲 参数量和计算量解耦 显存没有解耦
第 20 讲 更好的回答 多样性和校准(对齐税)
第 22 讲 不用重算 KV Cache 占的显存
第 24 讲 测试时计算带来的正确率 延迟和容量,近似平方增长
第 25、27 讲 外部知识和行动能力 新的失败点和攻击面

没有一项是免费的。

第三条线:我们看到的,主要是输出

这一讲说明,我们对模型内部的理解还很局部。这门课讲的每一个机制,都可以精确地写成公式、手算出来;但一个训练好的大模型,为什么在某个具体问题上给出某个具体回答,我们多数时候只能从它的行为去推断。

带走一个方法

这门课开头说,它只回答一个问题:这个系统是怎么被造出来的?每一个设计决策在解决什么问题,代价是什么?

这个领域会继续飞快地变化。新的架构、新的训练方法、新的产品,会让这门课里的许多具体数字过时。但面对任何一个新出现的技术,你都可以用这门课反复练习过的四个问题去拆解它:

  1. 它在解决什么问题? 没有它会怎样?
  2. 它凭什么成立? 背后的机制是什么,能不能写出来、算一遍?
  3. 它的代价是什么? 它用什么换来了什么?
  4. 它优化的是什么代理指标? 这个指标和你真正想要的东西,差在哪里?

十一、本讲小结

  • 可解释性的处境:能读到模型内部的每一个数字,却看不懂它们。访问不是问题,理解才是。
  • ⭐ 为什么看不懂:概念以方向的形式存储,并且叠加在一起。手算:4096 维空间里随机的两个方向,95% 的余弦相似度绝对值小于 0.031,所以能容纳远多于维度数的概念,代价是每个维度都参与很多概念。
  • ⭐ 注意力权重不是推理过程:手算层层混合,两层之后"位置 1"里只剩约 56% 来自第 1 个词;还有前馈层和残差等其他通道;不同的注意力模式可以得到同样的输出。
  • 探针:在内部找一个和某个性质相关的方向。手算四个点,w = [1, −1] 能分开真假,但 w' = [1, 0] 也能——相关不是因果。
  • ⭐ 干预:沿着方向改动内部向量,看输出是否跟着变,才是模型在用这个方向的证据。
  • 字典学习:把叠加的方向拆出来,相当一部分能读懂,但拆不干净、成本高。
  • ⭐ 写下的推理不一定忠实:截断、篡改、给暗示的实验表明,模型可能受某个因素影响却不在推理里提及。
  • 九个问题的现状:局部、特定条件下能给出有实验支撑的解释;整体、可验证的说明还做不到。真正的保证只能放在门外的程序里。
  • 全课三条线:优化的永远是代理;每个能力都有代价;我们主要看到的是输出。带走四个问题:解决什么、凭什么成立、代价是什么、优化的代理和真正想要的差在哪。

思考题

  1. 用第四节的方法:如果每一层的混合权重是 90% / 10%(而不是 67% / 33%),经过 5 层之后,“位置 1"里来自第 1 个词的比例是多少?这说明混合的快慢取决于什么?
  2. 第五节说能分开四个点的方向不止一个。请再找一个不同于 [1, −1] 和 [1, 0] 的方向,也能分开这四个点,并说明为什么"找到一个能分开的方向"本身不足以说明模型在用它。
  3. 请设计一个第六节式的干预实验,检验"模型内部有一个方向,决定了它会不会拒绝回答”。你会怎么找这个方向?改动之后看什么?什么样的结果能说明模型确实在用它?
  4. 第八节的"给暗示"实验里,如果模型受暗示改变了答案,并且在推理里如实写出"我注意到题目里提到一位专家认为是 C",这算忠实吗?如果它改变了答案、但推理里没有提及,又说明了什么?
  5. 用第十节的四个问题,拆解一个你最近听说的、这门课没有讲到的 LLM 新技术。