跳到主要内容

这一章把第 20 章那台两步机器装进厂房:先还欠账(位置),再给每个块配齐 「交互 + 加工 + 稳定」三件套,然后画出从一段文字到下一个词的完整传送带。 读完这一章,「模型是怎么生成下一个词的」就不再是黑盒。

Transformer:骨架与数据流

1. 这一章讲什么

三件事: 位置怎么补进一个只看内容的注意力(位置编码——给位置发编号的三代方案);

一个 Transformer 块里到底装了什么、编码器解码器各差哪一块;

以及一条完整的生成数据流——分词(把文本切成最小单位)、嵌入、块、logits、采样、追加。

它在全书链条里的位置: 第 20 章给了心脏(自注意力), 这一章给出身体:交互、加工、稳定、循环四个器官各就各位。 它同时是后面一切的底座——第 22 章改它的零件,第 27、31 章用它当学习机器。

需要第 20 章;第 3、7 节用到第 16、18 章的层规范化。

2. 顶层全景

文本 ─▶ 分词 ─▶ 词元编号 ─▶ 嵌入(+位置) ─▶ [块 ×L] ─▶ logits ─▶ softmax ─▶ 下一个词元┐
▲ │
└──────────────────────── 追加回前缀 ◀──────────────────────────┘ (推断循环)

一个块(解码器版)三件套:
┌─────────────────────────────────────────────┐
│ 掩码自注意力(位置间交互,不许看未来) │
│ 交叉注意力(解码器←编码器,仅编码-解码架构) │
│ 逐位置前馈网络(每个位置独立非线性加工) │
│ 残差 + 规范化(每个子层外面包一圈,稳训练) │
└─────────────────────────────────────────────┘

一句话链条: 注意力只认内容不认顺序 → 位置必须自己报户口(位置编码)→ 单层注意力只会交互不会加工,补上逐位置前馈 → 深层要稳,包上残差和规范化 → 解码要自回归,掩码挡住未来 → 拼起来循环跑,文本就一个词一个词地出来了。

3. 第一笔欠账:位置编码

自注意力的打分只依赖内容相关性,不天然包含位置—— 两个「位置不同但内容相同」的词元(文本切出的最小单位),它区分不了1。 「词袋」(bag of words,只数词出现过没有、不管先后)的老问题在这里原样复活,所以位置必须显式注入。

书把这条演化线概括成三代:绝对位置编码 → 相对位置建模 → 面向长上下文的位置外推(没见过的位置也能用)2

第一代:绝对位置编码。 给每个位置 t 发一个向量 pₜ,直接加到词嵌入(词元的向量表示)上: H⁽⁰⁾ = [e_{x₁}+p₁, …, e_{x_T}+p_T]3。 p 既可以是可学习参数,也可以用正弦-余弦公式(sin/cos,频率按维度指数变化)生成4。 直观图像:不同维度的正弦波频率不同——低维高频,位置挪一格波形就大变,编码局部; 高维低频,波形缓慢起伏,编码全局位置。正弦-余弦位置编码实际上提供了 一种多尺度的位置表示5。它的局限也有四条,最重要的两条: 周期函数组合在极长序列上会出现近似重复;固定的绝对位置在训练长度之外 难以获得稳定的长度外推能力(训练时没见过的位置,用起来就飘)6

第二代:相对位置编码。 很多任务关心的不是「我在第几位」而是「我们隔多远」。 做法:不打位置向量了,直接在注意力打分里加一个与相对距离相关的修正项—— s_{j,t} = kᵀq/√d_k + b_{j,t}7。代表是 ALiBi(线性偏置注意力): 偏置与距离近似成线性,把「越远越不容易被关注」这条归纳偏置直接写进分数, 实现简单,训练长度之外外推也更好8

第三代:旋转位置编码(RoPE——给 q、k 施加位置相关旋转)。 现代大语言模型的主流。 不做加法,做旋转:把查询和键的每对相邻维度当作平面上的点, 按位置 t 旋转角度 tθ(θ 随维度变化)9。它好在哪?靠两条旋转矩阵的性质: 转置等于反向旋转、角度可相加——于是两个位置的内积:

