从零手写大模型 · 推理篇 15 - Interpretability(可解释性 · 完结篇)
推理篇 · 查看系列写在最后一集之前
EP14 结束的时候,我们已经有了一个完全由自己手写、加载了真实 GPT-2 权重、能自回归生成文字的模型。技术闭环走完了。
但走完这 14 集,可能会冒出一个新的疑问:模型内部那些 768 维的向量、那些经过十二层 Attention 和 FFN 变换之后的数字,它们到底代表着什么?我们知道怎么算出它们,但不知道它们"意味着"什么。这一集,想聊聊这个问题——AI 的"黑盒"到底黑在哪,以及这个黑盒是不是真的无法打开。
先纠正一个常见的说法:"不可解释"不等于"无法解释"
很多科普文章会说"神经网络是不可解释的黑盒",这句话容易让人产生一个误解:好像模型内部的数字是某种本质上无法理解的东西,永远也说不清楚它们在干嘛。
但更准确的说法应该是:模型内部的中间表示,默认状态下是黑盒,但这是"没去解读"造成的,不是"不能解读"。 这是两码事。
打个比方:一段没有注释的汇编代码,你不熟悉它,看着就是一堆寄存器和跳转指令,"黑盒";但如果你愿意花时间,逐条指令反推它在做什么,是完全可以搞清楚这段代码到底实现了什么逻辑的——只是需要专门的、系统性的"逆向工程"功夫。神经网络内部的向量也是一样:它们不是天生不可知,而是需要专门的技术手段去"翻译"。这个专门的研究方向,叫 可解释性(Interpretability),近几年学术界一个更细分的分支叫 机制可解释性(Mechanistic Interpretability),目标就是把模型内部到底在做什么样的计算,逆向工程出来。
回头看:我们其实已经解读过一部分"黑盒"了
其实翻回这个系列前面的内容,你会发现我们已经不知不觉做过好几次"局部解读"的工作了,只是当时没有点破这就是"可解释性"。
例子一:矩阵里的负数不是没意义的噪声
我们在讲 Attention 和 FFN 的时候提到过,矩阵运算结果里出现的负数,不是随机噪声,而是携带着方向性含义的——它们代表"不匹配""相反方向"这类语义,和正数代表的"匹配""同方向"是相对的一组信号。这已经是对模型内部数字的一种解读:不是把它们当成不可知的黑箱输出,而是尝试理解"为什么是负的""负值意味着什么"。
例子二:激活函数为什么保留负值信息
我们对比 ReLU 和 GELU 的时候讲过:ReLU 会把所有负值直接砍成 0,而 GELU 会保留一部分负值的残留信号,只是权重变小。这个设计差异背后,其实也是一种"可解释性"的思考角度——如果负值携带着"不匹配"这类语义信息,那 ReLU 粗暴地把它清零,是不是也把一部分有用的信息给丢了?这正是近几年 Transformer 架构普遍倾向选择 GELU 而不是 ReLU 的原因之一。
也就是说,可解释性不是一个和前面 14 集割裂的新话题,而是贯穿在我们每一次"为什么这么设计"的追问里的东西。 只是这一集,想把这条线单独拎出来,给它一个更完整的框架。
机制可解释性在做什么
如果要往深了聊,机制可解释性这个领域,大致在做这么几类事情:
- 激活值分析(Activation Analysis):观察模型在处理具体输入时,某个神经元、某个 Attention Head 到底"亮"起来对应什么样的输入模式。比如研究者发现过 GPT-2 里存在专门对"括号是否匹配"敏感的神经元,或者专门追踪"当前在说哪种语言"的 Attention Head
- 探针(Probing):训练一个小的辅助模型,去检测某一层的中间表示里,是不是"藏"着某种可解释的信息(比如词性、句法结构),从而反推这一层到底学到了什么
- 电路(Circuits):更进一步,不只看单个神经元,而是追踪多个组件(几个 Attention Head + 几层 FFN)是怎么协同工作、组成一个完整的"计算电路",共同完成某个具体的子任务(比如"间接对象识别"这类语法任务)
- 归因(Attribution):反过来问,模型给出的某个具体输出,是被输入的哪些部分"贡献"出来的——这类方法在需要为模型决策找依据的场景(比如医疗、金融)特别重要
这些方法背后有一个共同的信念:Transformer 内部不是一团乱麻,而是存在着某种可以被识别、被命名、甚至被人类理解的结构和分工——只是需要专门的工具和耐心去把它挖出来。
为什么这件事值得关心
聊到这里,可能会有人问:我们这个系列的目标是"把模型跑起来",可解释性听起来是另一个研究领域的事,为什么要单独用一集来收尾?
我想法是这样的:这 14 集我们做的事情,本质上就是"从上帝视角"解构了一次 GPT-2 的黑盒——我们不是把模型当成一个封闭的 API 来调用,而是亲手拆开了每一层、每一个矩阵乘法、每一次维度变换,知道它到底在算什么。这个过程本身,就是"可解释性"最朴素的第一步:先理解结构,才能谈理解语义。
而机制可解释性研究要做的,其实是在我们已经理解的这套结构之上,再往前走一步——不只是知道"这一层在做矩阵乘法",而是知道"这一层这次具体算出来的这个向量,对应着人类能理解的什么概念"。这是一条更难、但方向明确的路,而我们这 14 集打下的地基,正是理解这条路的必要前提。
系列完结
从 EP01 的项目介绍、EP02 的 Tokenizer,到这一集的可解释性收尾,"从零手写大模型"这个系列,到这里正式完结了。
回头梳理一下这趟旅程:我们从最基础的分词讲起,一路手写了 Embedding、位置编码、Self-Attention、Multi-Head Attention、残差连接、LayerNorm、FFN、激活函数,拼装成完整的 Transformer Block 并堆叠成深层网络,加载了 GPT-2 的真实预训练权重,实现了自回归文本生成,最后用这一集聊了聊"黑盒"到底是怎么回事。这条主线,把"GPT-2 到底是怎么工作的"这件事,从头到尾拆解了一遍。
感谢一路跟读下来的每一位读者,也感谢陪着这个系列走了 15 集的"猫吃鱼"。
下一阶段的内容——关于"训练",关于怎么让一个随机初始化的模型从零学会某种规律——会是一个新的开始。