- 作者
-
-
- 姓名
- Amit Shekhar
- 发布于
-
RMSNorm(均方根归一化)是一种更简单、更快速的层归一化版本,它只保留重新缩放的步骤,去掉了重新居中的步骤。大多数现代大语言模型都采用它。
在这篇博客中,我们将学习 RMSNorm——一种比层归一化更快、更简单的替代方案,它支撑着大多数现代大语言模型,如 Llama、Mistral、Gemma、Qwen、PaLM 和 DeepSeek。
我们的目标是清晰地解读 RMSNorm,以便在读完本文后,我们能够向任何人解释它的工作原理。
我们将涵盖以下内容:
- 为什么深度网络需要归一化
- 层归一化(LayerNorm)快速回顾
- RMSNorm 是什么以及它如何工作
- RMSNorm 背后的数学原理及具体数值示例
- LayerNorm 与 RMSNorm——关键区别
- 为什么现代大语言模型更青睐 RMSNorm
- 代码示例
- RMSNorm 在 Transformer 中的位置
- 快速总结
我是 Amit Shekhar,Outcome School 的创始人。我教导和指导过许多开发者,他们的努力帮助他们获得了高薪技术工作,帮助许多技术公司解决了独特的问题,并创建了许多被顶级公司使用的开源库。我热衷于通过开源、博客和视频分享知识。
我在 Outcome School 教授 AI 和机器学习。
让我们开始吧。
全局概览
在深入细节之前,让我们先了解全局。
像 LLM 这样的神经网络将许多层堆叠在一起。当数值流经这些层时,它们可能变得非常大或非常小。这会使训练变慢且不稳定。
为了解决这个问题,我们在每一层对数值进行缩放,使其保持在健康的范围内。这个缩放步骤称为归一化。
简单来说:
RMSNorm = 一种更简单、更快速的神经网络内部数值归一化方法。
RMSNorm 不像 LayerNorm 那样对数值进行居中和缩放,而是仅使用它们的均方根值进行缩放。同样的稳定效果,更少的计算量。
为什么我们需要归一化?
假设我们有一个有 100 层的深度神经网络。在每一层,数值会与权重相乘、相加,并通过激活函数。
问题来了。经过许多层之后,这些数值可能会:
- 变得非常大——在训练期间,这会导致梯度爆炸问题
- 变得非常小——在训练期间,这会导致梯度消失问题
当这种情况发生时,网络变得不稳定。训练变慢。有时甚至完全无法学习。
于是,归一化就来救场了。归一化让每一层的数值保持在稳定、健康的范围内——不会太大,也不会太小。这使得训练更快、更稳定。
Layer Normalization 快速回顾
在深入 RMSNorm 之前,我们需要快速回顾一下 Layer Normalization(LayerNorm) 的工作原理,因为 RMSNorm 是它的简化版本。
LayerNorm 接收一个数值向量,并做两件事:
第 1 步:重新居中。 减去均值,使数值以零为中心。
第 2 步:重新缩放。 除以标准差,使数值具有一致的分布范围。
然后它应用两个可学习的参数——
gamma
和
beta
——以便网络在需要时可以调整输出。
公式如下:
LayerNorm(x) = gamma * (x - mean) / sqrt(variance + eps) + beta
其中:
- mean 是向量中数值的平均值
- variance 是数值的分散程度
- eps 是一个极小的数,用于避免除以零
- gamma 和 beta 是可学习的参数
LayerNorm 效果非常好。最初的 Transformer 论文就使用了它。但研究人员提出了一个问题:
我们真的需要重新居中和重新缩放这两个步骤吗?还是其中一个就足够了?
这个问题催生了 RMSNorm。
什么是 RMSNorm?
RMSNorm(Root Mean Square Normalization,均方根归一化) 是 LayerNorm 的简化版本,它只保留重新缩放这一步,去掉了重新居中这一步。
简单来说:
RMSNorm = 只保留重新缩放步骤的 LayerNorm。
它由 Biao Zhang 和 Rico Sennrich 于 2019 年在其论文 "Root Mean Square Layer Normalization" 中提出。
核心洞察是:
LayerNorm 的大部分收益来自重新缩放这一步,而不是重新居中这一步。
因此,如果我们跳过减去均值的操作,就能在不损失精度的情况下节省计算量。
下面是一个容易记住的心智模型:
LayerNorm 同时控制平移和缩放。RMSNorm 只控制缩放——而事实证明这就足够了。
现在,一个自然的问题出现了——如果我们不重新居中数值,网络如何处理均值的偏移?答案是,Transformer 中到处都有残差连接和可学习的投影层。它们可以自行吸收均值的偏移。所以网络不需要归一化来替它完成这项工作。而缩放才是真正需要专门处理的部分,这就是 RMSNorm 在实践中足够有效的原因。
让我们来看看它具体是如何工作的。
RMSNorm 背后的数学原理
RMSNorm 使用输入向量的均方根(RMS)来缩放数值。
我们按顺序做三件事:
第 1 步: 对向量中的每个数值求平方。
第 2 步: 取这些平方值的均值(平均数)。
第 3 步: 对该均值取平方根。
就是这样。得到的结果就是 RMS 值。
直观地说,RMS 值告诉我们向量中数值的典型大小。像
[100, 200, 300]
的 RMS 很大。而像
[0.01, 0.02, 0.03]
这样的向量 RMS 很小。将每个值除以 RMS 后,我们去掉了整体的大小,只保留相对形状。这正是我们希望归一化做到的。
公式如下:
RMS(x) = sqrt( (x1^2 + x2^2 + ... + xn^2) / n )
其中
n
是向量中值的数量。
得到 RMS 后,RMSNorm 的公式为:
RMSNorm(x) = gamma * x / RMS(x)
其中:
- x 是输入向量
- RMS(x) 是向量的均方根
- gamma 是一个可学习的参数(每个维度一个)
为什么我们还需要
gamma
呢?因为除以 RMS 会强制每个向量都变成固定的大小,这限制太强了。
gamma
给了网络一个旋钮,可以把每个维度拉伸或缩小回对任务真正有用的尺度。所以归一化稳定了训练,而
gamma
确保我们不会在这个过程中失去表达能力。
在实践中,我们在平方根内加上一个很小的数
eps
以避免除以零:
RMSNorm(x) = gamma * x / sqrt( mean(x^2) + eps )
注意 RMSNorm 中没有
beta
。我们不需要对输出做平移,因为我们从一开始就没有减去均值。
正在计划转型进入 AI 领域?
无论你今天在哪个技术领域工作,只要付出努力,你都可以转型到以下这些角色:
- AI 工程师
- 前沿部署工程师
- AI Agent 工程师
- Harness 工程师
- 语音 AI 工程师
- AI 架构师
- LLM 工程师
- LLM 推理工程师
- 生成式 AI 工程师
- MLOps 工程师
- 机器学习工程师
- 深度学习工程师
Outcome School 的 AI 与机器学习课程 将带你到达那里。
让我们用真实数字来直观理解
通过例子学习是最好的学习方式。
假设我们有一个包含 4 个值的输入向量:
x = [2, 4, 4, 8]
第 1 步:将每个值平方。
[2^2, 4^2, 4^2, 8^2] = [4, 16, 16, 64]
第 2 步:取平方的平均值。
mean = (4 + 16 + 16 + 64) / 4 = 100 / 4 = 25
第 3 步:取平方根。
RMS(x) = sqrt(25) = 5
第 4 步:将每个输入值除以 RMS。
x / RMS(x) = [2/5, 4/5, 4/5, 8/5] = [0.4, 0.8, 0.8, 1.6]
第 5 步:乘以 gamma。 为了便于理解,我们假设 gamma 为
[1, 1, 1, 1]
.
RMSNorm(x) = [0.4, 0.8, 0.8, 1.6]
现在数值被缩放到了一个健康的范围。这就是 RMSNorm 所做的全部工作。
LayerNorm 与 RMSNorm——关键区别
让我用表格列出 LayerNorm 和 RMSNorm 之间的区别,以便你更好地理解。
| LayerNorm | RMSNorm |
|---|---|
| 重新居中(减去均值)并重新缩放(除以标准差) | 只重新缩放(除以 RMS) |
| 有两个可学习参数:gamma 和 beta | 只有一个可学习参数:gamma |
| 较慢 - 需要同时计算均值和方差 | 较快 - 只计算 RMS |
| 用于最初的 Transformer、BERT、GPT-2 | 用于 Llama、Mistral、Gemma、Qwen、PaLM、DeepSeek |
为了直观地看到区别,下面是两条流程的并排对比:
LayerNorm:
x --> [ subtract mean ] --> [ divide by std ] --> [ * gamma + beta ] --> output
RMSNorm:
x --> [ skipped ] --> [ divide by RMS ] --> [ * gamma ] --> output
^^^^^^^ ^^^^^^^
re-centering step no beta,
removed one parameter在这里,我们可以看到 RMSNorm 完全去掉了减去均值的步骤,同时也去掉了
beta
参数。其余部分与 LayerNorm 的思路相同。
给你的一个简短提示
无论你在哪个技术领域工作,都请熟悉以下这些主题:
- LLM
- RAG
- MCP
- Agent
- 微调
- 量化
我们把它们全部整合在一个视频中:
AI 工程详解:LLM、RAG、MCP、Agent、微调与量化
不必停下阅读——收藏它,等有空时再看。未来的你会感谢现在的自己。
现在,让我们回到正题。
为什么现代大语言模型更青睐 RMSNorm
现在,一个自然的问题出现了——为什么大多数现代 LLM 使用 RMSNorm 而不是 LayerNorm?
答案归结为三个原因。
原因一:速度。 RMSNorm 比 LayerNorm 的计算量更少。它跳过了均值减法和方差计算。在小的向量上,这可能看起来不算什么。但 LLM 拥有数十亿参数、数万亿 token,并且每次前向传播中有几十到上百次归一化调用(每个 Transformer 块两次,跨多个块堆叠)。每次调用的小节省累积起来就是总体的大节省。原论文报告称,根据模型和任务的不同,训练时间减少了 7% 到 64%。训练变得更快,推理也变得更快。
原因二:准确率大体相同。 原始的 RMSNorm 论文表明,用 RMSNorm 训练的模型可以达到与用 LayerNorm 训练的模型相同的准确率——有时略好,有时略差,但大体相同。我们在不损失质量的情况下获得了速度优势。
原因三:实现更简单。 RMSNorm 比 LayerNorm 的组成部分更少。它更容易实现,也更容易理解。少了一个参数(
beta
),少了一个需要计算的统计量(均值),内核更简洁,也更容易在 GPU 上高效融合。当我们跨数千个 GPU 以数万亿 token 的规模进行训练时,这种简单性非常重要。
这就是为什么现代 LLM 技术栈几乎完全切换到了 RMSNorm。
要深入学习 LLM 内部机制、LLM 基础知识和深度学习,请查看 Outcome School 的 AI 与机器学习课程。
代码示例
让我们看看 RMSNorm 的代码,如下所示:
import torch
import torch.nn as nn
class RMSNorm(nn.Module):
def __init__(self, dim, eps=1e-6):
super().__init__()
self.eps = eps
self.gamma = nn.Parameter(torch.ones(dim))
def forward(self, x):
# Square each value and take the mean along the last dimension
mean_square = x.pow(2).mean(dim=-1, keepdim=True)
# Take the square root to get RMS (eps added for stability)
rms = torch.sqrt(mean_square + self.eps)
# Scale the input: divide by RMS and multiply by gamma
return self.gamma * x / rms在这里,我们可以看到:
- 我们只有一个可学习参数——gamma。没有 beta。
- 我们沿最后一个维度计算平方值的均值。
- 我们取该均值的平方根得到 RMS。
- 我们将输入除以 RMS,再乘以 gamma。
这就是全部实现。非常简单。
保持更新: 订阅我们的 新闻通讯,将最新的 AI 和机器学习博客直接发送到你的收件箱。
RMSNorm 在 Transformer 中的位置
在像 Llama 这样的现代 LLM 中,RMSNorm 在每个 Transformer 块内的两个位置被应用:
- 在注意力块之前
- 在前馈块之前
这种风格称为 pre-norm(前置归一化),意思是先对输入进行归一化,然后再传入注意力层或前馈层。Pre-norm 有助于在非常深的网络中保持训练稳定性,这就是为什么几乎所有现代大语言模型都采用它。
下面是一个使用 pre-norm RMSNorm 的 Transformer 块的样子:
input x
|
+----------+ <- residual path
| v
| [ RMSNorm ]
| |
| v
| [ Attention ]
| |
+--------> (+)
|
+----------+ <- residual path
| v
| [ RMSNorm ]
| |
| v
| [ FFN ]
| |
+--------> (+)
|
v
output可以看到,每个 RMSNorm 都位于重计算层(Attention 或 FFN)之前,而不是之后。残差路径绕过整个块,因此原始输入可以不受影响地直接流过。
在模型的最末尾、最终输出投影之前,还会额外应用一个 RMSNorm。这最后一次归一化使隐藏状态在投影成 logits 之前保持在一个稳定的范围内。
我们有一篇关于 Transformer 架构的详细博客,解释了归一化在整个流程中的位置。
如果你想端到端地深入学习 Transformer 架构、Attention 和前馈网络,请查看 Outcome School 的 AI 与机器学习课程。
快速总结
让我们回顾一下所学到的内容:
- 归一化使流经深度网络的数值保持在健康的范围内,从而使训练更快、更稳定。
- LayerNorm 做两件事——重新居中数值(减去均值)并重新缩放(除以标准差)。
- RMSNorm 只保留重新缩放这一步。它将输入除以其均方根值。
- 均方根正如其名——平方的平均值再开平方根。
- RMSNorm 比 LayerNorm 更快,因为它跳过了均值减法和方差计算。
- 准确率大致相同。 原论文表明 RMSNorm 在质量上与 LayerNorm 相当——有时略好,有时略差。我们基本上是免费获得了速度上的好处。
- Llama、Mistral、Gemma、Qwen、PaLM 和 DeepSeek 等现代大语言模型都使用 RMSNorm。
- 只有一个可学习参数——gamma。它在向量的每个维度上各有一个值。RMSNorm 中没有 beta。
我们已经学习了 RMSNorm 的工作原理、它为什么比 LayerNorm 更快,以及为什么大多数现代大语言模型都采用了它。
常见问题
RMSNorm 的准确率比 LayerNorm 低吗?
不是。原始的 RMSNorm 论文表明,使用 RMSNorm 训练的模型达到的准确率与使用 LayerNorm 训练的模型大致相同,有时略好,有时略差。所以我们获得了速度上的好处,却没有损失质量。
如果 RMSNorm 不重新居中,Transformer 如何处理均值偏移?
Transformer 中到处都有残差连接和可学习的投影,它们可以自行吸收均值偏移。所以网络不需要归一化来完成这项工作。真正需要专门处理的是尺度,这就是为什么在实践中 RMSNorm 就足够了。
为什么 RMSNorm 没有 beta 参数?
RMSNorm 不需要
beta
,因为它从一开始就不减去均值,所以没有什么需要移回的。它只保留一个可学习参数
gamma
,每个维度一个值。这让网络可以将每个维度拉伸或收缩到有用的尺度。
RMSNorm 中 eps 的用途是什么?
这个
eps
值是一个很小的数,加在平方根内部以避免除以零。所以实际中的公式变为
gamma * x / sqrt(mean(x^2) + eps)
。在代码示例中,
eps
默认为
1e-6
.
RMSNorm 是谁提出的?
RMSNorm 由 Biao Zhang 和 Rico Sennrich 在 2019 年的论文 "Root Mean Square Layer Normalization" 中提出。他们的关键洞察是:LayerNorm 的大部分收益来自重新缩放步骤,而不是重新居中步骤。
目前就到这里。
感谢
Amit Shekhar Outcome School 创始人
你可以通过以下方式与我联系:
关注 Outcome School: