阶段 3 · 处理序列

Transformer:把 RNN 删掉
之后剩下的东西

2017 年那篇论文的核心主张只有一句:既然注意力已经能让任意两个位置直接通信, 那循环还有什么用? 删掉 RNN 之后,训练快了好几倍—— 注意它不是算得少(第 11 节真算过,注意力比 RNN 多算约 8 倍),而是整句话的位置能一次算完, 模型反而更强。
上一章《注意力机制》把「Q·K 打分」算到了底;这一章是一整栋楼—— 一个 Block 里到底有什么、那三分之二的参数花在哪里、为什么它能堆到一百层。

1

整句话,塞进一个固定大小的口袋

再上一章(Seq2Seq)的最后,编码器要把整句话的每一个词 压缩成一个固定长度的向量,再交给解码器往外掏。 麻烦在于:这个口袋不会因为句子变长而变大。

下面这个互动真的跑了一遍 RNN 递推:让它把整句话读完,得到最后那一个状态; 然后回头量一件事——把第 1 个词的输入轻轻改一点,最后那个状态的输出会跟着变多少。 这个数就是影响力,和反向传播里的梯度是同一个东西。 注意力那半用「改一点、再算一遍」的差分量出来;RNN 那半按链式法则一路乘出来。

互动 · 跑一遍 RNN:句子读完了,前面的词还剩多少

🎯 类比

像一个被要求「用一句话复述全场会议」的记录员。只有三个人发言时,他记得清清楚楚; 开到第二十个发言人,他嘴里只剩下最后几句,前面的人只剩一个模糊的印象—— 不是他记性差,是「一句话」这个格式本身就装不下。

Transformer 的全部主张就是一句话:别再复述了,让每个词自己伸手去拿。 不需要中转的向量,也就没有那个固定大小的口袋——代价是所有词都要两两比较一遍。

2

每个词直接伸手去拿

每一个词,都去问所有词"你和我有多相关",然后按相关度把它们的信息加权平均到自己身上。

就这么一件事。而且因为所有词是同时互相问的,它可以在一次矩阵乘法里算完—— 这是它和 RNN 最本质的区别。把每个词当成一个点、人人都连着人人,这句话说的就是一张图; 注意力就是在这样的图上传话,图那边的名字叫 GAT(图注意力网络,图神经网络里负责「谁看谁」的那一层)。

RNN 的做法 第 5 个词想知道第 1 个词说了什么,必须等消息从第 1 个传到第 5 个——传 4 次
Transformer 的做法 第 5 个词直接伸手去问第 1 个词,中间没有任何中转——一步到位

路径长度从 O(n) 变成 O(1)。这就是为什么长距离依赖不再是个问题, 也是为什么能并行——没有谁需要等谁。

换个角度看一眼:把它和它的两个前辈写成并排的三行公式,差别会立刻显出来—— 它们解决的是同一个问题,只是 f 的输入不一样。

互动 · 三种写法,同一个问题:谁能一步看到谁

3

从上一章借来的三个零件

注意力这一步怎么算,上一章 《注意力机制》从头推过一遍。 这一章只借它的三个零件,用同一个类比:拿着问题去图书馆借书。

角色是什么图书馆里对应
Query(查询)当前这个词,想知道什么 你拎进图书馆的那个问题
Key(键)每个词能提供什么 每本书书脊上的标签——用来和问题比对
Value(值)每个词的实际内容 书里的内容——比对上之后,真正借回家的东西
Q = X · WQ  K = X · WK  V = X · WV

三个都是同一个输入 X 乘上三个不同的权重矩阵得到。 换句话说:Q、K、V 不是三种不同的东西,而是同一份信息被投影到了三个不同的"视角"里。 这三个矩阵是训练出来的。

这一章关心的是这栋楼怎么搭起来,所以缩放点积、√dk、多头怎么切、掩码怎么加,都只点到为止; 推导在《注意力机制》里。这一章只借它一步:拿每个词的提问(Q)去和所有词的键(K)打分, 把分数变成权重,再用权重去取所有词的值(V)。公式在数学那节一次给全。

为什么非得是三组投影、不是一组:「我要找什么」和「我有什么」是两件事, 《注意力机制》第 9 节第 2 步把三条理由摆全了。

