把黑箱拆开:手搓一个大语言模型 书架

第 06 章 / 共 16 章

第六章 · 把注意力堆成塔:Transformer 全貌

上一章结束时,你脑子里应该刚跑完一场"开会":一句话里的每个词,都在扭头看别的词,决定该多听谁的。the animal didn't cross the street because it was too tired 里的 it,靠注意力把目光投向 animal 而不是 street。很妙。但也留了个尾巴:一次注意力,真的够吗?一个词只能"看一眼",它想同时关心的东西可不止一件。

这一章,我们把那个心脏拿出来,看它怎么被复制、被加固、被叠成一座塔——最后从塔顶掉下来的,是一串"下一个词是什么"的概率。这座塔,就是 Transformer(变换器),如今几乎所有大模型的骨架。

一个头不够看:多头注意力

回到那句话。it 该看谁,其实不是一个问题,而是好几个问题叠在一起:

如果只有一套注意力,它得把这些关心的对象糊成一团平均值——就像开会时你只有一双耳朵,三个人同时说话,你听到的是一锅粥。解决办法笨得可爱:那就配好几双耳朵

这就是 多头注意力(Multi-Head Attention)。所谓"头",就是一整套独立的注意力计算——各有自己的一组 Q、K、V 权重(还记得吧:Query 是"我想找什么",Key 是"我有什么标签",Value 是"我能提供什么内容")。

把"头"想成会议室里派出的几名助理。每人拿着不同的任务清单去听会:一号只记"谁指代谁",二号专盯"谁在描述谁的状态",三号管"时间先后"。他们各听各的、各记各的,最后回到你面前,把几份笔记拼在一起。你一下子拿到了好几个角度的信息,而不是一锅粥。

典型的模型会配多少个头?GPT-2 的中等版本用 12 个头,大模型常见 16、32 乃至更多。关键是,这些头并行算——它们不排队,同时开工。每个头输出一份结果向量,然后把这些向量首尾拼接起来,再过一个矩阵把维度压回原样。于是"一个词"就同时携带了十几个视角的信息。

你可能会担心:头一多,计算量是不是暴涨?不会。诀窍是把每个头做"瘦":如果词向量是 768 维、有 12 个头,那每个头只在 768 / 12 = 64 维的小空间里干活。总活儿量和一个大头差不多,但被切成了 12 份各管一摊。省钱,还更聪明。

叠得越高越糊涂:残差连接来兜底

一个头也好、多个头也罢,一层注意力能做的事有限。真正的威力来自把这样的层堆很多层:GPT-2 small 有 12 层,GPT-3 有 96 层,更大的模型上百层。每一层都在前一层的理解之上,再加一点更抽象的关系。

但堆深了会出事。你把一个词向量往上传,经过几十层反复揉搓、乘来乘去,最初那点信息很容易被冲刷得面目全非——就像一句话在几十个人之间口耳相传,传到最后完全变味。更麻烦的是训练:第七章会讲到,训练要把错误从塔顶一路"反推"回塔底,塔太高,这个信号一层层衰减,传到底下几乎归零,底层就学不动了。

Transformer 用一个朴素到你会想"就这?"的办法解决它:残差连接(residual connection)

每一层不直接输出"我算出的新结果",而是输出"原来的东西 + 我这一层做的改动"。用公式说就是 输出 = 输入 + 这一层算出来的东西。这条把输入原样加回去的线,叫"跳线"(skip connection)。

为什么这一招这么关键?两个原因,都很实在:

可以说,没有残差连接,就没有"深"的 Transformer。它是让塔能盖高的地基。

别让数字发飙:层归一化

还有个隐患。层层相加、相乘,向量里的数字可能越滚越大,或者忽大忽小地乱跳。数字一旦失控,训练就像想在结冰的陡坡上站稳——不是滑飞就是冻住。

于是每层里再塞一个稳压器:层归一化(Layer Normalization,简称 LayerNorm)

它做的事,本质是把一个词向量里那几百个数字"重新标准化":算出它们的平均值和波动幅度,然后统一拉成"均值为 0、幅度为 1"的样子。好比每层之间放个自动调音台,不管上一层送来的信号是震耳欲聋还是细若游丝,都先归一化到正常音量,再交给下一层。

注意,它归一化的是同一个词自己的那几百维数字,跟别的词无关——这正是"Layer"归一化区别于其它归一化的地方,也让它对"每次输入长度不一样"的文本特别友好。有了它,几十层堆起来数值也不会爆炸或消失,训练稳稳当当。

把一层拼出来:注意力 + 前馈

现在零件齐了,看一层里到底装了什么。一个标准的 Transformer 层(block)就两个子模块,每个都用"残差 + 层归一化"包起来:

  1. 多头注意力子层:让每个词从别的词那里收集信息——横向的"互相看一眼"。
  2. 前馈子层前馈网络(Feed-Forward Network,FFN),其实就是第四章讲的那种普通神经网络——先把向量放大到几倍宽(比如 768 维撑到 3072 维),过一道非线性把它"掰弯",再压回原样。它逐个词独立处理,不看别人,负责把刚收集来的信息就地"消化加工"一遍。

一个精炼的说法:注意力负责"搬运信息",前馈负责"加工信息"。一层搬一次、加工一次;堆 N 层,就搬运加工 N 轮,关系被一层层抽象得越来越深。

从塔顶掉下来的:一串概率

把整条流水线连起来走一遍,你就看清了全貌。假设输入 今天天气很

  1. 切词、编号(第二章),每个词查表变成一个向量(第三章)。
  2. 再加上一份位置编码(positional encoding)——因为注意力本身不分先后,你不告诉它词序,"猫追狗"和"狗追猫"在它眼里一个样。位置编码就是给每个词额外贴一个"你是第几个"的标签。
  3. 这串带位置的向量,钻进第 1 层:注意力搬运、前馈加工,残差和层归一化全程护航。出来,进第 2 层……如此穿过全部几十层。
  4. 从塔顶出来的,是每个位置一个"饱含上下文"的向量。取最后一个词那个位置的向量,乘上一个大矩阵,映射到整个词表——几万个词,每个得一个分数。
  5. 过一道 softmax(把一堆分数换算成加起来等于 1 的概率),你就得到了"下一个词是每个候选词的概率": 或许 40%, 25%,不错 10%……

看到没?兜了这么大一圈,塔顶掉下来的东西,正是第一章说的那唯一动作——猜下一个词。Transformer 再花哨,也只是把这个填空题算得极其精细而已。

整座塔本质上是一台超大的"关系提炼机":输入一串词,它反复问"这些词彼此什么关系、合起来在说什么",问几十遍越问越深,最后基于这份理解,赌下一个词是谁。没有理解世界,只有反复咀嚼词与词的关系。

至于最后 softmax 出来的那把概率,模型是老老实实选最高的那个,还是掷一把"加权骰子"随机挑——这一步的花样,恰恰决定了它是刻板还是有创意、是靠谱还是开始一本正经地胡说。那是后面的故事了。

但有一件事,我们一直当成理所当然:这座塔里成千上万个数字——注意力的权重、前馈的矩阵、每一层的旋钮——它们一开始全是乱填的随机数。塔的结构再精巧,旋钮没调对,吐出来的也只是乱码。那这几十上亿个旋钮,到底是怎么被一点点拧到"对"的?下一章,我们蒙上眼睛,开始下山。

把黑箱拆开:手搓一个大语言模型 · 王建硕
面向对世界有好奇心的人 · 费曼式写法 · 由多个 AI 代理撰写与互相审校