跳到主要内容

Transformer — 让每个词看到所有词

这一章讲三件事: 文字进模型之前发生了什么(向量与位置);注意力机制到底在算什么;以及 GPT 怎么用「预测下一个词」这一件事完成预训练。顺带把英文资料里的 token(词元)等叫法对应到中文。 这一章是后面所有章的地基:第 03 章的放大改造、第 07 章的强化学习、第 11 章的检索,全都架在这台机器上。 不需要任何基础;矩阵(数表)乘法会在用到处解释。

1. 进模型之前:词变向量,位置自己补

Transformer 由 Google 在 2017 年提出,最早用于机器翻译;今天几乎全部大语言模型都建立在它之上——它是深度学习(用多层神经网络自动学规律的技术)迄今最成功的设计1

它做的第一件事很朴素:把每个词变成一串数。原因很直接——神经网络只会算数,不会认字。每个词对应一串固定长度的数,术语叫嵌入(即第 01 章说的词向量),一句话就变成一排等长的数列,模型后续的全部计算都作用在这排数上。

但这里有个漏洞。老一代模型按顺序逐词读文本,「谁在前谁在后」天然就知道了;Transformer 为了让所有词同时算,序列里不再有任何信息能标明单词之间的相对位置关系——「猫咬狗」和「狗咬猫」在它眼里会变成同一袋词2。所以必须在词向量上再叠加一份「位置编码」:每个位置对应一个固定的向量,直接加到词向量上。

原版 Transformer 用不同频率的正弦、余弦(两种波浪函数)来生成位置编码。

这么做有两个好处:取值范围在 −1 到 +1 之间,加上去不会破坏词向量本身的意思。

并且第 pos+k 个位置的编码,可以由第 pos 个位置的编码线性(加权求和)组合出来——编码里天然蕴含了「距离」这个信息3

2. 注意力:精确的三步计算

「注意力」听起来像比喻,实际上是一段完全确定的计算。书里给出的机制由三个元素构成:查询(Query)、键(Key)、值(Value)——每个词的向量分别乘以三个矩阵,得到三份新向量4

这三个名字借自检索系统,拿图书馆类比一次(说完即弃):查询是「我想找什么」,键是「每本书的标签」,值是「书的内容」。

主走查开始。拿句子「那只猫没过马路,因为它太累了」,看「它」这个位置怎么决定看谁(下面所有分数都是为演示编的,不是真实数值):

第 1 步:拿「它」的查询向量,和句中每个词的键向量做点积
(点积 = 两串数对应位相乘再求和,结果一个数,衡量匹配程度)
「它」q · 「猫」k = 8.6 「它」q · 「过」k = 0.3
「它」q · 「马路」k = 0.5 「它」q · 「累」k = 7.9

第 2 步:分数除以 √d 后过 Softmax,变成总和为 1 的权重
猫 0.72 累 0.19 马路 0.04 过 0.02 其余更小
(Softmax:把一列数压成一组非负、总和为 1 的权重)

第 3 步:按权重把每个词的值向量加权求和,作为「它」的新表示
「它」的新表示 ≈ 0.72×猫的值 + 0.19×累的值 + …

三步之后,「它」的向量里掺进了大量「猫」的成分——所以模型接下来预测下一个词时,输出「太累」的主语是猫而不是马路。权重(Softmax 给出的取物比例)不是拍脑袋,是查询和键的匹配分数算出来的;同一句话换个词,分数自动跟着变5

一个实现细节值得单独说:分数除以 √d(向量长度的平方根),是为了防止过大的匹配分数在 Softmax 中把权重几乎全压给一个词——那样梯度(回传用来调参数的信号)就没了6

除以 √d 同时也是在保收敛(训练稳定进步):数字一大,后续计算的效率会明显变差6

3. 组装一个 Transformer 块

单个注意力只是一道工序,真正的单元(最小积木)是把它和另外三件东西叠在一起,构成一个可重复堆叠的块。

多头:几个视角各看一遍

多头注意力:只看一遍容易偏科,所以同时并行(一起跑)运行多组独立的注意力(比如 8 组),每组在各自的子空间里算一遍第 2 节那三步,最后把 8 份结果拼接起来再过一次线性变换。

书里的说法是:以「从多个侧面捕捉输入序列信息」,让序列中任意两个词的依赖关系可以直接建模而不依赖循环结构,从而更好地解决长程依赖问题7

加工:前馈层

前馈层:注意力负责「看别人」,前馈层负责「自己加工」——一个带 ReLU 激活的两层全连接(每个输入都连到每个输出)网络。

它对每个位置的表示独立做非线性(弯折、扭曲数据的)变换;实验表明这一层对最终性能影响重大,而且它的内部宽度一般比注意力子层更大8

两根拐杖:直连通道与数值稳定

残差(直接把输入接回输出的旁路)连接:网络堆到几十层后,梯度在层层回传中会衰减到消失(梯度消失),训练就进行不下去。残差连接的解法,是给每层加一条直连通道:输出 = 变换(输入) + 输入,梯度可以沿直通道无衰减地流回底层。