「相关」这两个字太含糊。注意力真正算的是一个可以量出来的数: 两个向量的点积。下面把 512 维压到 2 维,让它看得见。

互动 · 点积 = 对齐程度:把「相关」变成一个数

拖 k₁ 的箭头,让它绕原点转一圈

4

点任一块,看那一步的真实数字

一句话能说清的机制,搭起来其实有 8 个工位。下面是完整的流程图—— 每一块都能点,点下去下面的面板会展开那一步真正的计算: 不是示意,是这一章当场用一个小模型(4 个词 × 8 维)跑出来的数字。

先交代清楚它和真模型的关系:这里的权重是手写的小权重,没训练过, 所以最后吐出来的概率是随机的。但形状、步骤、先后顺序和 GPT 一模一样, 只是每个数字小了几十倍——把 8 换成 512、6 换成 96,就是今天用的模型。

互动 · 整栋楼的地图:点任一模块,看那一步的真实数字

1

「总览 + 点进去看细节」这个做法学自 Transformer Explainer——佐治亚理工 Polo Club 做的一个在浏览器里可视化 Transformer 的网页。 它要在浏览器里加载真实的 GPT-2 权重(好几百 MB),这一章用的是手写的小权重——双击打开、断网也能跑。

💡 先把账算清楚:形状一直没变

从头到尾,数据的形状都是 [4 × 8]—— 只有中间那两张注意力矩阵是 [4 × 4],而且算完这一步就不再需要、直接丢掉。
这就是为什么 Block 能一层一层往上叠:它的入口和出口一样大 (像一根水管,而不是一个漏斗)。唯一“变形状”的地方是最后那一步: 从 8 维变成“词典里每个词一个分数”。

5

逐步走一遍

下面用的是 4 个词、8 维的迷你 Transformer。点「下一步」跟着走一遍, 会依次做点积、缩放、softmax、加权求和。

互动 · 完整数据流逐步拆解

6

两个不起眼、却不能省的细节

细节做什么不做会怎样
除以 √dk 点积之后除以 √dk(dk 是每个头的维度) 维度一大,点积的方差就大,softmax 会变成"只有一个位置是 1,其他全 0"—— 梯度消失,训练不动
因果掩码 Causal Mask 生成模型里把上三角的位置设成 −∞,softmax 之后那些位置的 α 就是 0 模型会偷看后面的答案。训练时损失很低,一生成就露出马脚

互动 · 掩码前后的注意力矩阵

没有掩码:每个词都能看到全部

加了因果掩码:只能看自己和左边

7

为什么要同时开 8 个头

一个注意力头只能学出一种关注模式。但语言里的关系有很多种: 主谓一致、指代消解、修饰关系、位置邻近……

多头注意力的做法是:把 dmodel 维切成 8 份,每份独立做一次注意力, 最后拼回去再投影一次。

dmodel = 512,heads = 8 → 每个头的维度 dk = 64
总计算量和单头 512 维几乎一样,但表达能力强得多

「512 维」对人是没有直觉的,「4 个格子」有。下面是一位写图解博客的工程师 Jay Alammar 那套画法(他的《The Illustrated Transformer》在章末拓展阅读里): 用格子的数量来代表维度。换头数时,下面四行数字全部当场重算。

互动 · 用「格子的数量」编码维度(示意,非按比例)

🎯 类比

像一个 8 人的评审团。每个人只负责盯着一个方面—— A 看语法关系,B 看代词指代,C 看情感倾向……最后把 8 份意见拼起来。 如果只让一个人看全部 512 维,他反而什么都看不过来。

一个反直觉的发现 后来的研究(如 Are Sixteen Heads Really Better than One?)发现: 推理时可以把大部分注意力头剪掉,性能几乎不掉。 这说明多头里存在大量冗余——但训练时它们确实各自学到了不同的东西, 只是最后可以被压缩掉(前面「A 看语法、B 看指代」是事后观察到的典型,不是谁事先指定的)。 这也是为什么会有 GQA(分组查询注意力)和 MQA(多查询注意力) 这种「几个头共享同一份 K、V」的优化:要存的量小一截,效果几乎不变(见阶段 6)。

