Chapter 05
从经典到现代:2017 → 2026 的演化
第 04 章暴露了 KV-cache 显存与 O(n²) 两大成本——本章看 2017 原版如何被一件件替换成 2026 的 decoder-only LLM 配方,其中一半的改动正是冲着那两个成本去的。
读完本章,你脑子里会多出这几条
- 公式核心(scaled dot-product / 残差 / 堆叠)17 年没变,变的是周边零件:位置编码、归一化、激活函数、KV 头共享方式。
- 现代标配 = RoPE + RMSNorm/pre-norm + SwiGLU + GQA + FlashAttention;约 2019–2023 年完成切换,现已稳定。
- 仍在快速变化(截至 2026-06):MoE 路由粒度、QK-norm 普及、MLA 低秩 KV 压缩、长上下文方案。
- SSM/Mamba 长序列推理吞吐有优势,但 2026 年 transformer 仍主导前沿——所有顶级模型(GPT / Claude / Gemini / Llama)仍是 transformer。
5.1总览:2017 block vs 2026 block
原版公式一行没改,换掉的是套在公式外面的每一个零件。
第 03 章的完整 block 长这样:输入 → LayerNorm(post) → 多头自注意力(MHA + 正弦位置编码) → 残差 → LayerNorm(post) → ReLU-FFN → 残差。九年后,每个括号里的东西都换了;括号的数量和顺序(注意力 + FFN 交替堆叠、残差连接)原封不动。图 5.1 把两个 block 并排对照。
以下各节按改动分层展开,每节注明替换了什么、何时、为何——以及替换后的代价与权衡。
5.2位置编码:sinusoidal → RoPE → 长上下文
RoPE(2021)把位置信息旋转进 Q/K,使点积天然只感知相对距离,而非绝对下标——这让位置外推从"强行插值"变成"旋转角度的缩放"。
第 03 章的正弦位置编码把位置向量加到 embedding 上,之后它随残差流传递。两个问题:① 它编码绝对位置,超出训练长度的位置就没见过;② 位置信息和语义信息混在同一个向量里,attention 计算时无法独立控制。
RoPE(Rotary Position Embedding,Su et al. 2021,arXiv 2104.09864)的做法:不再把位置向量加到 embedding,而是在计算注意力之前,把 Q 和 K 各自在二维子空间里按 θᵢ = pos / base^(2i/d) 旋转。两个相对距离为 m − n 的位置,其旋转后的点积只依赖 m − n,与绝对位置无关。结果:模型对相对距离天然敏感,绝对位置反而不重要。
给 Q/K 每个头的 d_k 维向量,按 i = 0,1,...,d_k/2-1 分成 d_k/2 个二维对:
旋转角:θᵢ = 1 / (base^(2i / d_k)) base = 10000(原版),Llama3 = 500000
对第 pos 个 token 的第 i 对分量 (xᵢ, xᵢ₊₁):
x'ᵢ = xᵢ · cos(pos·θᵢ) − xᵢ₊₁ · sin(pos·θᵢ)
x'ᵢ₊₁ = xᵢ · sin(pos·θᵢ) + xᵢ₊₁ · cos(pos·θᵢ)
关键性质:Q_m · K_n 的结果只依赖 (m − n),与 m、n 的绝对值无关。
RoPE 现已是 universal 方案:Llama 1–4、Mistral、Qwen 1–3、DeepSeek-V2/V3、Gemma 2/3、Phi 3/4 全部采用(截至 2026-06)。
长上下文扩展
RoPE 把"训练长度之外"的问题转化为"超出训练的旋转角度",可以用缩放来处理:
- Position Interpolation(Meta 2023):把超出的位置下标线性压缩到训练范围内,再微调。
- YaRN(ICLR 2024):分频段对 RoPE base 做非均匀缩放,低频分量(长程依赖)拉伸,高频分量(局部结构)压缩。Llama 3.1(2024-07)用 YaRN 把上下文从 8K 扩到 128K,base 提至 500000。
- iRoPE / NoPE(Llama 4,2025-04):部分层完全不用位置编码(NoPE),让模型自行从注意力模式中提取距离信息,配合 1M token 的超长上下文。
ALiBi(2022,BLOOM/MPT 使用)通过给注意力分数加线性距离惩罚实现相对位置,无需旋转操作。2024 年后基本退场——RoPE 在模型质量和扩展性上均优,且已有大量工程基础设施积累。
5.3归一化与激活:RMSNorm、QK-norm、SwiGLU
三处替换各自针对不同失效模式:RMSNorm 降计算成本、pre-norm 解决深层训练不稳定、SwiGLU 提激活表达力、QK-norm 防注意力 logit 爆炸。
RMSNorm(Zhang & Sennrich 2019)——替换 LayerNorm
第 03 章的 LayerNorm 先减均值、再除标准差、再缩放偏移。RMSNorm 丢掉均值中心化,只算 RMS(均方根)再缩放:
LayerNorm(x) = (x − μ) / √(σ² + ε) · γ + β μ = mean(x), σ² = var(x)
RMSNorm(x) = x / RMS(x) · γ RMS(x) = √(mean(x²) + ε)
区别:RMSNorm 省掉均值计算和偏移参数 β。
速度:快 10–15%(Llama 2 报告;实测在 d_model=4096 时约 12%)。
截至 2025,53 个主流开放模型中 41 个使用 RMSNorm(Raschka 2025 调查)。
pre-norm——替换 post-norm
原版是 LayerNorm(x + Sublayer(x))(post-norm:norm 在残差相加之后)。现代是 x + Sublayer(RMSNorm(x))(pre-norm:norm 在 sublayer 内,残差捷径完全不被归一化)。
第 03 章已论证过:post-norm 破坏 identity 捷径(顶层梯度被归一化后缩小),超过 12 层时需精细 warmup。pre-norm 让残差捷径完全绕过归一化,训练任意深度都稳定,从 GPT-2 起成为标准(截至 2019–2020 完成切换)。反直觉:浅层模型 pre-norm 质量略逊 post-norm;切换是为了深层可扩展性,不是质量提升。
QK-norm(2024–2025)——新增,防注意力 logit 爆炸
随着模型加深、序列加长,Q/K 点积在某些头上会产生极大值(logit 爆炸),导致 softmax 近 one-hot、注意力退化。QK-norm 在头内对 Q 和 K 各做一次 RMSNorm,把点积量级稳住。Gemma 3(Google 2025)、OLMo 2(AI2 2024)、Qwen3(Alibaba 2025)、Kimi K2(Moonshot 2025-06)均已采用。成本几乎为零——只是两个额外的 RMSNorm 操作。
SwiGLU(Shazeer 2020)——替换 ReLU/GELU
第 03 章的 FFN 用 max(0, xW₁+b₁)W₂(ReLU)。现代 FFN 改用 SwiGLU/GeGLU(Shazeer 2020),用门控机制替换单调激活:
原版 FFN(ReLU):FFN(x) = max(0, xW₁) · W₂
W₁: (d_model, d_ff) d_ff ≈ 4·d_model
SwiGLU FFN:FFN(x) = (xW₁ ⊙ Swish(xW₂)) · W₃
3 个权重矩阵:W₁, W₂: (d_model, d_hidden) W₃: (d_hidden, d_model)
d_hidden = 2/3 · d_ff ← 降维补偿第三个矩阵带来的参数增量
Swish(z) = z · sigmoid(z)
参数量:原版 2·d_model·d_ff,SwiGLU ≈ 3·d_model·(2/3·d_ff) = 2·d_model·d_ff → 基本持平
53 个主流开放模型中 38 个使用 SwiGLU 或 GeGLU(Raschka 2025 调查)。Llama/Mistral/DeepSeek/Qwen/Gemma/Phi 全部采用。
SwiGLU 比 ReLU 多一个矩阵 W₂,为什么说参数量"基本持平"?如果不把 d_hidden 降到 2/3,参数量会怎样?
展开答案(先停 10 秒再点)
原版 ReLU FFN 有两个矩阵:W₁ (d_model × d_ff) 和 W₂ (d_ff × d_model),总参数 2·d_model·d_ff。SwiGLU 有三个矩阵:W₁、W₂ 各 (d_model × d_hidden) 和 W₃ (d_hidden × d_model),总参数 3·d_model·d_hidden。令 d_hidden = 2/3·d_ff,则总参数 = 3·d_model·(2/3·d_ff) = 2·d_model·d_ff,与原版持平。若不缩减 d_hidden(保持 d_ff),参数量变为 3/2 倍——等于每层 FFN 增加 50%,整体模型显著变大。
5.4注意力效率:MHA → MQA → GQA → MLA
KV-cache 的显存成本正比于 K/V 头的数量——这条链上的每一步都在压头数,代价是不同程度的质量损失。
第 04 章建立了 KV-cache 的成本公式:seq_len × layers × heads × head_dim × 2 × dtype_bytes。7B/32层/32头/d128/8K/fp16 ≈ 8 GB。压缩 KV 头数量是最直接的降显存路径。
| 方案 | 出处 | KV 头数 | 质量 | 代表模型 |
|---|---|---|---|---|
| MHA | Vaswani 2017 | = Q 头数(h) | 基准 | GPT-2、原版 BERT |
| MQA | Shazeer 2019 | 1 | 大模型明显掉 | 早期 Falcon、PaLM(部分) |
| GQA | Ainslie et al. 2023 | g(Q头数/g,通常 8) | 接近 MHA | Llama 2-70B 起、Llama 3 全系、Mistral、Qwen2/3、Gemma 2/3、Phi 3/4 |
| MLA | DeepSeek-V2 2024-05 | 低秩 c_KV(相当于极少头) | 相当或更好(报告内) | DeepSeek-V2/V3/R1 |
何时选 GQA vs MLA?GQA 是通用首选:工程成熟、质量稳定、所有主流推理框架均已优化。MLA 在极长上下文或显存严重受限场景(如 DeepSeek-V2 部署在 A100×8 上跑 671B 模型)有明显优势;但需要在推理时对低秩潜向量做上投运算,且截至 2026-06 仅 DeepSeek 系列在生产中验证过——其他厂商仍在观望。
5.5FlashAttention:不近似地解决 O(n²)
FlashAttention 不改变注意力的数学结果,只改变在 GPU 上怎么算——把 n×n 矩阵分块留在 SRAM 里,避免落地 HBM,从而把显存从 O(n²) 降到 O(n)。
第 04 章指出 O(n²) 的痛点:n=8192 时,每头注意力矩阵 ~268M floats,必须写回 HBM(高带宽显存)再读回来做 softmax——这是显存瓶颈,不只是算力瓶颈。标准 CUDA 核不断往返 HBM,慢在 IO。
GPU 的 SRAM(片上内存,A100 约 20 MB/SM)远快于 HBM(约 80 GB,带宽 2 TB/s)。FlashAttention 把 Q/K/V 切成小块,在 SRAM 内完成 softmax 分子、分母的累积,直接输出 O——整个过程不落地 n×n 矩阵。因为分块计算在数学上等价(利用 online softmax 的分母可拆合性),输出结果与标准注意力逐 bit 相同,不是近似。
标准注意力:
S = Q · Kᵀ / √d_k # (n, n) — 必须落地 HBM
P = softmax(S) # (n, n) — 再次落地
O = P · V # (n, d_v) — 结果
FlashAttention(分块):
将 Q 切成块 Q₁, Q₂, ...;将 K, V 切成块 K₁, K₂, ...
对每块 Qᵢ,遍历所有 Kⱼ, Vⱼ:
在 SRAM 内算 Sᵢⱼ = Qᵢ · Kⱼᵀ / √d_k
用 online softmax 累积分子/分母(safe softmax 技巧)
累积对 Oᵢ 的贡献
只把最终 Oᵢ 写回 HBM
结果:HBM 读写 O(n) 而非 O(n²);输出与标准注意力逐 bit 相同。
三个版本的演进:FlashAttention-1(Dao et al. 2022,arXiv 2205.14135,NeurIPS 2022)建立分块框架,2–4× 速度提升;FlashAttention-2(2023)改进线程块分配,GPU 利用率从 ~35% 提升到 ~70%,成为 PyTorch/vLLM 等框架的默认 kernel;FlashAttention-3(2024-07,arXiv 2407.08608,NeurIPS 2024)针对 Hopper(H100)架构,用 warp 专门化 + FP8,吞吐达 ~740 TFLOPs(fp16),仍处于向生产铺开阶段(截至 2026-06 部分框架已合并)。
线性注意力(Katharopoulos 2020)、performer(Choromanski 2020)等方案用核函数近似把 O(n²) 降到 O(n),但质量损失明显。FlashAttention 是唯一在不改变数学结果的前提下解决 IO 瓶颈的方法——这是它能成为标准 kernel 而非"研究方向"的原因。
5.6长上下文:sliding-window 与 attention sinks
即使有 FlashAttention,超长序列(64K+)的注意力仍然太贵——sliding-window 把每个 token 的注意力范围限制在 W 个邻居内,把复杂度从 O(n²) 降到 O(n·W)。
Mistral sliding-window attention(Jiang et al. 2023,Mistral 7B 论文):每个 token 只注意前后 W 个 token(Mistral 7B 取 W=4096),超出窗口的 token 不计算、不缓存。复杂度从 O(n²) 变为 O(n·W),n 很大时是巨大节省。代价:无法对窗口外的远程上下文直接注意。Gemma 3/Mistral 2 用 sliding-window 与全注意力层交替(全注意力层作为远程连接点),兼顾局部与全局。
StreamingLLM attention sinks(Xiao et al. 2023-09):观察到 LLM 注意力权重高度集中在序列最初几个 token(称为 "attention sink"),即使这些 token 语义无关。保留最初 4 个 token 的 KV,配合 sliding-window,就能在几乎无限流式序列上稳定推理——不需要重训练,是推理时的技术而非训练改动。这不是 context window 扩展,而是流式推理稳定性技巧。
5.7MoE:把 FFN 变稀疏
MoE(Mixture of Experts)把每层的 dense FFN 换成 N 个"专家"FFN,每个 token 由 router 只激活其中 top-k 个——total 参数巨大,active 参数(实际计算)远小于 total。
第 03 章的 FFN 是一个对所有 token 都用的 dense 层。MoE 将它拆成多个专家 FFN,加一个轻量 router(通常是一层线性 + softmax),router 为每个 token 选出 top-k 个专家,该 token 只经过这 k 个专家的计算。
dense FFN:output = FFN(x) # 所有 token 用同一个 FFN
MoE FFN:
scores = softmax(x · W_router) # (vocab, N_experts)
top_k_idx = argtopk(scores, k) # 每 token 选 k 个专家
output = Σᵢ∈top_k scores[i] · Expertᵢ(x)
active 参数 = k/N × total 参数
计算量(FLOPs)≈ dense 模型的 k/N 倍
显存(推理,单机单卡)≈ 需装下所有 N 个专家权重 → 通常需多卡
前沿 MoE 模型演进(全部 dated):
- Mixtral 8×7B(Mistral AI,2024-01):46.7B total / ~12.9B active,top-2 路由,8 个专家,开创性地将开源 MoE 推向实用。
- DeepSeek-V3(DeepSeek,2024-12):671B total / 37B active,细粒度 256 专家 top-8 + 共享专家(每 token 必过)+ 无辅助损失负载均衡,训练成本 ~$5.6M(H800 集群)。
- Llama 4 Maverick(Meta,2025-04):400B total / 17B active,128 专家 + 1 共享专家,iRoPE 支持 1M token 上下文。
- Qwen3-235B(Alibaba,2025-04):235B total / 22B active,继续细粒度路由趋势。
- Kimi K2(Moonshot AI,2025-06):1T total / ~32B active,截至 2026-06 公开的最大 MoE 模型之一。
截至 2026-06,MoE 是前沿开放模型的主流扩展路径——几乎所有新一代超大模型都采用稀疏 MoE 而非继续堆 dense 参数。路由粒度(专家数量、每 token 激活数)和负载均衡方案仍在快速演化。
5.82026 标准 decoder block 配方
把前面各节的替换拼在一起,就是 2026 年任何主流开源 LLM 的单层 decoder block。
输入:x (batch, seq_len, d_model)
── 注意力子层 ──────────────────────────────────────────────────
h = RMSNorm(x) # pre-norm(替换 post-norm LayerNorm)
q = h · W_Q # (batch, seq, d_model)
k = h · W_K # (batch, seq, g_heads × head_dim) g_heads « num_q_heads
v = h · W_V # 同上
q, k = apply_RoPE(q, k, positions) # 旋转编码(替换 sinusoidal 加法)
# 可选:QK-norm(Gemma3/Qwen3/Kimi K2)
q, k = RMSNorm_per_head(q), RMSNorm_per_head(k)
attn = FlashAttention(q, k, v, causal_mask) # IO-aware 精确计算
x = x + attn · W_O # 残差(未被 norm)
── FFN 子层(dense)────────────────────────────────────────────
h = RMSNorm(x) # 第二个 pre-norm
x = x + SwiGLU_FFN(h) # SwiGLU(替换 ReLU)+ 残差
── FFN 子层(稀疏 MoE,前沿大模型)─────────────────────────────
h = RMSNorm(x)
x = x + MoE_FFN(h, router) # router 选 top-k 专家
── 可选扩展 ────────────────────────────────────────────────────
部分层用 sliding-window attention(替换全局 attention,Gemma3/Mistral2)
部分层用 NoPE(无位置编码,Llama4 每 N 层一个)
对照回图 5.1:括号里每个槽位现在都有了确定的方案。核心公式(scaled dot-product、残差、堆叠 N 层)从未动过。
5.9挑战者:SSM/Mamba 与混合模型
选择性 SSM 在长序列推理吞吐上确实赢过 transformer,但 MMLU / 多跳推理质量在 2026 年仍落后——transformer 仍主导前沿。
状态空间模型(SSM)把序列建模转化为线性动态系统,递推状态而非建立 n×n 注意力矩阵。Mamba(Gu & Dao 2023-12)引入选择性 SSM:状态转移矩阵 A、B、C 都是输入相关的(不再是全局固定的),赋予模型动态忽略或保留信息的能力。
优势(经过 2024 年实测):
- O(n) 时间和显存:推理时不需要 KV-cache,状态大小固定——长序列吞吐比 FlashAttention transformer 高,最高约 5× 速度(长上下文场景)。
- 适合流式无限长序列:状态是定长的,不随上下文增长。
局限(同样经过实测,honest assessment):
- MMLU / 多跳推理仍落后:NVIDIA 2024 在 8B 规模系统对比中确认,Mamba 在通用知识和多步推理任务上仍弱于同规模 transformer。
- 反直觉:训练吞吐更低。Mamba 的效率赢在推理;训练阶段 GPU 并行度更低,FlashAttention transformer 反而更快训练。
- 电话簿查找类任务(需要精确随机访问历史 token):状态压缩会丢失精确位置信息,transformer 的 KV-cache 在这类任务上更可靠。
近期动向(全部 dated):
- Mamba-3(ICLR 2026,Princeton):用"半状态尺寸"换推理速度,质量与 Mamba-2 接近。
- RWKV-7 "Goose"(2025-03):线性 RNN 架构,无注意力矩阵,长序列下 memory 固定。
- Jamba(AI21 Labs,ICLR 2025):混合架构,43% Mamba-2 层 + 7% attention 层 + 50% MLP,长上下文推理吞吐约 3× 纯 transformer;这是"混合模型"是近期可信替代路线的直接证据。
所有顶级前沿模型(GPT-4o / Claude / Gemini / Llama 4)仍是 transformer。SSM/Mamba 在长序列推理吞吐上有真实优势,混合模型是近期长上下文/吞吐场景的可信路线——但通用推理质量尚未追上。这个结论有明确的时效性:如果 Mamba-4 或某个混合模型在 MMLU 和多跳推理上与 transformer 齐平,结论将改变。
§本章 self-check
先合上教程,把能想到的答案写在编辑器里。写完再点开对照——直接点开等于把这节当再读一遍。
- RoPE 把位置编码的方式从"加到 embedding"改成了什么?它为什么天然支持相对位置,而正弦编码不行?
- FlashAttention 声称"不近似"——意思是什么?它和线性注意力(Performer 等近似方法)的根本区别在哪里?
- 选择/判断题:一家公司要在单节点 8×A100 上部署一个 200B 参数的模型做长文档(64K token)推理,对延迟敏感、对 KV-cache 显存极其紧张。从 GQA 和 MLA 中选哪个?给出理由,并说明你放弃另一个的代价是什么。
- SSM/Mamba 的"训练吞吐低于 FlashAttention transformer"是反直觉结论——解释为什么,以及 Mamba 的效率优势具体体现在哪个阶段。
答案(先做完再展开)
- RoPE 把 Q/K 在二维子空间内按
pos × θᵢ角度旋转。两个位置的点积结果只依赖它们的相对距离m − n,与绝对位置无关——旋转角之差抵消了绝对值。正弦编码是加法混入 embedding,点积展开后含绝对位置项,无法分离。 - FlashAttention 通过分块+online softmax,在 SRAM 内完成全部计算,输出与标准注意力逐 bit 相同(online softmax 在数学上等价)——改的是 IO 路径,不改数学。线性注意力用核函数近似 softmax,数学结果不同,会丢失精度,尤其在精确 token 检索任务上。
- 选 MLA。理由:MLA 把 KV 压缩为低秩潜向量,DeepSeek-V2 实测省 93.3% KV-cache 显存——对 64K 长文档显存极度紧张的场景,这是决定性优势。代价:放弃 GQA 意味着放弃更成熟的工程支持(主流推理框架 MLA 优化较少)、以及未经其他厂商大规模验证的可靠性;MLA 在推理时需对低秩潜向量做上投运算,有额外计算开销。若显存不是瓶颈,GQA 更稳妥。
- Mamba 的选择性 SSM 在 GPU 上训练时,A/B/C 矩阵是输入相关的(不固定),无法像 attention 那样把整个序列的操作合并成大规模矩阵乘法(GEMM),GPU 并行度更低;而 FlashAttention transformer 的 Q×K 是大 GEMM,GPU 利用率更高。Mamba 的效率优势在推理阶段:状态是定长的递推,不需要 KV-cache 增长,长序列推理时间/显存是 O(n) 而非 O(n²)。