从0训练LLM · 现代大模型体系 阅读+实验 ≈ 30 分钟 页内实验 ×1
C0 序章:为什么是 Transformer + 预测下一个词 第 4 课

只留注意力,行不行?

Transformer:删掉循环
2017 年的 Transformer 把循环整个删掉:所有位置一次矩阵乘并行算完,任意两个词之间一步可达。代价是一张 N×N 的分数矩阵——锚点模型的原生长度下,单头单层就要 128 GiB。

本课一问:只留注意力,行不行? 上一课的翻译模型里,注意力负责从原文任意位置取信息,RNN 负责一步一步地传状态。把 RNN 整个删掉,模型还能工作吗?

这一课先不碰:Q、K、V 为什么是三份、多头是什么(C3);没有循环以后怎么知道词序(C2);FFN、残差、归一化各自在做什么(C4);每层计算量谁更省的真实计数(C3 的岔路)。

从已有出发

贯穿例句的 5 个词「小明 把 苹果 给了 小王」,在 RNN + 注意力里要一个接一个编码:算「小王」的状态之前,必须先算完前面 4 个。这一课要让这 5 个位置同时算。

L3 的注意力让「取信息」不再依赖状态传递;但编码器仍要从 h1 算到 hT,每一步都要等上一步。流水线里的「解码层」,就是这一课删掉循环以后剩下的东西:

从已有出发 · 累计数据流 点已学环节看形状与参数
解码层

先自己设计:RNN + 注意力,取信息已经不靠状态了

  1. ① 朴素方案
  2. ② 它在哪失败
  3. ③ 改进方案
朴素方案RNN + 注意力:取信息靠注意力,状态仍逐步传递

编码器读到第 t 个词时,要先有 ht−1;这条依赖链贯穿整个序列,GPU 上成千上万个核心在这一维上只能排队。

层的类型最少串行操作最长路径
循环层O(n)O(n)

(出自 Vaswani et al. 2017 Table 1。)

这一层由什么组成。 原版 Transformer 的每一层是两个子层叠起来:多头自注意力(每个位置从所有位置取信息)和逐位置的前馈网络 FFN(每个位置各自做一次非线性加工),每个子层外面套一个残差连接和一个层归一化。因为注意力本身不看顺序,输入端还要加上位置编码。原文是翻译用的编码器-解码器;GPT 系列只用了解码器那一半(下一课)。

⚠

常见误解:「Transformer 发明了自注意力。」 原文 §2 自己列出了更早用自注意力做阅读理解、摘要、文本蕴含、句子表示的工作(例如 Cheng, Dong & Lapata 2016,arXiv 1601.06733)。它声称的新意是:第一个完全依靠自注意力、不用循环也不用卷积的序列转换模型 。注意力本身出自 L3 的 Bahdanau 2014。

改进:删掉循环,换来什么、付出什么

换来的两样东西都在 Table 1 里。 串行步数从 O(n) 变成 O(1):训练时整段序列在一次前向里算完,这是后来能把模型和数据一起放大几个数量级的前提。最长路径从 O(n) 变成 O(1):第 1 个词到第 n 个词之间不再隔着 n−1 次状态传递,L2 那种沿时间的梯度连乘没有了。

要付的账也在 Table 1 里:每层 O(n²·d)。 自注意力要给每一对位置打一个分,n 个位置就是 n×n 个分数。看一个头的打分,形状全部取自锚点 config:

一个头的打分:Q 乘 K 的转置
S = Q·KT / √dk
输出中间结果 渐变 = 分数(连续值)
边长按对数比例缩放,块边上的数字是真实值;同一维度符号的边在全图等长。
维度含义 真实规模 小规模
N 序列长度(token 数);真实规模取 131,072 131,072 6
dk 单头维度(锚点 head_dim) 256 4
d_k 在乘法里被收缩掉了:S 的大小只取决于 N,和 head_dim 无关。锚点模型每个全注意力层有 24 个这样的头。
⚠

常见误解:「N² 的开销来自 head_dim 太大。」 上图里 dk 在矩阵乘中被收缩掉了,分数矩阵是 N×N,与 head_dim 无关。head_dim 影响的是算这张表要多少次乘加(每个分数 dk 次),以及 Q、K、V 本身多大(随 N 线性)。

按 BF16(每个数 2 字节)算,锚点模型原生上下文 262,144 个 token 时,一个头、一层的分数矩阵就是 128 GiB;下面的计算器可以拖到任意长度。这笔账后来被两条路分别处理:不把整张表写出来(FlashAttention 分块计算,C9 兑现)——但 N² 次乘加省不掉;以及让大多数层根本没有这张表(锚点模型 64 层里只有 16 层是全注意力,另外 48 层是固定状态,见岔路 B1,C11 兑现)。