8

完整的一个 Block

自注意力只是半个 Block。完整结构是这样:

x ← LayerNorm( x + MultiHeadAttn(x) )  ← 注意力子层
x ← LayerNorm( x + FFN(x) )    ← 前馈子层

FFN(x) = max(0, W₁ · x + b₁) · W₂ + b₂,中间维度通常是 4×d_model

上面写的是 2017 原论文的版本:归一化放在残差之后(Post-Norm),激活用 ReLU。

后来的 BERT(Google 的双向编码器)、GPT-2(OpenAI 的解码器)把激活换成了 GELU, LLaMA(Meta 的开源大模型)又换成了 SwiGLU(两个都是激活函数,《激活函数》那章讲过); 而从 GPT-2 起,归一化挪到了子层之前 (Pre-Norm:x ← x + F(LayerNorm(x)),见阶段 1 的归一化层与初始化)。

部件作用参数量(d=512, 8 头, FFN 4×)
注意力 QKV + 输出投影让词之间互相通信4 × 512 × 512 ≈ 105 万
前馈层 FFN真正"存储知识"的地方 2 × 512 × 2048 ≈ 210 万
LayerNorm × 2稳定数值约 2000(可以忽略)
合计一个 Block约 315 万

版本在变,但「FFN 是重量级、占三分之二参数」这个结论不变。

💡 两个常见误解

① 注意力不"存储"知识。它只负责让信息在位置之间流动。 真正记住"巴黎是法国首都"这类事实的,是前馈层——它占了参数的大头。
② 直觉上以为"注意力是主体",其实 FFN 才是重量级。 这也是为什么后来的 MoE 改造(阶段 5)主要就是把 FFN 换成多个专家。

9

三分之二的参数在 FFN 里干什么

注意力只负责一件事:让信息流动。可是流动本身不产生知识。 上面那张参数表已经告了一个状:大头在 FFN。那它在算什么?

它是两层的小 MLP,而且每个词各算各的—— 同一句话里的词在这一步完全不交流。注意力管“互相看”,FFN 管“各自想”。

为什么中间要宽 4 倍 中间不宽、激活又是线性的,两层矩阵乘起来就是一个矩阵,整个 Block 退化成一层—— 变宽是给非线性留出操作空间。

4 倍也不是神圣的:普通 FFN 两张表(d×4d、4d×d)一共 8d² 个参数; SwiGLU 要三张 d×h 的表,想让总数不变就解 3dh = 8d²,得 h = 8d/3 ≈ 2.67d。 真正重要的是「变宽再压回」这个形状。

互动 · 中间宽度一变,参数账单就重算一遍

🎯 类比

把注意力想成一个会议室:大家互相对看一下,把相关信息交换一圈。 但开完会还得有人回工位干活——把交换来的信息变成自己的理解。 FFN 就是那个回工位的环节。它占了人手的大头。

为什么说它“存知识” 把 FFN 的中间那一层看成一部查手册的机器: 前半段(W₁)在问“当前这个词像不像我要找的那个开头”, 后半段(W₂)把匹配上的内容抬出来。

“巴黎 —— 法国”这类事实就是在这一层被记下的:只要前面出现这组匹配,对应的那一行就被抬起来 (研究者在训练好的模型里找到的现象,Geva et al. 2021,见章末论文卡; 本页这几个互动演示不了它——它们用的是没训练过的小权重)。

这也是为什么后来的 MoE 一定是对 FFN 下手:要变的就是大头那块。

10

残差和归一化,缺一不可

原始论文把它们写成两行工程细节,但这是整栋楼能堆起来的真正原因: 没有它俩,梯度在回传路上越乘越小,层数一多就传不回前面的层。 下面量的是「信号和梯度能传多远」,不是训练结果——但它和「48 层能不能训起来」量的是同一件事。

下面这个互动把一个 4 维的小网络叠了 L 层(用 4 维而不是 2 维: 维度太低时 LayerNorm 会退化成常数,看不出差别), 再把梯度一层层乘回去,当场量出两种现象: 没有残差,信号和梯度会一起消失;没有归一化,信号量级会跑飞。

互动 · 叠 48 层:激活和梯度各会变成什么样

左边:信号的量级(越大越“爆”,越小越“消”)

右边:梯度的大小(对数刻度,注意 1e−19 这种数字)

两者分工很干净:残差连接负责“别丢”,归一化负责“别涨”。 残差把入口原样接回出口,于是信号和梯度都有一条标清通道, 里面的乘数恒等于 1;LayerNorm 把每个词自己的数值拉到均值 0、标准差 1, 不然残差那条加法会一层层把量级累加上去。

对比Post-Norm(2017 原版)Pre-Norm(GPT-2 之后)
写法 x ← LN(x + F(x)) x ← x + F(LN(x))
残差通道上有几道关卡 直通路也要穿过 LN:梯度每层被它的导数乘一次,层一多就稀释 直通路只有加法:LN 挪到了支路上,梯度不用过它的导数
训练 必须开 warmup(先拿很小的学习率热机),否则容易炸 不需要 warmup,能一直堆到上百层
今天谁用原版 Transformer GPT / LLaMA / 几乎所有现代模型
⚠️ LayerNorm 里一个容易被忽略的点

它是对每个词自己那 8 个数算均值方差,不是对一整句话算。 两个后果:
① 它不会泄露别的位置的信息——所以才能安全地插在注意力前后;
② 推理时可以逐个算,不需要等整句话。换成一跨位置的归一化(BatchNorm), 这两条全都不成立——这也是 Transformer 里不用 BatchNorm 的原因(见 《归一化层》)。

M

数学 · 一个词的输出,是所有词的加权平均

前面十节把整栋楼拆完了。楼里最核心的那一步,注意力子层,合起来其实只有一条公式—— 而它画出来就是一句话:拿你的提问去和每个词的键打分,把分数变成权重, 再用权重把每个词的内容拌在一起。

下面这六张图把这条公式里的每一个符号都画出来,数字全是当场算的: 一个 5 个词、每词 2 维的小注意力(为了能把 Q、K 画成平面上的箭头)。

核心大图 · 一条公式的三个动作:打分 → 分配 → 拌在一起

互动 · 为什么要除以 √dk:每档采样 4000 次算给你看

互动 · softmax 到底做了什么:分数 → 权重

互动 · 不加位置编码会怎样:把词序打乱,输出一模一样

互动 · 8 个头各自在看什么(跑 8 组 softmax)

这一节只有一句话要记住 注意力不是一个「查找」,是一个「加权平均」。 它的输出永远落在所有 V 围出来的那片区域里——不会跑到外面去。
这也顺带解释了第 7 节那个发现:头可以剪掉——因为每个头都只是在做一次混合, 少做几次混合不至于把东西搅坏;而被拿掉的权重,softmax 会自动分回给别的词。

11

先验最弱的那个,为什么赢了

这一节回答一个比“它怎么算”更重要的问题:2017 年之后,为什么几乎所有架构都变成了它? 答案不是“注意力更聪明”,而是它把自己的先验几乎全部拿掉了—— 下面这份先验(也叫归纳偏置,inductive bias)对照表就是全部理由。

问题RNN / LSTMCNNTransformer
它假设世界是什么样 顺序很重要,而且信息可以靠“一个状态”传下去 局部性:附近更相关;平移不变:同一个模式出现在哪都一样 几乎什么都不假设——只假设“任意两处都可能相关”
用生活比喻传话游戏,一个人接一个人 一枚印章盖满整张纸,同一个花纹反复用 全员会议室,每个人直接问每个人
看到全句要几步 n 步(必须一步一步来) 约 n/2 层(每层只看 3 个邻居) 1 层
先验强度强强最弱
需要多少数据 少也能学(先验在帮它猜)图像上很省 很吃数据——先验弱就得拿数据补
天花板低中高

上表里「看到全句要几步」那一行的“约 n/2 层”、“1 层”不是估计值。下面把它们算出来—— 同一个序列长度、同一个宽度 d = 512, 三种写法各要多少乘加、各要多少步串行。

互动 · 算一遍:看完全句,三种架构各要付多少钱