归一化:把每层的数值重新平移缩放到统一尺度。

原版做的是层归一化——把数值拉回均值 0、波动幅度 1 的范围,深网络训练的稳定全靠它9

4. 翻译任务的左右手

原版 Transformer 处理翻译时分成两半。编码器(负责读的那一半)读源语言(比如英语):整句已给定,它只需要融合全文的意思。

解码器(负责写的那一半)生成目标语言(比如法语):一边生成,一边回头查源句10

解码器比编码器多两样东西。其一是掩码:训练时目标句是整句喂进去的,必须人为遮住「当前位置之后」的词,否则模型直接抄答案,训练就废了。其二是交叉注意力:普通注意力只看自己这边的词,交叉注意力的查询来自解码器,而键和值来自编码器的输出——这就是「生成法语词时回头看英语原句」的机制11

生成是自回归(把刚生成的词拼回输入再算下一个)的:每个时间步根据编码器输出和已生成的前 t−1 个词,生成当前词;生成完接回句尾,再跑一遍。

5. GPT:砍掉一半,用预测训练

有了上面的积木,GPT 的构造一句话能说完:由多层 Transformer 组成的单向语言模型,只要解码器那一半——每个位置只能依赖过去时刻的信息,从左往右逐词建模12

它的训练目标也朴素到令人怀疑:给定文本序列,最大化「根据前文预测当前词」的可能性(英文论文里说的 token 预测,就是这件事——token 即词元)。

形式上,这等价于最小化一个罚分:先把「预测得对的可能性」取对数(压缩数字尺度的常规操作)再取负。

这个罚分行话叫「负对数似然」:negative log-likelihood,错得越狠罚得越重的记分。

预训练用随机梯度下降(顺着坡往下走找最低点的调参法)把这个目标降到底(每一步都朝错误更小的方向挪)。

梯度怎么传回每个参数?靠反向传播——把「输出错了多少」逐层分摊回每个参数的方法13

训练数据:互联网上的一句话「今天天气很好」

├─ 喂「今天」 → 模型应预测「天」
├─ 喂「今天天」 → 模型应预测「气」
└─ 喂「今天天气很」 → 模型应预测「好」
图说:同一句话切成四个练习题。没有人工标注——答案就是原文的下一个词。

这就是自监督:训练信号自动从没打过标签的原文里构造,互联网有多大,教材就有多大(第 01 章的四阶段流水线里,这一站 producing 的正是基础模型)。

预训练出的模型会续写,但不会「听指令做事」。把它适配到具体任务的传统做法是有监督微调:拿打好标签的数据在预训练模型上继续训练。但这里埋着本章最后一个机制:灾难性遗忘——微调只盯着任务目标调参,很容易把预训练学到的通用语言理解能力冲掉;常见的缓解办法是把预训练损失混进微调损失里一起调,用系数调节占比14

判断(我们的,不是书里的): 「灾难性遗忘」不是语言模型的花边问题,它决定了后面几乎所有章节的设计。第 06 章的 LoRA 把主模型钉死不动、第 06 章双阶段混合微调里掺领域数据、第 12 章蒸馏时用 KL 散度拉住学生模型,全是在跟同一个敌人作战:改动参数会伤害旧能力。 如果错,会错在: 如果遗忘的根源不是「目标冲突」而是「数据的样貌变了」,那么钉死参数类方案(LoRA)的有效性就需要另一种解释——但无论哪种解释,「混入旧损失能缓解遗忘」这个书里的实证做法不受影响。

6. 作者的判断与证据

  • 有证据的: 前馈层的宽度大于注意力子层能提升翻译质量、残差与归一化稳定训练——这些是书里标注了「实验证明/实验结果」的论断。
  • 作者的判断: 用正余弦做位置编码的两个好处是原论文给的设计理由,书里照单收录;后来的主流模型(见第 03 章)实际上换掉了它。
  • 三个声音: 本章代码较多(位置编码、多头注意力、层归一化的 PyTorch 实现),这些是作者的教学示例代码,不是官方实现——把它们当讲解读,不要当工程模板抄。

7. 边界与局限

  • 本章的注意力每步都对全部词两两计算——平方复杂度(计算量随长度平方增长)的问题原书在第 2.3.2 节才点破,改进方案也在第 03 章。
  • 书没有讲为什么注意力比循环网络好(只是给结论「更好地解决长程依赖」);工业界共识是并行性(所有词同时算,循环网络必须串行)是主因,这一层动机要靠通用知识补足(补充:不在书里,来自通用知识)。

8. 可带走的

  1. 文字进模型第一步是变成等长向量,位置信息必须额外叠加,否则词序信息丢失;
  2. 注意力三步走:查询对键打分 → Softmax 归一成权重 → 按权重混合值向量;「它」指代谁,是算出来的不是规定出来的;
  3. 分数除以 √d 不是玄学,是防止 Softmax 输出「一家独大」导致梯度消失;
  4. 多头 = 多个子空间各看一遍;前馈层加工;残差通道和层归一化让几十层的网络训得动;
  5. 掩码是解码器的「防作弊器」:训练时看不见未来,推理时才配得上一致;
  6. GPT = 解码器 + 预测下一个词;自监督意味着语料规模直接决定教材规模;
  7. 灾难性遗忘在预训练+微调的架构里是常态而非意外;「混入旧任务损失」是最朴素的对抗手段;
  8. 自回归生成决定了大模型服务的根本成本结构:吐一个词就要把模型完整跑一遍——第 12 章的全部提速手段都在对抗这件事。

