为什么不用 RNN?
本课一问:为什么不用 RNN?
这是挂在第 7 课旁边的岔路。这一课先不碰:RNN 的梯度为什么会消失(见 C0 第 2 课);「固定大小的状态」为什么在 2026 年又回来了(C0 岔路,C11 细讲)。
从已有出发
第 2 课里,全部 T × T 个配对一次矩阵乘就算完;第 4 课里,因果掩码让训练时整句一次前向。这两件事合起来,就是注意力相对于它的前任——循环神经网络(RNN)——最大的不同。
先自己设计:一个接一个地读
RNN 的做法很自然:从左到右读,手里拿着一个隐藏状态 h,每读一个 token 就更新一次:ht = tanh(Wh·ht−1 + Wx·xt)。读到「给了」时,h 里应该已经装着「小明」「苹果」的信息。
- ① 朴素方案
- ② 它在哪失败
- ③ 改进方案
RNN 的计算天然是一条链:第 t 步依赖第 t−1 步。训练时整句都在手上,也只能沿着这条链一步一步走;GPU 上几千个核心,每一步能并行的只有这一步里的矩阵向量乘。信息从第 1 个位置走到第 T 个位置,要穿过 T−1 次 tanh 与矩阵乘——C0 讲过连乘为什么会让信号和梯度一起衰减。
注意力里,位置 i 直接和位置 j 打分,中间不经过任何别的位置:串行步数 1、最长路径 1,与序列长度无关。整句的全部配对是一次矩阵乘,GPU 可以一口气算完——这是 Transformer 能用海量数据训练、扩到极大规模的前提。
| RNN | 自注意力 |
|---|
试三件事:① 在动画里只点「下一步」,数一数 RNN 走到「小王」要几步,注意力要几步;② 在计数面板把 T 拖到 4,096、d 选锚点 5,120,看两边每层的计算量谁大;③ 再把 T 拖过 5,120,看比值怎么翻转——注意力省的是串行步数,不是计算量。
改进的代价:N² 回来了
原文把三种层并排比较:每层计算量、最少串行操作数、任意两个位置之间的最长路径 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条复杂度计数:自注意力 O(n²·d)、串行 O(1)、路径 O(1);循环层 O(n·d²)、O(n)、O(n) 出处Vaswani et al. 2017 表 1 ↗ :
| 层 | 每层计算量 | 最少串行步数 | 最长路径 |
|---|---|---|---|
| 自注意力 | O(T²·d) | O(1) | O(1) |
| 循环层(RNN) | O(T·d²) | O(T) | O(T) |
注意第一列:注意力的计算量里有 T²。当 T 小于 d 时它比 RNN 省;T 超过 d 之后反而更贵。锚点 Qwen3.8 的 d = 5,120,原生上下文是 262,144 个 token——长上下文时注意力的 T² 正是最贵的部分。所以 Transformer 用计算量换来了并行和短路径;这笔交易在训练时非常划算(原文:翻译任务上训练明显更快 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条原文:can be trained significantly faster than architectures based on recurrent or convolutional layers;英德、英法翻译 出处Vaswani et al. 2017 §7 ↗ ),到了超长上下文和生成阶段,账就得重算:第 8 课的 KV cache、C11 的线性注意力与稀疏注意力都是在还这笔账。锚点 64 层里有 48 层不是本章这种注意力,也是这个原因——C11 揭晓。
⚠ 常见误解
「注意力在各方面都比 RNN 高效。」不是。它省的是串行步数和信息传递的路径长度;每层的计算量是 T²·d,序列长过模型宽度之后比 RNN 还多。生成时它还要为每个 token 存 K、V(第 8 课),RNN 只需要一个固定大小的 h。
注意力的演进,你在这里
① 训练时:一个 token 怎么从别的 token 那里取信息
- 解决了能读任意长的序列,参数与长度无关;手里只带一个固定大小的状态 h。卡在ht 要等 ht−1 算完:T = 4,096 时每层 4,096 步不能并行,第 1 个 token 的信息要经过 4,095 次更新才到最后;翻译时整句还得挤进一个定长向量——Bahdanau 2014 说的瓶颈。展开岔路 B1
- 解决了解码器每一步回头给源句的每个位置打分、加权取回,不再只靠那一个定长向量:score = vT·tanh(W1q + W2k)。卡在每一对都要单独过 tanh,交不给矩阵乘单元;朴素实现要先落一个 T×T×da 的中间张量:T = 4,096、da = 256 时单头单层 8.0 GiB(BF16),点积只留 T×T 个分数,32 MiB。它还长在 RNN 翻译模型里,串行没解决。展开第 2 课
- 解决了直接比 embedding 时「给了」最像的是它自己(余弦 1.000),小明、苹果、小王排在最后;投影成 Q、K 再点积,它自己排到最后、前三名是苹果、小王、小明,全部配对一次矩阵乘 QKT;取回用单独的 V——两个人名的 K 余弦 0.995,取回 K 分不清是谁。卡在不缩放:锚点每头 256 维,点积标准差 √256 = 16,同一行分差十几二十是常态(e20 ≈ 4.9 亿),softmax 几乎独占,梯度传不回 WQ、WK。
- 解决了softmax 把分数变成正的、和为 1 的权重,只看分差(按占比分,对话样本的 10、3、−4 会给「汽车」−44.4%);除以 √dk = 16,点积方差回到 1。卡在训练时整句一次喂进去:不加掩码,「给了」一行有 32.5% 的注意力直接落在它要预测的答案「小王」上,loss 低得虚假。展开第 3 课
- 解决了旋转后 q·k 只依赖距离 j − i;V 不参与打分,不转(转了会把绝对位置混进取回的内容)。锚点每头 256 维里只转 64 维。卡在旋转矩阵随位置变,夹在展开矩阵和缓存之间就没法事先并进 Q:MLA 因此把 RoPE 单独拆出 64 维另存(DeepSeek-V2 config,第 10 课)。
- 解决了标准 softmax 逼每行分完 100%:「苹果」一行 3 个分数只差零点几(0.04、0.36、0.00),照样分成 30% / 41% / 29%;分母加可学习的 sink logit,或在输出上乘门,这个头就能「这次不取」——锚点开着输出门(attn_output_gate = true)。卡在出口的效果只有实验证据:Gated Attention 原文说门控「缓解」sink,不是消除;DeepSeek-V4 没给 sink logit 的单独消融。展开岔路 B4
② 生成时:K、V 怎么越存越少
- 解决了缓存直接除以头数:锚点形状下每 token 16 KiB,262,144 上下文 4 GiB。卡在质量会掉、训练可能不稳:GQA 论文表 1(T5-XXL,七个任务平均)MHA 47.2 → MQA 46.6。展开第 9 课
- 解决了24 个 Q 头分 4 组、每组 6 个共用 1 个 KV 头(组数 = KV 头数):每 token 64 KiB、262,144 上下文 16 GiB;T5-XXL 上 GQA-8 平均 47.1、推理 0.28 s,质量接近 MHA(47.2、1.51 s),速度接近 MQA(0.24 s)。卡在再减 KV 头就回到 MQA:DeepSeek LLM 67B 已是 GQA-8,每 token 仍要 389,120 B(每头一份的 MHA 是 3,112,960 B),1M token 单条请求 380 GiB。展开第 9 课
- 解决了不存 K、V,每层每 token 只存 512 维潜向量 + 64 维 RoPE = 576 个数,用时再展开:DeepSeek-V2(60 层)每 token 69,120 B、V3(61 层)70,272 B;相对 67B 按 BF16 降 82.2%,官方「−93.3%」还含约 6 bit 的 KV 量化。卡在仍随长度线性增长,打分仍是 T²:GLM-5.3 同是 576 个数、78 层,每 token 89,856 B,原生 1,048,576 上下文时单条请求只算潜向量就要 87.75 GiB。展开第 10 课
- 解决了换掉「按长度存」本身:锚点 64 层里 48 层不存 KV,只存固定大小的状态(FP32 共 144 MiB),与上下文长度无关(这些层是什么、怎么更新,C11 第 4 课揭晓);DeepSeek-V4.1 叠加压缩、稀疏与低精度,官方报告全局 KV 890 B/token。卡在固定状态装不下任意多对键值,锚点仍留 16 层全注意力;稀疏注意力每步只读挑出来的一部分,挑本身也有代价——各自省了什么、没省什么,C11 讲。
证据三问
- 它解决什么问题?把「必须按顺序算」的链条拆掉,让训练时整句并行;任意两个位置之间一步可达。
- 数学上为什么可能有效?串行步数与路径长度的差别是计数,可证明 证据等级 · 数学可证明 在写明的前提下可以严格推导出来,不依赖实验。只要前提成立,换数据、换规模仍然成立。 本条表 1 出处待补 ;「路径越短越容易学到长程依赖」是理论动机 证据等级 · 有理论动机 有数学或机制上的理由说明它可能有效,但没有证明它一定更好。最后是否采用,仍然要看实验。 本条原文:the shorter these paths …, the easier it is to learn long-range dependencies,引的是更早的分析,不是证明 出处Vaswani et al. 2017 §4 ↗ 。
- 实验上呢?Transformer 在当年的翻译任务上更好、训练更快 证据等级 · 实验验证 由对比实验得出的经验结论,只在出处写明的模型、数据和规模下成立。换了条件可能不再成立,引用时要带上实验设置。 本条英德、英法 WMT 2014 出处Vaswani et al. 2017 §6–7 ↗ ;之后的规模化实验让它成为默认架构。
一句话
RNN 输在「必须一步一步来」:串行步数和路径长度都随序列增长;注意力把两者都变成 1,代价是每层 T²·d 的计算。
回到主线
岔路到此。主线接着往下:生成时,每一步都要重算前面所有 token 的 K、V 吗?→ 第 8 课。另一条岔路:注意力一定要「看点什么」吗?。想回看 Transformer 是怎么从「只留注意力」这个决定里来的:C0 第 4 课。
你可能会问
这一课来自学习问题链里的常见疑问,还没有真实提问记录;你的提问会记到 05-问答记录/C3-B1.md。