qₜᵀkⱼ = q̃ₜᵀ Rₜᵀ Rⱼ k̃ⱼ = q̃ₜᵀ R_{j−t} k̃ⱼ

打分天然只依赖相对位置 j−t10,而且比「位置向量直接相加」 更容易融进缩放点积注意力——它不需要改注意力公式,改的只是进公式之前 q、k 的姿态11

三代的位置一句话:第一代把位置加进输入,第二代把位置加进分数,第三代把位置转进点积。

4. 一个块里装了什么

自注意力层只是零件。Transformer 块是标准化车间,编码块由四个模块组成: 多头自注意力层、加与规范化层、前馈层、再加一个加与规范化层12。写成公式:

Z = norm(H + Self-Attn(H)) 交互:位置之间换信息
H′ = norm(Z + FFN(Z)) 加工:每个位置自己想

两个配角各管一件事:

加与规范化(Add & Norm) = 残差连接 + 层规范化。残差给梯度留高速路 (第 14 章),层规范化稳住中间表示的尺度和分布——有助于稳定中间表示的尺度与分布13。 原始 Transformer 用的是「先残差相加、后规范化」的 Post-Norm 顺序; 现代大模型普遍换成 Pre-Norm——为什么、换成什么样,第 22 章正位细讲14

逐位置前馈网络(FFN) 是两层全连接(原始版用 ReLU), 对每个位置的表示分别做相同的非线性变换——书给了一个精准的类比: 类似于核大小为 1 的卷积15。分工由此清晰:注意力管「位置之间」, 前馈管「每个位置之内」;只交互不加工,表示深不下去。

5. 解码器:不许偷看未来

解码器块比编码器多一块、改一块,三个子模块16:

  1. 掩码自注意力:对已生成前缀做交互,但因果掩码挡住右侧——不许看未来;
  2. 编码器-解码器注意力(交叉注意力):查询来自解码器当前状态, 键和值来自编码器输出,负责从源序列里检索当前最相关的信息17;
  3. 逐位置前馈网络:加工融合后的表示。

因果掩码是这一节的主角。 它是一个 T×T 矩阵,加在打分上: 允许看的位置填 0(等于没加),未来位置填 −∞——softmax 里 e^{−∞}=0, 未来位置的概率正好全部归零18

6. 主走查:写一张掩码,再看一行分数的变化

第一段:4×4 因果掩码(查询行、键列;0 允许,−∞ 屏蔽):

键位置
1 2 3 4
查 1 0 −∞ −∞ −∞
询 2 0 0 −∞ −∞
位 3 0 0 0 −∞
置 4 0 0 0 0

下三角全开(自己和自己之前),上三角全关——生成第 t 个词时, 世界只有前 t 个词19。(成批训练不同长度的句子时,还要配填充掩码 把补齐位置也屏蔽掉,同一个机制的第二种用法20。)

第二段:同一行分数,掩码前后。 复用第 8 节那三个词, 现在换成第 2 个位置的查询:它对三个键的原始打分(为演示沿用同一组数) 是 (0, 0.916, 0.405),softmax 后注意力分布为:

掩码前:α = (0.200, 0.500, 0.300) ← 第 2 位置「偷看」了第 3 位置
加掩码:分数变 (0, 0.916, −∞)
exp = (1.000, 2.500, 0) 合计 3.500
掩码后:α = (0.286, 0.714, 0) ← 未来的那一票被清零

看清这个机制的秘密:掩码不需要重新训练、不需要改公式, 就是把被禁分数压成 −∞,剩下的权重按原比例重新归一。 训练时整段并行、每个位置只看前缀,靠的就是这一张表21

7. 从一段文字到下一个词:完整数据流

以仅解码器语言模型为例,文本到下一个词的传送带有五站22:

① 分词器:文本 → 词元编号 w₁…w_T(字/子词/字节片段,粒度由分词器定)
② 嵌入 + 位置:每个编号查嵌入矩阵 E 得向量,再叠加位置信息
③ L 个带因果掩码的块:第 t 位的隐藏状态只依赖前缀 w₁…w_t
④ 输出层:zₜ = W_o·hₜ⁽ᴸ⁾ + b_o → 词表大小的 logits(未归一化分数)
⑤ softmax:p(w_{t+1}=v|w₁…w_t) → 采样出一个词元,追加回前缀

