第五章 现代语言模型的结构演进
原始 Transformer 提供了 Attention 与 FFN 交替堆叠的框架。后续语言模型围绕训练稳定性、表达能力、上下文表示、存储容量和推理带宽改变了若干组件。本章重点解释这些改动为什么出现,以及它们怎样改变后续的资源公式。
这些组件可以组合使用,但不是每个模型都全部采用。阅读具体配置时,应把模块定义与配置字段一起核对。
1 Decoder-only 与统一文本前缀
在 decoder-only 自回归模型中,任务说明、问题、参考资料和已生成回答都可以组织在同一条 token 序列中。因果注意力让后续位置读取之前所有允许访问的信息。
这种形式不需要独立的 Encoder 与 Cross-Attention,就能用同一个条件概率接口处理续写和许多条件生成任务。它的代价是:输入与输出共享上下文容量,长前缀必须通过自注意力处理,并在生成期间持续提供可读取状态。
它是一种统一建模方式,并不是从理论上证明其他架构在所有任务上都不必要。Encoder-decoder 可以为源端和目标端安排不同结构与可见性,仍然有独立的设计空间。
2 RMSNorm 与残差主干
RMSNorm 使用均方根尺度,不减均值:
$$ \operatorname{RMSNorm}(x)_r=\gamma_r\frac{x_r}{\sqrt{\frac1d\sum_jx_j^2+\epsilon}} $$
与带 scale/bias 的标准 LayerNorm 相比,常见 RMSNorm 只有一个长度 d 的缩放参数。它简化了归一化计算;其设计与实证背景见 RMSNorm 原论文。
一个常见现代 block 可以写为:
$$ U=X+\operatorname{Attention}(\operatorname{RMSNorm}(X)) $$
$$ H=U+\operatorname{FFN}(\operatorname{RMSNorm}(U)) $$
其中各 Norm 通常各自有参数;堆叠完成后再做 final Norm。残差主干宽度始终是 d,而分支可以在内部使用不同宽度再投影回来。
3 从两矩阵 FFN 到门控 FFN
普通 FFN 的非线性来自 $\phi(XW_1)$。门控结构增加一条分支,用输入相关的特征对另一条分支逐元素调制。SwiGLU 的常见无 bias 形式是:
$$ G=\operatorname{SiLU}(XW_g),\qquad U=XW_u $$
$$ \operatorname{SwiGLU}(X)=(G\odot U)W_d $$
其中 $\operatorname{SiLU}(z)=z\operatorname{sigmoid}(z)$,$W_g,W_u\in\mathbb{R}^{d\times m}$,$W_d\in\mathbb{R}^{m\times d}$。门控值是连续且不必在 0–1 之间,因此不能把它简单理解成概率开关。关于门控 FFN 变体可参考 GLU Variants Improve Transformer。
这里有三组矩阵,所以参数主项为 $3dm$。如果希望与中间宽度 4d 的普通 FFN 大致保持相同参数预算,则令 $3dm\approx2d(4d)$,得到 $m\approx8d/3$。实际配置可能为了表达容量和硬件对齐使用其他宽度。
“FFN 宽度总是 hidden 的四倍”因此只是某类配置经验,不能作为 Transformer 的定义。
4 RoPE 如何把相对位置带入点积
绝对位置向量是在输入中添加信息;RoPE 则对 Q/K 的分量成对旋转。为方便展示,本节用二维列向量,定义:
$$ R(\phi)=\begin{pmatrix}\cos\phi&-\sin\phi\\sin\phi&\cos\phi\end{pmatrix} $$
位置 p 的 Query 与位置 q 的 Key 分别变成 $R(p\omega)u$ 和 $R(q\omega)v$。两者点积为:
$$ (R(p\omega)u)^\top(R(q\omega)v) =u^\top R(p\omega)^\top R(q\omega)v $$
利用旋转矩阵的关系 $R(a)^\top R(b)=R(b-a)$:
$$ \boxed{(R(p\omega)u)^\top(R(q\omega)v)=u^\top R((q-p)\omega)v} $$
位置差 $q-p$ 因而显式进入匹配。高维 head 将多个二维旋转块拼在一起,每个块使用不同频率。内容向量仍然决定最终分数,不能把结果理解为“注意力只依赖距离”。这一构造来自 RoFormer。
常规 RoPE 不需要可学习位置表,但有旋转计算和位置相关数值。标准实现通常缓存已经进行对应旋转的 K,后续 query 使用一致的位置规则进行匹配。
相对位置形式不保证任意长上下文都表现稳定。训练见过的位置范围、频率设置和位置缩放方式都会影响外推;若对具体模型做长上下文扩展,需要额外验证。
5 MHA MQA 与 GQA 的动机
标准 MHA 中每个 Query head 有自己的 K/V head。生成时,历史位置的 K/V 要持续保存并读取。随着上下文变长,减少这些状态的宽度便成为有价值的结构目标。
MQA 让所有 Query heads 共享一组 K/V;GQA 则分成若干组,让一组 Query heads 共享一个 K/V head。GQA 原论文
记 Query heads 为 $h_q$、KV heads 为 $h_{kv}$、每头宽度为 $d_h$,则:
$$ d_q=h_qd_h,\qquad d_{kv}=h_{kv}d_h $$
Q 的投影为 $d\times d_q$,K/V 各为 $d\times d_{kv}$。当保持 Q heads 不变、减小 KV heads 时,每个历史 token 存储的 K/V 元素数随 $d_{kv}$ 下降。
但每个 Q head 仍有自己的 Query 和 Softmax 权重。共享 K/V 不等于让几个 head 的输出完全相同,也不等于把 QK/AV 的数学工作量按相同比例缩小。这一区别会直接出现在后续 FLOPs 与 HBM 流量公式中。
6 MoE 将容量与每 token 计算分开
Dense FFN 为所有 token 使用同一组权重。MoE 维护多组专家 FFN,由路由器决定每个 token 执行哪些专家。最简单路由器为:
$$ r(x)=\operatorname{softmax}(xW_r),\qquad W_r\in\mathbb{R}^{d\times E} $$
令 $\mathcal I(x)$ 是选出的 top-k 专家集合,一种具体的输出定义是:
$$ y=\sum_{e\in\mathcal I(x)}\widetilde r_e(x)\operatorname{Expert}e(x),\qquad \widetilde r_e=\frac{r_e}{\sum{j\in\mathcal I(x)}r_j} $$
这里明确采用对选中概率重新归一化的版本;实际模型的 gate、打分和归一化规则可能不同。常见 MoE 在 FFN 位置使用这一结构,而 Attention 仍由所有 token 共享。Mixtral 是逐 token 选择部分 FFN 专家的一个实例。Mixtral 论文
如果单专家有 $P_e$ 参数,模型保存 E 份专家权重,每个 token 只执行 k 份。因此专家总容量为 $EP_e$,单 token 的专家路径为 $kP_e$。这解释了为什么总参数与激活参数可以明显分离。
这种分离也带来新问题。路由可能集中到少数专家,造成负载不均;不同专家每次收到的 token 数会改变矩阵乘法效率;专家分布在不同设备时,还要搬运 token 表示。训练可能使用负载均衡机制,部分实现还会规定容量并处理溢出。
Top-k 的索引选择本身不是一个对所有分数平滑可导的函数。训练中通常让梯度流过被执行的专家和 gate 权重,并通过模型采用的辅助目标或路由机制改善学习。不能把它理解成所有未选专家在每个 token 上都得到相同主损失梯度。
有些结构额外保留始终执行的共享专家。它们既计入总参数,也计入每 token 激活路径,与按 top-k 选择的路由专家分开统计。
7 这些改动分别影响什么
| 结构变化 | 直接改变的对象 | 后续需要观察的量 |
|---|---|---|
| Pre-Norm 与 RMSNorm | 归一化方式和残差路径 | 优化行为、归一化参数与计算 |
| SwiGLU | FFN 的非线性与矩阵数 | FFN 宽度、参数、FLOPs、临时激活 |
| RoPE | Q/K 中的位置表示 | 位置一致性、缓存形式、长上下文行为 |
| GQA/MQA | K/V 表示的共享程度 | KV 容量、KV 带宽、K/V 投影 |
| MoE | 每 token 选择的 FFN 路径 | 总容量、激活参数、路由与通信 |
到这里可以看出,层数、hidden size、head 数和专家数都不是孤立的配置项。每个数控制一组具体的矩阵或状态;只有先建立结构图,才能可靠地把配置转换成资源开销。
下一章:从模型计算图到系统成本。