一句话解释这张图 来历:注意力一层约 2n²d 次乘加,RNN 约 n·d² 次, 两者相除就是 2n/d——所以 n 超过 d/2 时注意力更贵; 句子短时反过来(本页 n=128、d=512 时它只有 RNN 的 0.5 倍)。
但它在另一个维度上彻底赢了:串行步数从 n 变成 1。 GPU 上有几万条并行通道,串行 n 步意味着这几万条通道里的绝大部分时间在发呆—— 在一个“算力便宜、串行昂贵”的时代,“多算几十倍”比“慢慢等 n 步”便宜得多。

⚖️ 但先验不会真的消失(没有免费午餐)

既然 Transformer 几乎不作假设,它学东西就比 CNN/RNN 费力得多—— ViT 在 130 万张图上直接训打不过 ResNet,换到 1400 万张、再到 3 亿张才反超。 把先验从结构里拿掉不代表不用付出,只是把账单从“模型设计”转移到了“数据和算力”。 所以文本上 2018 年(BERT)就赢了,图像上要等到 2020 年(ViT):凑够那么多数据,晚了两年。

12

一张掩码,分出三种模型

很多人分不清 BERT 和 GPT 到底差在哪。真实情况是: 它们用的是同一套零件,区别只在“谁能看谁”——也就是那张掩码矩阵。 三个选项,就是三种拓扑(谁跟谁连着)。

互动 · 同一批分数,三种掩码:重跑一遍 softmax

拓扑 · 代表谁能看到谁学什么(预训练目标)擅长 / 不擅长
encoder-only
只编码
BERT · RoBERTa
双向:每个位置都能看两边 掩码填空(挖掉一个词让它猜) ✅ 理解:分类、抽取、检索、向量嵌入
❌ 生成(它的训练方式里没有“下一个词”)
decoder-only
只解码
GPT · LLaMA · 几乎所有今天的对话模型
因果:只能看自己和左边 预测下一个词 ✅ 生成;而且“只猜下一个词”这一个目标居然带出了通用能力
❌ 双向理解略弱(看不到右边)
encoder-decoder
两头都要
原版 Transformer · T5(Google 的编码器-解码器)· Whisper(OpenAI 的语音模型)
编码器双向,解码器因果,中间再加一层交叉注意力 填空 + 生成 ✅ 输入和输出都很长且不是同一种东西(翻译、语音转写)
❌ 参数利用率低(两套堆叠各干一半活)

一个很容易搞反的点 掩码矩阵里那个叉叉不是“被删掉的数据”,而是 softmax 之后的 0。 它没有把后面的词从序列里拿掉,而是把那些位置的权重抬到零—— 信息还在那里,只是拿不到发言权。

encoder-only 像做完形填空试卷:空在前面还是后面都一样,两边都能看。
decoder-only 像接力默写:只能看已经写下的部分,不能偷看后面。
encoder-decoder 像同声传译:一边听完整句(双向),一边一个词一个词地往外说(因果), 中间不停地回头对照原文(交叉注意力)。

这个分类不是三个不同的发明,而是同一堆零件换一行代码。 而且它早就跳出了语言:ViT 把图片切成方块当词、用 encoder-only; DiT(把扩散模型的主干换成 Transformer)是 2026 年图像生成的主力; Mamba 则把中间的注意力层换成了别的,外面的残差 + 归一化骨架照搬。

13

训练一次算完,生成只能一步步来

同一个模型,训练时和生成时干的事情差很多。这里先把两个概念分开: 训练时整句话已经摆在桌上(所以能一次算完);生成时 上下文窗口 是一个一个长出来的,每长一个都要把前面重新看一遍。 这一节是把后面那章(KV Cache)的地基先打好, 因为后面所有推理优化都是从这里出发的。

互动 · 同一句话,训练一次算完;生成只能一步接一步

👆 先悬停,再按那个按钮

把鼠标移到下面这行公式里的 n 上——上面那个「序列长度 n」按钮组会亮起来。
然后把 n 从 512 一路切到 8192,看 2n²d 那一项涨得多快。 里面那个 n² 就是注意力的平方墙。

互动 · 为什么推理会变成“搬数据的比赛”:KV cache 算一下

