JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

向内窥探:机制可解释性

别的工具问的是「哪些输入重要」;机制可解释性问的是网络内部到底在计算什么。认识一下探针、特征与回路——以及诚实地看清这门年轻的科学究竟能看多远。

从「哪个输入」到「什么计算」

本阶前面几篇给了你一些工具,它们把模型当成黑箱,从外部追问:它为什么会做出那个预测?显著性图会高亮有影响力的像素;可解释 AI方法给每个输入特征打一个分数。这些确实有用,但它们回答的是一个有限的问题——某次预测里哪些输入重要——而不是更深的那个问题:网络究竟在计算什么?机制可解释性立下了远为雄心勃勃的目标。它把一个训练好的神经网络当作一段没有源代码的已编译程序,试图把这段程序逆向还原成人类能读懂的算法。

这个类比值得认真对待。训练过程把一段程序写进了成百上千万、甚至上亿个数字——也就是参数——靠的是梯度下降,而不是人去敲代码。我们手上有完整的二进制:每一个权重都明明白白地摆在那里,完全可观测。我们缺的是注释、变量名、结构。机制可解释性就是那个反汇编工程:拿起这些原始数字,把藏在里面的、有意义的计算单元还原出来。

探针:追问某一层到底已经知道了什么

最温和的切入方式是探针。思路是:把网络冻住,让一些输入流过它,在你选定的某个隐藏层抓取内部激活值。然后训练一个极小、极简单的分类器——也就是探针分类器,通常只是线性的——用这些激活值去预测你关心的某个属性。如果一个一行的线性探针能直接从第 12 层里读出「这个词是不是动词?」或「这个棋局是不是赢面?」,那这个属性显然就被表示在了那里,而且是以一种很容易取用的形式。

在不同层上做探针,会勾勒出一幅「发育」的图景:视觉网络的浅层携带边缘和纹理,深层携带物体部件;Transformer的浅层跟踪词的表层形态,深层跟踪含义与句法。研究者正是这样找到证据,说明某个嵌入或激活编码了某种抽象的东西——而这东西并没有人明确训练它去存储。

探针里还藏着一个微妙的局限:它告诉你某个属性可以从某一层里被解码出来,却没告诉你网络自己有没有用到它。信息可能确实存在,却被下游的计算所忽略。探针回答的是「它在不在那里?」,回答不了「模型有没有依赖它?」——而这道缝隙,恰恰是接下来那些更偏因果的方法想要填补的。

特征与回路:这门学问的工作词汇

机制可解释性建立在两个核心名词上。这里说的特征,并不是你喂给模型的那个输入特征,而是激活空间里的一个内部方向,它会对某种有意义的东西稳定地作出反应——视觉网络里的曲线检测器、语言模型里「这段文字是法语」的那个方向、一个会因金门大桥而激活的神经元。回路则是由特征和权重构成的、彼此相连的一小块子图,它们合起来实现某个具体行为,就像用激活和连接搭出来的一段微型算法。

一个著名的例子是在 Transformer 里发现的「归纳头」(induction head):一对注意力组件协同工作,实现了这样一条规则——「如果模式 AB 之前出现过,而我刚刚又看到了 A,那就预测 B」。这是一个货真价实的「复制并续写」算法,它不是靠读文档发现的,而是靠追踪信息如何流过注意力机制而被找出来的。视觉领域的研究者也同样追踪到了一些回路:它们用更早的「车窗、车轮、镀铬」检测器搭出了一个汽车检测器。这些都是真实、可复现的发现——是从权重里还原出来的小算法。

但这门学问的核心头疼之处正在于此:多义性(polysemanticity)。大多数神经元并不是干净的、单一含义的单元。一个神经元可能同时对猫脸、汽车前脸和某些法律措辞激活。目前主流的解释是:网络把比神经元数量更多的特征硬塞了进去——办法是把它们存成相互重叠的方向,让特征共享神经元,于是几百个维度里能表示上千个概念。这就是为什么你没法一个一个神经元地直接把模型读出来。

# A neuron's activation is a sum over features it participates in:
#   neuron_j = w1*feat_A + w2*feat_B + w3*feat_C + ...
# Sparse autoencoders try to invert this:
#   activations  ->  (encode)  ->  many sparse feature units
#                <-  (decode)  <-  reconstruct the activations
# Goal: each recovered unit means ONE thing.
稀疏自编码器的目标,是把多义的神经元重新拆解回单义的特征。

最近一条重要的研究路线,用稀疏自编码器正面进攻多义性问题:训练一个自编码器,把某一层的激活重新表达成一组数量大得多、但大部分为零的单元,理想情况下每个单元只表示一件干净的事。在大规模应用中,这已经在生产级语言模型里浮现出了数以百万计的可解释特征,其中有些特征你可以放大它来引导模型行为。这是目前这门学问把缠成一团的神经元变成可读词汇的、最有希望的工具——尽管它远谈不上已经解决。

你如何证明一条回路是真的

关于一条回路的说法,在你用因果方式去检验它之前,都只是一个假设。最常用的主力技术是「干预」:不要只是观察网络,而要在它运行到一半时去编辑它,然后看会有什么变化。这其实是你前面见过的消融实验在可解释性里的表亲——只不过是对内部组件做精细的「手术」,而不是对训练配料动手。

  1. 提出假设:「这个注意力头把主语的性别复制到了动词的位置上。」
  2. 消融它:把那个组件置零或替换掉,看目标行为会不会因此失效。
  3. 打补丁:分别用一个「干净」输入和一个「被破坏」输入各跑一遍,再把其中一次运行的某个激活值嫁接到另一次里(激活打补丁),从而精确定位到底是哪一部分在传递这个效应。
  4. 确认:事先预测哪些编辑应该、哪些不应该改变结果,然后核对模型的表现是否和你那套回路说法相符。

正是这种因果上的严谨,把机制可解释性与「随口编故事」区分开来。它也使机制可解释性与把注意力权重直接当作解释截然不同——后者是一条诱人的捷径,却常常把人带偏,因为模型「看哪里」并不可靠地等同于它「为什么这样决定」。同样的怀疑也适用于显著性图:一张漂亮的热力图可以很有说服力,却依然没能反映真实的计算。

为什么要费这个劲——以及它和什么相连

这件事的回报不只是科学上的好奇心。如果你能找到模型所用的那条回路,你就能给它排错:发现一个分类器其实是抓住了一个伪相关(哈士奇身后的雪、医学扫描图上的水印),靠的是捷径学习,而不是真正的信号。你可以编辑知识、通过放大或抑制某个特征来引导行为,还能检查一个修复究竟是真的去掉了问题,还是只是把它藏了起来。机制层面的洞见也会反哺AI 对齐AI 安全研究,那里的梦想是:靠检视内部,而不只是盯着输出,来侦测欺骗或不安全的推理。

不过也要看得清醒。今天这门学问能够完整逆向工程玩具模型和孤立的回路,也能在真实模型里浮现出庞大的特征词典——但它还没法递给你一份关于前沿大语言模型的、完整而忠实的蓝图。这项工作非常耗人力,常常依赖一些尚未被证实的假设(比如「特征是线性的」这一观点),而且在一个模型里得到的发现未必能迁移到另一个模型。「我们找到了一条回路」是真实的进展;「我们理解了整个模型」则还远未摆上台面。