RMSNorm:均方根归一化总结
RMSNorm:均方根归一化总结
1. RMSNorm 是什么?
RMSNorm 的全称是 Root Mean Square Normalization,中文可以叫:
均方根归一化
它是 Transformer 大模型中常用的一种归一化方法,例如 LLaMA、Qwen、DeepSeek、Gemma 等模型中都常见。
它的核心作用是:
只控制向量整体尺度,不改变向量的均值中心。
也就是说,RMSNorm 本质上不是一个神秘概念,而是一个非常直接的数学操作:
对一个多维向量,计算它的整体能量大小,然后把它缩放到一个稳定尺度。
2. RMSNorm 的数学公式
假设一个 token 的隐藏向量是:
x = [x1, x2, x3, ..., xd]
其中:
d是隐藏维度;xi是第i个特征分量。
RMSNorm 首先计算这个向量的均方根:
RMS(x)=1d∑i=1dxi2+ε \operatorname{RMS}(x)=\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2+\varepsilon} RMS(x)=d1i=1∑dxi2+ε
然后把每个分量除以这个 RMS 值,再乘上一个可学习的缩放参数:
yi=xiRMS(x)⋅gi y_i=\frac{x_i}{\operatorname{RMS}(x)}\cdot g_i yi=RMS(x)xi⋅gi
其中:
x_i:输入向量的第i个分量;d:隐藏向量维度;ε:防止除零的小常数;g_i:可学习缩放参数,通常叫weight。
3. 一个简单算例
假设输入向量是:
x = [3, 4]
它的 RMS 是:
RMS = sqrt((3^2 + 4^2) / 2)
= sqrt(25 / 2)
≈ 3.535
所以归一化之后:
x_norm = [3 / 3.535, 4 / 3.535]
≈ [0.848, 1.131]
这说明 RMSNorm 做的事情是:
把向量整体能量拉回到一个稳定范围。
它不关心这个向量的均值是多少,只关心这个向量整体“有多大”。
4. RMSNorm 的物理意义
可以把 Transformer 中每个 token 的隐藏向量看成一个多维信号:
x = [特征1, 特征2, 特征3, ..., 特征d]
每个 token 经过 Attention、MLP、残差连接之后,它的向量幅值可能变大,也可能变小。
比如:
token A 的隐藏向量整体幅值很大
token B 的隐藏向量整体幅值很小
如果不做尺度控制,后续的矩阵乘法、Attention score、MLP 激活都可能变得不稳定。
RMSNorm 做的事情可以理解为:
保留向量的主要方向,只重新调节向量的长度。
也可以理解为:
原始向量 = 方向 + 长度
RMSNorm = 主要保留方向,把长度拉回合理范围
所以 RMSNorm 不是在“理解语义”,也不是一个复杂概念,而是一个:
多维特征尺度控制器。
5. RMSNorm 和 LayerNorm 的区别
LayerNorm 的基本操作是:
先减均值,再除标准差
近似写成:
LayerNorm(x)=x−mean(x)std(x) \operatorname{LayerNorm}(x)=\frac{x-\operatorname{mean}(x)}{\operatorname{std}(x)} LayerNorm(x)=std(x)x−mean(x)
RMSNorm 的基本操作是:
不减均值,只除 RMS
近似写成:
RMSNorm(x)=xRMS(x) \operatorname{RMSNorm}(x)=\frac{x}{\operatorname{RMS}(x)} RMSNorm(x)=RMS(x)x
| 方法 | 是否减均值 | 是否除尺度 | 核心作用 |
|---|---|---|---|
| LayerNorm | 是 | 是 | 调整中心 + 调整尺度 |
| RMSNorm | 否 | 是 | 只调整尺度 |
| RMSNorm 的优势 | 否 | 是 | 计算更简单,工程更高效 |
6. 为什么大模型喜欢 RMSNorm?
6.1 计算更简单
LayerNorm 通常需要计算:
mean
variance
sqrt
divide
RMSNorm 只需要计算:
平方平均
sqrt
divide
它少了减均值和中心化方差的步骤,因此工程实现更简单,计算成本也更低。
6.2 适合 Transformer 的残差结构
现代 Transformer 常用 Pre-Norm 结构,例如:
x = x + Attention(RMSNorm(x))
x = x + MLP(RMSNorm(x))
也就是说,在进入 Attention 或 MLP 之前,先对输入做尺度归一化。
RMSNorm 在这里的作用是:
每次进入 Attention / MLP 之前,把输入尺度稳定住。
这样可以避免残差连接不断叠加之后,隐藏向量的数值尺度失控。
6.3 保留均值信息
LayerNorm 会做:
x - mean(x)
这会把向量的均值信息去掉。
而 RMSNorm 不减均值,只控制整体能量。
所以它更像是在说:
我只控制你的能量,不动你的整体偏置结构。
在大模型中,这通常已经足够稳定,而且计算更省。
7. Python 手写 RMSNorm
下面是一个不用 PyTorch 的纯 Python 版本:
import math
def rms_norm(x, weight, eps=1e-6):
"""
x: 输入向量,长度为 d
weight: 可学习缩放参数,长度为 d
eps: 防止除零
"""
d = len(x)
# 1. 计算均方值
mean_square = 0.0
for value in x:
mean_square += value * value
mean_square = mean_square / d
# 2. 计算 RMS
rms = math.sqrt(mean_square + eps)
# 3. 归一化并乘可学习缩放参数
y = []
for xi, wi in zip(x, weight):
y.append((xi / rms) * wi)
return y
x = [3.0, 4.0]
weight = [1.0, 1.0]
print(rms_norm(x, weight))
输出大概是:
[0.8485, 1.1313]
8. PyTorch 版本 RMSNorm
import torch
class RMSNorm(torch.nn.Module):
def __init__(self, dim, eps=1e-6):
super().__init__()
self.eps = eps
self.weight = torch.nn.Parameter(torch.ones(dim))
def forward(self, x):
# x shape: [batch_size, seq_len, hidden_dim]
# 沿最后一维 hidden_dim 计算 RMS
rms = torch.sqrt(torch.mean(x * x, dim=-1, keepdim=True) + self.eps)
# 除以 RMS,控制尺度
x_norm = x / rms
# 乘可学习缩放参数
return x_norm * self.weight
输入形状一般是:
x: [batch_size, seq_len, hidden_dim]
RMSNorm 是沿着最后一维 hidden_dim 做归一化。
9. 从工程角度理解 RMSNorm
在 Transformer 中,每一层通常会有 Attention 和 MLP。
如果没有归一化,残差连接会不断把新的变化叠加到原来的向量上:
x = x + Attention(x)
x = x + MLP(x)
多层之后,向量尺度可能越来越大,或者在某些情况下变得非常不稳定。
RMSNorm 插入之后,就变成:
x = x + Attention(RMSNorm(x))
x = x + MLP(RMSNorm(x))
它的作用不是改变模型结构的本质,而是给每一次变换前的输入加一个尺度约束。
可以把它理解为:
每次进入复杂变换之前,先把输入向量的能量调到一个可控范围。
10. 最终总结
RMSNorm 的本质可以压缩成一句话:
对每个 token 的隐藏向量,计算它的整体能量 RMS,然后把向量除以这个能量,让进入 Attention / MLP 之前的尺度稳定下来。
它不是复杂概念,也不是必须神秘化命名。
从数学上看,它就是:
多维向量的尺度归一化
从物理意义上看,它就是:
控制多维信号的整体能量
从工程作用上看,它就是:
稳定 Transformer 层间数值尺度,减少训练和推理中的数值波动
所以你可以把 RMSNorm 理解成:
一个只调长度、不强行移动中心的多维向量尺度控制器。
更多推荐



所有评论(0)