对比训练推理(生成)
一次前向处理多少位置 全部 n 个(并行度 = n) 只算 1 个新位置(并行度 = 1),但历史长度不断增加
能不能并行 能。因为答案已经在手上,因果掩码保证了它不会偷看 不能。第 k 个词必须等第 k−1 个词出来
总乘加次数 L·(2n²d + 12nd²) 几乎一样——区别不在“多少计算”,而在“能不能同时算”
卡在哪里 算力(n 个位置一起算,都是大矩阵乘,GPU 的乘加单元吃得满;显存主要被激活占着) 显存带宽(每生成一个词就把整个 KV cache 读一遍)
最贵的动作 存激活(见反向传播那个显存账单) 把几 GB 的 KV 从显存搬到计算单元
14

它换来了什么,付出了什么

维度RNN / LSTMTransformer什么时候真的会痛 → 换什么
并行不能,严格串行完全并行,一次矩阵乘法算完所有位置 要逐词生成的推理阶段(见第 13 节)→ 推理优化,让每一步少搬数据
路径长度O(n),要穿过 n 个时间步O(1),任意两个位置一步直达 长距离依赖任务(长文档、代码)→ 正是它赢的地方
计算复杂度O(n · d²),和序列长度线性相关 O(n² · d),序列翻倍计算量变四倍 序列很长(几万 token)→ 高效注意力 / 滑窗 / Mamba
显存只要存状态,O(1) 要存注意力矩阵和 KV cache,长序列是大问题 长上下文推理 → KV cache 量化、GQA / MQA、PagedAttention
词序信息结构自带(按顺序读) 完全没有,必须额外加位置编码(下一章) 要支持更长上下文 → 换成 RoPE 这类位置编码(下一章)
可解释性差注意力权重能画出来,但权重高 ≠ 原因(见 《注意力机制》代价那一节) 想拿注意力权重当解释 → 别这么做,换探针、消融那类工具
⚠️ O(n²) 是它最出名的硬伤

这句话要记住,因为阶段 6 和阶段 8 的整个故事都在解决它: 高效注意力(FlashAttention / 线性注意力 / GQA、MQA / MLA——MLA 是 DeepSeek 的多头潜在注意力,把 KV 压到很低维)、 状态空间模型(Mamba)、滑窗注意力——全都是为了把这个 n² 压下去。

15

这栋楼后来被改成了什么

上面讲的是一栋完好的 2017 版大楼。但到了 2026 年,它的四块墙都被人动过了。 这里只给出四个你需要知道的节点,每一条都指向它自己的一章。

节点一句话为什么它重要去哪看
① 推理时代
DeepSeek-R1-Zero(2025)
不用人类写推理过程,靠强化学习加一个能自动判对错的奖励信号(后面 《RLVR 与 GRPO》那章会讲),模型自己长出了推理能力 2025 年的头号范式转移:“对齐”从“让模型听话”变成了“让模型学会想” RLVR
测试时计算
② 架构裂变
2026 一条热门路线
越来越多的模型不再是纯 Transformer,而是 attention + SSM 混搭(如 Mamba-3 的混合配置) 纯 attention 的 O(n²) 和纯 SSM 的记忆短板互相补——本章第 14 节那张代价表就是这套混搭的动机 Mamba
线性注意力
③ MoE 成为标配 它从“一种可选架构”变成了大模型的默认架构(一个输入只动用一小部分专家) 回看第 9 节:MoE 改的就是 FFN 那块——“只激活一部分”正是因为大头在那里 MoE
④ 混合精度与并行 同一栋楼现在要横着切到上千张卡上跑,还要降到 bf16 / fp8(每参数 2 字节 / 1 字节) 训练与推理的账(暗线 C/D)已经变成了工程的主要矛盾 分布式训练
显存账本

再往前一步是让 AI 改进 AI:目前实际系统大多还停在「人指定怎么改」的第一级, 见 《递归自我改进》。

16

小结

这一章站在 ② 没有免费午餐 这条线上:Transformer 把先验调到了最弱,天花板最高,账单也最大。