训练和推断在同一传送带上分工。训练时完整序列已知: 把前缀序列一次性输入,让每个位置预测下一个真实词,所有位置的交叉熵并行算—— 这就是教师强制23 (第 15 章的名词在这里落地成矩阵形状)。 推断时没有未来可喂:每步从当前前缀出发走完 ④⑤,采出词元、追加、再来—— 输出不是直接生成文本,而是反复执行「前缀 → 隐藏表示 → logits → 采样 → 追加」的循环24。 (采样的花样——贪心、温度、top-k、核采样——第 31 章专讲。)

8. 三种架构范式

同一套块,按信息流方向剪出三种形态25:

范式保留什么擅长代表任务
仅编码器双向看全文理解类文本分类、序列标注、句对匹配
仅解码器因果掩码自回归生成类大语言模型的主流形态
编码器-解码器两截都留 + 交叉注意力条件生成翻译、摘要

书对三者关系的判词很干净:都建立在相同的注意力计算之上, 差别只在信息流方向和训练目标26——不是三种模型,是一套骨架的三种剪裁。

9. 作者的判断与证据

书里给了推导与性质的: 正弦位置编码「相对距离可用线性变换表示」4; RoPE 的两条旋转矩阵性质与 qₜᵀkⱼ=q̃ₜᵀR_{j−t}k̃ 的推导10; 因果掩码「未来概率全零」的机制18

书里给了演化定位的: 位置建模三代的划分(绝对→相对→长上下文外推)2; FFN「类似核大小为 1 的卷积」的类比15; 三种范式「只是信息流方向和训练目标不同」26

书里留了接口(留给后文的衔接点)的: Post-Norm→Pre-Norm 的更替点到为止,注明后文细讲14; 推断阶段的采样策略点名贪心/温度/top-k/核采样,机制留待第 31 章24

10. 边界与局限

正弦位置编码的四条局限书列了全,但绝对编码与可学习位置编码的对比实验书未给—— 「可学习」版本如今在大模型里几乎绝迹,这一演化事实要读者出门确认6

因果掩码只保证「看不到」,不保证「该看多少」:掩码挡住作弊, 但长前缀下的注意力稀释问题原样存在——那是第 22 章长上下文一节的议题。

「分词」在这章只是传送带的第一站:字/子词(把词切成高频片段)粒度怎么切、为什么子词是主流, 书全部推迟到第 31 章(连同更细的切法一起讲),本章读者只需知道词元是离散编号。

11. 可带走的

  1. 自注意力只看内容,位置必须显式注入——Transformer 加位置编码不是点缀,是刚需;
  2. 位置编码三代:加进输入(正弦)→ 加进打分(ALiBi)→ 转进点积(RoPE);
  3. RoPE 的魔法是一条等式:qₜᵀkⱼ 只依赖 j−t,相对位置免费送;
  4. 一个块 = 交互(自注意力)+ 加工(逐位置 FFN)+ 稳定(残差+规范化),三个器官缺一不可;
  5. FFN 之于位置,如同 1×1 卷积之于通道——只做逐点非线性;
  6. 因果掩码 = 把未来分数设成 −∞,softmax 自动归零,训练并行、生成自回归两不误;
  7. 交叉注意力是编码器和解码器之间唯一的桥:查询问解码、键值答编码;
  8. 完整数据流五站:分词 → 嵌入+位置 → L 个块 → logits → 采样追加;
  9. 训练用教师强制一次并行算全句损失;推断是逐词元的循环;
  10. 三种范式不是三个模型,是一套骨架按信息流方向的三种剪裁。

12. 原文地图

