RMSNorm(Root Mean Square Normalization,均方根归一化)是一种只按"整体幅度"缩放、不做减均值处理的归一化方法,可以理解为 AI 词典:LayerNorm">LayerNorm 的简化版。
它到底做了什么
先看 LayerNorm(Layer Normalization)对一个 token 的向量 x(长度 d)做的两步:
1. 中心化:每个元素减去这一向量的均值 μ;
2. 缩放:再除以标准差 σ,然后乘可学习参数 γ、加偏置 β。
RMSNorm 只保留第二步,而且分母换成了均方根:
```
RMS(x) = sqrt( (1/d) × Σ x_i² )
输出 = x / RMS(x) × γ
```
没有减均值,通常也没有 β。
打个比方:把归一化想成调音。LayerNorm 是先把直流偏置(整条曲线往上飘的那部分)拉回零,再把音量统一;RMSNorm 直接跳过"拉回零",只看这段信号的整体能量有多大,然后按这个能量缩放。少拧一个旋钮,出来的效果往往差不了多少。
和相邻概念的区别
| BatchNorm | LayerNorm | RMSNorm | |
|---|---|---|---|
| 统计范围 | 一个 batch 内同一特征 | 单个样本的特征维 | 同 LayerNorm |
| 减均值 | 是 | 是 | 否 |
| 分母 | 标准差 | 标准差 | 均方根 |
| 可学习参数 | γ、β | γ、β | 通常只有 γ |
| 训练/推理行为 | 不一致(用滑动统计量) | 一致 | 一致 |
| 常见场景 | 卷积网络 | Transformer | 大模型 |
快在哪
- 归约次数减半。算标准差要先求均值、再求方差,是两次归约(reduction);算均方根只要一次平方均值。在 GPU 上,归约意味着线程间的同步和通信,恰恰是归一化 kernel 里最贵的部分。
- 元素级操作更少。少了减均值这一步和随之而来的广播中间量。推理时归一化层通常是访存受限(memory-bound),少读少写就是实打实的提速。
- 反向传播更简单。需要缓存的中间结果变少,显存和计算图都更轻。
- 参数少一半。没有 β,权重文件里省下的虽是小头,但积少成多。
稳在哪
- 只要输入不全为零(有 eps 兜底),RMS 就不会是 0,除法安全。
- 不减均值,就不会把"整体偏大或偏小"这类可能有意义的信息抹掉。
- 计算路径短、数值范围更可控,混合精度训练时更不容易踩坑。
- 和 LayerNorm 一样,训练与推理行为一致,不像 BatchNorm 那样依赖 batch 统计量。
对从业者和普通人的意义
对做模型的人:把 LayerNorm 换成 RMSNorm 往往精度持平,换来的是训练吞吐和显存上的收益,这也是许多开源大模型直接把它当默认配置的原因。自己写 kernel 时,可以把它当成"半份 LayerNorm"来理解。
对普通职场人:它是一颗不起眼的小螺丝钉,但正是这类简化,让大模型训得更快、跑得更便宜。
具体某个模型是否使用 RMSNorm、eps 取值多少,以官方页面或开源实现为准。