它对应哪条线 ② 没有免费午餐 → 必须有先验(归纳偏置)—— Transformer 是“把先验调到最弱”的那个极端选择。先验不会消失,只会被转移:少掉的那部分,要用数据和算力补回来。
一句话 RNN 假设「顺序传下去」,CNN 假设「邻居更相关」;Transformer 只假设「任意两个位置都可能相关」, 换来最高的天花板,拿掉的先验只能用数据和算力补回来。
它牺牲了什么 牺牲了便宜。每一对位置都要算一次分数(O(n²) 计算、O(n²) 显存)、 位置信息要自己加、同样的效果要更多数据(回扣暗线 B)。 先验不会消失,它只是从模型结构转移到了账单上。
🎬 自己验一遍

回到第 11 节那个互动,把序列长度拉到 8192。看那三行串行步数。
你会看到:RNN 的乘加最少,但串行 8192 步;卷积要多算很多倍,还得串行 4096 层; 注意力只串行 1 步。“串行深度”才是这张图真正在比的东西——它就是“先验换天花板”这句话的可测量版本。

它在暗线里站在哪

暗线这一章的回答
A 信息流动 形状(d = 512):[n×d] → Q/K/V 还是 [n×d] → 分数 [n×n] → 权重 [n×n] → 输出 [n×d]。 整栋楼从头到尾都停在 [n×d],只有两张注意力矩阵是 [n×n](第 4 节总览第 ③ 步那张图); 最后一步才把它们换成 [词典大小]。 形状不变 = 可以无限叠层。
B 什么被牺牲了 三样:注意力矩阵的显存、被拿掉的先验、推理时缓存的 KV。 训练时每层要存下 [B×H×n×n] 的注意力矩阵(B = 一批几句话,H = 头数;第 14 节的 O(n²)); 先验被拿掉,模型只能拿数据补(第 11 节);推理为了省重算要缓存 KV,于是吃显存(第 13 节)
C 参数账本 一个 Block(d=512, 8 头, FFN 4×)= 314.8 万参数: 注意力 104.9 万 + FFN 209.7 万 + LN 0.2 万。 关键比例:FFN 的参数量正好是注意力的两倍—— 而且这个比例与 d 无关(两边都是 O(d²)),只由中间倍率决定(第 9 节)
D 跑在什么上 两张账(第 13 节那张表):训练一次把 n 个位置全算完;推理只能一个字一个字来, 每生成一个词就要把整个 KV cache 搬一遍——n=4096 时单个请求就是 2.0 GB。 最贵的动作是“搬数据”,不是“算数”。
E 它假设了什么 假设“任意两个位置都可能相关”。 代价很具体:它不知道“近的比远的重要”(要靠位置编码补)、不知道“图像里相邻像素更相关”(所以 ViT 需要更多数据)、 也不知道“顺序”(所以需要位置编码,今天多用 RoPE)。每个假设拿掉一项,就多一项要靠数据学。
F 违背了哪个直觉 直觉说“参数多的地方就该是主角”,结果是错的方向反了——参数多的地方(FFN)恰好是“逐词独立”的那一层。 真正实现“互相沟通”的注意力反而只占 1/3。另外一个: 注意力主要负责搬运;到了 MoE 时代,被拆开复制的依然是 FFN
🎯 前后钩子

它接住了前两章的什么:Seq2Seq 把注意力当“一个补丁”贴在 RNN 上, 《注意力机制》把这个补丁算清楚了。这一章回答:既然它这么好用,能不能把 RNN 直接删掉。
它给下一章留了什么:整栋楼里唯一没讲的一块拼图是“位置信息从哪来”—— 注意力自己看不见顺序,本章只用了最原始的正弦/余弦。 下一章《位置编码与长上下文》会告诉你为什么今天大家用的都是另一种东西(RoPE)。

一句话带走 Transformer

把「循环」删掉,只留「注意力」:每个词问所有词「你和我有多相关」,再按相关度加权平均它们的信息。
一个 Block = 注意力 + FFN,各套残差和 LayerNorm;真正「存知识」的是 FFN,它占了参数的大头。
所以呢:它赢不是因为它更聪明,而是把先验几乎全拿掉了——天花板最高,但只有数据和算力充足的人才付得起; 那个 n² 和「推理只能一步一步」,就是后面几章要解决的问题。

17

拓展阅读

上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。

📄 这一章的说法从哪来

💻 工业界怎么写

∑ 更严格的形式