主题原书章原文位置
位置缺失问题第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:440(搜「其权重只依赖」) · text/09-ch08-8-transformer.txt:448(搜「仅有自注意力还不足以区分」)
三代位置编码线第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:443(搜「从绝对位置编码发展到相对位置」)
绝对位置编码第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:454(搜「正弦—余弦位置编码」) · text/09-ch08-8-transformer.txt:483(搜「多尺度的位置表示」)
正弦的局限第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:484(搜「也存在一定局限性」) · text/09-ch08-8-transformer.txt:495(搜「长度外推能力」)
相对位置与 ALiBi第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:499(搜「两个位置之间相隔多远」) · text/09-ch08-8-transformer.txt:509(搜「线性偏置注意力(Attention」) · text/09-ch08-8-transformer.txt:511(搜「越远越不容易被关注」)
RoPE第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:516(搜「Rotary Position Embedding,RoPE」) · text/09-ch08-8-transformer.txt:532(搜「旋转角度可相加」) · text/09-ch08-8-transformer.txt:585(搜「注意力打分天然与相对位置」) · text/09-ch08-8-transformer.txt:586(搜「更容易融入缩放点积注意力」)
编码块第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:604(搜「编码器由多层相同结构的」) · text/09-ch08-8-transformer.txt:619(搜「四个模块:多头自注意力层」) · text/09-ch08-8-transformer.txt:633(搜「有助于缓解深度网络中的梯度消失」)
FFN 类 1×1 卷积第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:637(搜「类似于核大小为 1 的卷积」)
解码器三模块第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:648(搜「解码器以自回归方式生成」) · text/09-ch08-8-transformer.txt:653(搜「编码器-解码器注意力:」)
因果掩码第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:651(搜「因果掩码(Causal Mask」) · text/09-ch08-8-transformer.txt:672(搜「所有未来位置对应的概率都会变为零」)
填充掩码第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:700(搜「填充掩码(Padding Mask」)
数据流五站第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:710(搜「分词器(Tokenizer」) · text/09-ch08-8-transformer.txt:754(搜「教师强制(Teacher Forcing」) · text/09-ch08-8-transformer.txt:755(搜「贪心搜索、温度采样、Top-k 采样或核采」) · text/09-ch08-8-transformer.txt:757(搜「前缀 → 隐藏」)
三种范式第8章 注意力机制与Transformertext/09-ch08-8-transformer.txt:762(搜「仅编码器结构(Encoder-only」) · text/09-ch08-8-transformer.txt:766(搜「仅解码器结构(Decoder-only」) · text/09-ch08-8-transformer.txt:768(搜「编码器-解码器结构(Encoder-Decoder」) · text/09-ch08-8-transformer.txt:770(搜「只是在信息流方」)

Footnotes

  1. 出处:「第8章 注意力机制与Transformer」第 440 至 448 段 (text/09-ch08-8-transformer.txt:448,搜「仅有自注意力还不足以区分」)。

  2. 出处:「第8章 注意力机制与Transformer」第 443 段 (text/09-ch08-8-transformer.txt:443,搜「从绝对位置编码发展到相对位置」。 2

  3. 出处:「第8章 注意力机制与Transformer」第 450 至 452 段,式(8.25); 「词元嵌入 + 位置向量」的数据流版本见第 717 段(text/09-ch08-8-transformer.txt:717,搜「词元嵌入矩阵」。

  4. 出处:「第8章 注意力机制与Transformer」第 454 至 460 段(text/09-ch08-8-transformer.txt:454,搜「正弦—余弦位置编码」), 式(8.26)-(8.27);「相对距离可以通过线性变换来表示」见第 462 段 (text/09-ch08-8-transformer.txt:462,搜「正弦曲线,每个维度的正弦波」)。 2

  5. 出处:「第8章 注意力机制与Transformer」第 477 至 483 段(text/09-ch08-8-transformer.txt:483,搜「多尺度的位置表示」)。

  6. 出处:「第8章 注意力机制与Transformer」第 484 至 495 段(text/09-ch08-8-transformer.txt:495,搜「长度外推能力」), 四条局限依次为:周期重复、固定不自适应、静态对动态、外推不稳。 2

  7. 出处:「第8章 注意力机制与Transformer」第 499 至 509 段(text/09-ch08-8-transformer.txt:499,搜「两个位置之间相隔多远」; text/09-ch08-8-transformer.txt:509,搜「相对距离决定」), 式(8.28)[Press et al., 2022; Shaw et al., 2018]。

  8. 出处:「第8章 注意力机制与Transformer」第 509 至 513 段(text/09-ch08-8-transformer.txt:511,搜「越远越不容易被关注」)。

  9. 出处:「第8章 注意力机制与Transformer」第 516 至 532 段(text/09-ch08-8-transformer.txt:516,搜「Rotary Position Embedding,RoPE」)[Su et al., 2024], 旋转矩阵小知识(转置=反向旋转、角度可相加)与式(8.29)-(8.32)。

  10. 出处:「第8章 注意力机制与Transformer」第 585 段(text/09-ch08-8-transformer.txt:585,搜「注意力打分天然与相对位置」), 式(8.33)。 2

  11. 出处:「第8章 注意力机制与Transformer」第 586 段(text/09-ch08-8-transformer.txt:586,搜「更容易融入缩放点积注意力」)。

  12. 出处:「第8章 注意力机制与Transformer」第 604 至 622 段(text/09-ch08-8-transformer.txt:619,搜「四个模块:多头自注意力层」), 式(8.35)-(8.36)。

  13. 出处:「第8章 注意力机制与Transformer」第 630 至 634 段(text/09-ch08-8-transformer.txt:633,搜「有助于缓解深度网络中的梯度消失」)。

  14. 出处:「第8章 注意力机制与Transformer」第 615 段(text/09-ch08-8-transformer.txt:615,搜「典型Post-Norm写法」); Pre-Norm 与现代变体在第 8.6.1 节,本库拆解见第 22 章。 2

  15. 出处:「第8章 注意力机制与Transformer」第 636 至 640 段(text/09-ch08-8-transformer.txt:637,搜「类似于核大小为 1 的卷积」), 式(8.37)。 2

  16. 出处:「第8章 注意力机制与Transformer」第 646 至 660 段(text/09-ch08-8-transformer.txt:648,搜「解码器以自回归方式生成」)。

  17. 出处:「第8章 注意力机制与Transformer」第 653 至 656 段(text/09-ch08-8-transformer.txt:653,搜「编码器-解码器注意力:」), 式(8.40);查询来自解码器、键值来自编码器。

  18. 出处:「第8章 注意力机制与Transformer」第 662 至 672 段(text/09-ch08-8-transformer.txt:672,搜「所有未来位置对应的概率都会变为零」), 式(8.38)-(8.39),图 8.9。 2

  19. 出处:「第8章 注意力机制与Transformer」第 673 段(text/09-ch08-8-transformer.txt:673,搜「下三角区域表示允许访问的历史位置」)。

  20. 出处:「第8章 注意力机制与Transformer」第 700 段(text/09-ch08-8-transformer.txt:700,搜「填充掩码(Padding Mask」)。

  21. 出处:「第8章 注意力机制与Transformer」第 662 至 672 段(同 18); 训练并行性见第 752 至 756 段。

  22. 出处:「第8章 注意力机制与Transformer」第 704 至 740 段(text/09-ch08-8-transformer.txt:710,搜「分词器(Tokenizer」; text/09-ch08-8-transformer.txt:717,搜「词元嵌入矩阵」;text/09-ch08-8-transformer.txt:737,搜「𝑾𝑜」), 式(8.41)-(8.43)。

  23. 出处:「第8章 注意力机制与Transformer」第 748 至 756 段(text/09-ch08-8-transformer.txt:754,搜「教师强制(Teacher Forcing」), 式(8.44)。

  24. 出处:「第8章 注意力机制与Transformer」第 755 至 757 段(text/09-ch08-8-transformer.txt:755,搜「贪心搜索、温度采样、Top-k 采样或核采」; text/09-ch08-8-transformer.txt:757,搜「前缀 → 隐藏」)。 2

  25. 出处:「第8章 注意力机制与Transformer」第 760 至 770 段(text/09-ch08-8-transformer.txt:762,搜「仅编码器结构(Encoder-only」)。

  26. 出处:「第8章 注意力机制与Transformer」第 770 段(text/09-ch08-8-transformer.txt:770,搜「只是在信息流方」)。 2