均方根归一化(Root Mean Square Layer Normalization,RMSNorm) 只按向量的均方根(RMS) 缩放,不减均值,多数实现没有 (\beta),只留可学习 (\gamma)。Zhang & Sennrich(2019)认为 LN 的收益主要来自重缩放而非重定心。LLaMA、Qwen、Gemma、Mistral 等现代 Decoder 用它替换 LN。
段末注释:RMS 即 (\sqrt{\mathrm{mean}(x^2)}),刻画能量/模长,不含「离均值多远」。后文 RMSNorm 不缩写。
系列导读:5050.大模型-算法要点-0
1. 作用
与 LN 相同的宏观目标:稳住激活尺度,让深层残差可训。差别是更便宜、少两个统计量:
| 相对 LN | RMSNorm 的取舍 |
|---|---|
| 更快 | 不算 (\mu),少一次减法和方差展开;论文报约 7%–64% 加速(视实现) |
| 更少参数 | 通常只有 (\gamma),无 (\beta) |
| 表达 | 不强制零均值;对许多 LLM 任务足够 |
选 RMSNorm 几乎总是架构默认跟着底座(要复现 LLaMA 就不要改回 LN),不是微调旋钮。
2. 功能 / 机制
[
\mathrm{RMS}(\mathbf{x})=\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^{2}+\varepsilon},\qquad
\mathrm{RMSNorm}(\mathbf{x})=\boldsymbol{\gamma}\odot\frac{\mathbf{x}}{\mathrm{RMS}(\mathbf{x})}
]
训练与推理同一公式。PyTorch 无同名官方层,社区用 LlamaRMSNorm 一类实现:x * torch.rsqrt(x.pow(2).mean(-1)+eps) * weight。

现代 Decoder 几乎都是 Pre-RMSNorm:
[
\mathbf{h}\leftarrow \mathbf{h}+\mathrm{Sub}\big(\mathrm{RMSNorm}(\mathbf{h})\big)
]
层末再来一次 RMSNorm 才进 LM head(LLaMA 的 final_norm)。
3. 默认经验值
| 项 | 常见值 | 备注 |
|---|---|---|
| (\varepsilon) | (10^{-5})~(10^{-6}) | HuggingFace LlamaConfig.rms_norm_eps 默认 (10^{-6});Llama-2 部分尺寸用 (10^{-5})。训推必须一致 |
| (\gamma) | 可学习,init (1) | 勿 init 成 (0),首步输出会塌 |
| (\beta) | 无 | 手写时不要多加 bias |
| Dropout | LLaMA 预训练常 0 | 与「用 RMSNorm」是两件事 |
FP16 若出现 0-RMS 行,可把 (\varepsilon) 略提到 (10^{-5});不要和权重文件里的值拧着来。
4. 整体应用
- 架构:替换每处 LN;位置仍是 Pre-Norm + 末层 Norm。
- 训练:(\gamma) 参与梯度;weight decay 通常排除 norm 的 (\gamma)。
- 推理:无开关;vLLM / llama.cpp 必须读同一
rms_norm_eps,否则长生成会漂。
HuggingFace:rms_norm_eps。
5. 使用案例
LLaMA 1/2/3:Pre-RMSNorm,AdamW,预训练无 Dropout。
Qwen / Mistral / Gemma:同族选择。
T5 / Gopher 等:较早把 RMSNorm 带进 Encoder–Decoder。
ProteinMPNN / BERT / GPT-2:仍是 LN,不要按 LLaMA 改 (\varepsilon) 名。
6. 易混对照
| 名称 | 差在哪 |
|---|---|
| LayerNorm | 减 (\mu)、除 (\sigma)、有 (\beta);见本系列 02 |
| Weight decay | 惩罚 (W),不改激活归一 |
| ε 与学习率 | (\varepsilon) 是除零垫,不是步长 |
参考
- Zhang & Sennrich, Root Mean Square Layer Normalization, 2019.
- Touvron et al., LLaMA / LLaMA 2。
- 实现:HuggingFace
LlamaRMSNorm;配置字段rms_norm_eps。