9. 原文地图

主题原书章原文位置
Transformer 来源与地位2 大语言模型基础text/02-ch02.txt:15(搜「2017 年提出」)
词向量与位置编码的必要性2 大语言模型基础text/02-ch02.txt:77(搜「相对位置关系」)
正余弦位置编码两个好处2 大语言模型基础text/02-ch02.txt:93(搜「线性组合」)
查询、键、值三元素2 大语言模型基础text/02-ch02.txt:125(搜「查询」)
点积打分与 √d 放缩2 大语言模型基础text/02-ch02.txt:145(搜「放缩因子」)
多头注意力2 大语言模型基础text/02-ch02.txt:27(搜「整合上下文语义」) · text/02-ch02.txt:154(搜「多头注意力机制」)
前馈层与维度2 大语言模型基础text/02-ch02.txt:219(搜「前馈层接收」) · text/02-ch02.txt:224(搜「前馈子层隐状态的维度」)
残差与层归一化2 大语言模型基础text/02-ch02.txt:243(搜「残差连接与层归一化」)
掩码与交叉注意力2 大语言模型基础text/02-ch02.txt:283(搜「掩码多头注意力」) · text/02-ch02.txt:289(搜「多头交叉注意力」)
自回归生成2 大语言模型基础text/02-ch02.txt:285(搜「自回归」)
GPT 单向结构2 大语言模型基础text/02-ch02.txt:457(搜「生成式预训练」)
负对数似然训练目标2 大语言模型基础text/02-ch02.txt:492(搜「最大似然估计」) · text/02-ch02.txt:500(搜「负对数似然」)
灾难性遗忘与混合损失2 大语言模型基础text/02-ch02.txt:523(搜「灾难性遗忘」)

Footnotes

  1. 出处:「2 大语言模型基础」第 15 段(text/02-ch02.txt:15,搜「2017 年提出」)。原文:Transformer 由 Google 在 2017 年提出并首先应用于机器翻译;如今几乎全部大语言模型都基于 Transformer 结构。

  2. 出处:「2 大语言模型基础」第 77 段(text/02-ch02.txt:77,搜「相对位置关系」)。

  3. 出处:「2 大语言模型基础」第 91-93 段(text/02-ch02.txt:93,搜「线性组合」)。原文给出两个好处:取值范围 [−1,+1] 不破坏语义;第 pos+k 个位置编码是第 pos 个的线性组合,蕴含距离信息。

  4. 出处:「2 大语言模型基础」第 125 段(text/02-ch02.txt:125,搜「查询」)。原文引入自注意力机制的三个元素:查询 qi(Query)、键 ki(Key)和值 vi(Value),通过三个线性变换从词表示生成。

  5. 出处:「2 大语言模型基础」第 146 段(text/02-ch02.txt:146,搜「聚合」)。原文:放缩后的得分经过 Softmax 归一化为概率,与其他位置的值向量相乘来聚合希望关注的上下文信息。走查中的具体分数为演示编造。

  6. 出处:「2 大语言模型基础」第 145 段(text/02-ch02.txt:145,搜「放缩因子」)。 2

  7. 出处:「2 大语言模型基础」第 27 段(text/02-ch02.txt:27,搜「整合上下文语义」)与第 154 段(text/02-ch02.txt:154,搜「多头注意力机制」)。

  8. 出处:「2 大语言模型基础」第 219 段(text/02-ch02.txt:219,搜「前馈层接收」)与第 224 段(text/02-ch02.txt:224,搜「前馈子层隐状态的维度」)。

  9. 出处:「2 大语言模型基础」第 243 段(text/02-ch02.txt:243,搜「残差连接与层归一化」)与第 259 段(text/02-ch02.txt:259,搜「层归一化技术」)。

  10. 出处:「2 大语言模型基础」第 283 段(text/02-ch02.txt:283,搜「掩码多头注意力」)。

  11. 出处:「2 大语言模型基础」第 289 段(text/02-ch02.txt:289,搜「多头交叉注意力」)。原文:查询通过解码器前一层的输出投影,键和值使用编码器的输出投影。

  12. 出处:「2 大语言模型基础」第 457 段(text/02-ch02.txt:457,搜「生成式预训练」)。原文:GPT 是由多层 Transformer 组成的单向语言模型。

  13. 出处:「2 大语言模型基础」第 492 段(text/02-ch02.txt:492,搜「最大似然估计」)与第 500 段(text/02-ch02.txt:500,搜「负对数似然」)。

  14. 出处:「2 大语言模型基础」第 523 段(text/02-ch02.txt:523,搜「灾难性遗忘」)与第 524 段(text/02-ch02.txt:524,搜「混合预训练任务损失」)。