⚠

常见误解:「Transformer 是被证明出来的最优结构。」 没有这样的证明。原文用直觉(路径短、可并行)和数学性质(点积注意力一次矩阵乘就能算完)选了方向,再用翻译实验和消融(Table 3 里改头数、改维度、换位置编码)定下细节。注意力、多头、残差、归一化、后来的 RMSNorm、SwiGLU、RoPE、GQA,都是理论直觉、数学性质、工程经验和大量实验共同选出来的——这也是这门课每个结论都标证据等级的原因。

2026 年的现代做法。 主干仍是 Transformer,只是换了很多零件:只用解码器;LayerNorm 换成 RMSNorm 并挪到子层之前;FFN 换成 SwiGLU;位置编码换成 RoPE;K、V 头变少(GQA)。Qwen3 的技术报告把这组组合写得很明白(GQA、SwiGLU、RoPE、RMSNorm、pre-norm;arXiv 2505.09388 §2)。锚点 Qwen3.8 在此之上又把 3/4 的层换成了线性注意力。这些零件逐个在 C2-C4、C11 里被「逼出来」。

RNN 的串行到底有多慢? 本课只引用 Table 1 的量级。用锚点模型的维度把「循环层串行步数 vs 注意力一次矩阵乘」「每层计算量谁更省(交叉点在 n = d)」真算一遍,见 C3 的岔路课 为什么不用 RNN?。

极小真数字:拖动 N,看 N² 怎么吃掉显存

计算器 · 锚点 config 现算 N² 的账
双对数坐标:横轴 N 每格 ×2,纵轴每格 ×1024。 红 = 分数矩阵(1 头 1 层,斜率 2) 蓝 = K+V(1 个 KV 头 1 层,斜率 1) 灰 = 全部权重(与 N 无关)

🎯

试三件事: ① 点 131,072:一个头、一层的分数矩阵 32 GiB,比较一下「整个模型的权重」那张卡片。 ② 把 N 往右拖一格(×2):红色卡片 ×4,蓝色的 K+V 只 ×2——双对数图上一条斜率 2、一条斜率 1。 ③ 找图上的标注:N 到多少时,一个头一层的分数矩阵就和整个 27.8B 模型一样大。

🔍 为什么原文觉得 N² 不是问题 原文 §4 算过这笔账:自注意力每层 O(n²·d),循环层 O(n·d²),当序列长度 n 小于表示维度 d 时,自注意力反而更省——原文的判断是,这在当时机器翻译常用的句子表示里是大多数情况(模型维度 base 512、big 1024)。今天锚点模型的原生上下文是 262,144 个 token,远大于它的 hidden size 5,120,账就反过来了。这笔账用锚点维度算的精确版本在 C3 的岔路课里;本课的计算器只看「把分数矩阵写出来要多少显存」。

证据三问

问本课的回答(以 Transformer 为例)
① 它解决什么问题?RNN 必须沿序列串行,远距离要穿过很多步
② 数学上为什么可能有效?删掉循环后,每层几次矩阵乘覆盖所有位置对,串行步数与路径长度都是 O(1)
③ 实验上为什么被选中?翻译质量更好、训练时间短得多,后来在语言模型上同样如此;代价 N² 在 C9、C11、C13 里一次次回来

本课每条结论的证据等级:

结论证据等级依据
自注意力层串行 O(1)、路径 O(1);循环层 O(n)、O(n)可证明 Vaswani 2017 Table 1
分数矩阵 N×N,与 head_dim 无关可证明 形状计数
Transformer 翻译质量更好、训练更快实验验证 Vaswani 2017
具体的层结构(头数、维度、位置编码)是这样选的实验验证 Vaswani 2017 Table 3
Transformer 是最优结构没有证据对话样本 L1191 的讨论;本课误解

一句话

📌

Transformer 删掉了循环,换来整句并行和任意两词一步可达;代价是 N×N 的分数矩阵。

🚦

先停在这里:记住「并行 + 一步可达,代价 N×N」,进 L5。
再深一层:展开「为什么原文觉得 N² 不是问题」的 Dig,再去 C3 岔路 为什么不用 RNN? 看每层计算量的真实对比。

下一个缺口

原版 Transformer 是为翻译训练的:每一对「原文 → 译文」都要有人准备好。可网上绝大多数文字没有任何标注。没有标注,模型怎么学?学完了又怎么知道它学得好不好? → L5 · 没有标注怎么学

你可能会问

这一课还没有真实提问记录。先列几个最常见的: