大模型归一化技术详解:LayerNorm、RMSNorm、BatchNorm 原理与实战
一、什么是大模型归一化?

在深度学习和大语言模型(LLM)中,归一化(Normalization)是一项非常重要的基础技术。
无论是 BERT、GPT,还是 LLaMA、Qwen 等主流大语言模型,都离不开归一化操作。
那么,为什么大模型需要归一化?
我们可以先思考一个问题:
假设神经网络某一层的输入数据分布发生了较大变化,那么后续网络就需要不断适应新的输入分布。这可能导致训练不稳定、梯度变化剧烈,甚至影响模型收敛速度。
归一化的核心目的,就是对数据进行适当的尺度调整,让神经网络的训练更加稳定。
在大模型中,归一化主要解决以下几个问题:
-
稳定训练过程:降低激活值分布变化对网络训练的影响。
-
改善梯度传播:帮助深层网络保持相对稳定的梯度。
-
加速模型收敛:让优化过程更加平稳。
-
提高数值稳定性:降低极端数值对模型计算的影响。
需要注意,归一化并不是简单地把数据压缩到 0~1,而是根据不同的统计维度,对特征进行标准化处理。
目前,大模型中常见的归一化方法包括:
-
BatchNorm:批归一化
-
LayerNorm:层归一化
-
RMSNorm:均方根归一化
-
GroupNorm:组归一化
-
Pre-Norm:前置归一化结构
-
Post-Norm:后置归一化结构
其中,LayerNorm 和 RMSNorm 是 Transformer 大模型中非常重要的两种归一化方法。
二、归一化的数学原理
2.1 标准化的基本思想
在介绍具体归一化方法之前,我们先理解标准化的数学原理。
假设输入数据为:
首先计算均值:
然后计算方差:
最后进行标准化:
其中:
-
:数据均值。
-
:数据方差。
-
:防止分母为零的极小常数。
-
:标准化后的数据。
经过处理后,数据的均值接近 0,方差接近 1。
为了增强模型的表达能力,归一化层通常还会引入两个可学习参数:
其中:
-
:缩放参数。
-
(\
:平移参数。
这两个参数通过反向传播进行学习,使模型能够自主调整归一化后的特征分布。
2.2 为什么大模型需要归一化?
Transformer 通常包含大量重复的网络层。
随着网络深度增加,数据需要经过多次注意力计算、前馈网络和残差连接。
如果没有合理的数值控制,网络训练可能出现梯度不稳定、激活值异常等问题。
归一化可以在网络计算过程中对特征进行调整,帮助模型保持稳定的数值范围。
不过,归一化并不能从根本上消除梯度消失和梯度爆炸,它需要与残差连接、初始化方法、优化器以及学习率策略等共同发挥作用。
三、BatchNorm:批归一化
3.1 BatchNorm 的基本原理
BatchNorm(Batch Normalization)由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。
它的核心思想是:
根据一个 Batch 中的数据统计信息,对输入特征进行标准化。
假设输入数据为:
其中:
-
N:Batch Size。
-
C:通道数。
-
H:特征图高度。
-
W:特征图宽度。
BatchNorm 通常针对每个通道计算均值和方差。
其计算过程为:
然后执行标准化:
最后通过可学习参数调整输出:
3.2 BatchNorm 的优缺点
优点:
-
可以稳定深度神经网络训练。
-
在 CNN 中具有广泛应用。
-
能够在一定程度上加快模型收敛。
-
利用 Batch 统计信息进行特征标准化。
缺点:
-
训练依赖 Batch 统计信息。
-
小 Batch 场景下统计量可能不稳定。
-
训练阶段和推理阶段的计算方式存在差异。
-
分布式训练需要考虑统计量同步问题。
3.3 为什么 BatchNorm 不适合直接用于传统 Transformer?
BatchNorm 主要按照 Batch 维度和空间维度统计特征。
而 Transformer 的输入通常具有以下形式:
其中:
-
B:批次大小。
-
T:序列长度。
-
D:隐藏层维度。
语言模型的序列长度可能不同,Batch 中不同样本的有效 Token 数量也可能不同。
此外,自回归大模型推理通常采用逐 Token 生成、动态批处理等方式,Batch 统计量并不总是适合这种场景。
因此,Transformer 通常更倾向于使用 LayerNorm 或 RMSNorm。
四、LayerNorm:层归一化
4.1 LayerNorm 是什么?
LayerNorm(Layer Normalization)是 Transformer 中最经典的归一化方法之一。
与 BatchNorm 不同,LayerNorm 不依赖 Batch 中其他样本的统计信息。
它针对单个样本的特征维度进行归一化。
假设输入为:
LayerNorm 通常对每个 Token 的隐藏维度 D 计算均值和方差。
也就是说,每个 Token 都独立完成归一化。
4.2 LayerNorm 数学公式
首先计算当前 Token 的特征均值:
然后计算方差:
执行标准化:
最后通过可学习参数进行缩放和平移:
其中,(\gamma) 和 (\beta) 的维度通常与隐藏层维度 D 一致。
4.3 LayerNorm 的特点
LayerNorm 具有以下特点:
-
不依赖 Batch Size。
-
每个 Token 独立进行归一化。
-
适合变长序列。
-
训练和推理时使用相同的归一化统计方式。
-
能够较好地适应 Transformer 架构。
因此,LayerNorm 被广泛应用于 BERT、GPT 等 Transformer 模型中。
4.4 PyTorch 实现 LayerNorm
下面使用 PyTorch 实现一个简单的 LayerNorm。
import torch
import torch.nn as nn
class MyLayerNorm(nn.Module):
def __init__(self, hidden_size, eps=1e-5):
super().__init__()
self.eps = eps
# 可学习参数
self.gamma = nn.Parameter(
torch.ones(hidden_size)
)
self.beta = nn.Parameter(
torch.zeros(hidden_size)
)
def forward(self, x):
# 计算均值
mean = x.mean(dim=-1, keepdim=True)
# 计算方差
var = x.var(
dim=-1,
unbiased=False,
keepdim=True
)
# 标准化
x_norm = (x - mean) / torch.sqrt(
var + self.eps
)
# 缩放和平移
return self.gamma * x_norm + self.beta
# 测试
x = torch.randn(2, 5, 768)
layer_norm = MyLayerNorm(768)
output = layer_norm(x)
print("输入形状:", x.shape)
print("输出形状:", output.shape)
输出:
输入形状: torch.Size([2, 5, 768])
输出形状: torch.Size([2, 5, 768])
可以看到,LayerNorm 不会改变输入张量的形状,只会对特征进行归一化处理。
PyTorch 也提供了官方实现:
layer_norm = nn.LayerNorm(768)
output = layer_norm(x)
五、RMSNorm:均方根归一化
5.1 RMSNorm 是什么?
RMSNorm(Root Mean Square Layer Normalization)是一种更加简化的归一化方法。
它由论文《Root Mean Square Layer Normalization》提出。
RMSNorm 的核心思想是:
不再计算输入特征的均值,也不执行中心化操作,而是直接利用均方根(RMS)对特征进行缩放。
相比 LayerNorm,RMSNorm 去掉了均值计算和偏移参数,能够减少部分计算开销。
目前,RMSNorm 已经被广泛应用于许多现代大语言模型中,例如 LLaMA 系列等。
5.2 RMSNorm 数学公式
首先计算输入特征的均方根:
然后执行归一化:
最后乘以可学习缩放参数:
合并后得到:
与 LayerNorm 相比,RMSNorm 通常不包含可学习的偏移参数 (\beta)。
5.3 RMSNorm 为什么更适合大模型?
RMSNorm 主要具有三个优势。
第一,计算过程更加简单。
LayerNorm 需要计算均值、方差,并执行中心化操作。
RMSNorm 不需要计算均值,只需要计算平方均值和平方根。
第二,减少部分计算开销。
对于隐藏维度很大的 Transformer,归一化操作会在大量网络层中重复执行。
RMSNorm 的简化计算有助于降低归一化部分的计算开销。
第三,适合大规模 Transformer。
在现代大语言模型中,RMSNorm 已经成为常见的归一化选择。
需要注意,RMSNorm 并不意味着一定能够让整个模型训练速度大幅提升。实际收益还与隐藏维度、硬件、算子融合和实现方式有关。
5.4 PyTorch 实现 RMSNorm
下面手动实现一个 RMSNorm。
import torch
import torch.nn as nn
class RMSNorm(nn.Module):
def __init__(self, hidden_size, eps=1e-6):
super().__init__()
self.eps = eps
# 可学习缩放参数
self.weight = nn.Parameter(
torch.ones(hidden_size)
)
def forward(self, x):
# 计算均方根的平方部分
variance = x.pow(2).mean(
dim=-1,
keepdim=True
)
# RMS 归一化
x_norm = x * torch.rsqrt(
variance + self.eps
)
# 缩放
return self.weight * x_norm
# 测试
x = torch.randn(2, 5, 768)
rms_norm = RMSNorm(768)
output = rms_norm(x)
print("输入形状:", x.shape)
print("输出形状:", output.shape)
输出:
输入形状: torch.Size([2, 5, 768])
输出形状: torch.Size([2, 5, 768])
PyTorch 也提供了对应的官方模块:
rms_norm = nn.RMSNorm(768)
output = rms_norm(x)
实际使用时,需要注意不同框架和模型实现中的 epsilon、参数初始化和数值精度设置可能有所不同。
六、LayerNorm 与 RMSNorm 的核心区别
LayerNorm 和 RMSNorm 是大模型中最值得掌握的两种归一化技术。
它们最大的区别在于是否进行均值中心化。
| 对比维度 | LayerNorm | RMSNorm |
|---|---|---|
| 计算均值 | 是 | 否 |
| 计算方差 | 是 | 否 |
| 计算均方根 | 否 | 是 |
| 中心化操作 | 有 | 无 |
| 缩放参数 | 有 | 有 |
| 偏移参数 | 通常有 | 通常没有 |
| 计算复杂度 | 相对较高 | 相对较低 |
| 大模型应用 | 广泛 | 广泛 |
从公式上看:
LayerNorm:
RMSNorm:
两者都能够对特征进行尺度调整,但处理方式不同。
LayerNorm 同时进行中心化和缩放,而 RMSNorm 主要进行缩放。
七、Pre-Norm 与 Post-Norm:Transformer 中的归一化位置
除了归一化算法本身,归一化在 Transformer 中的位置也非常重要。
Transformer 中常见的两种结构是:
-
Pre-Norm:前置归一化。
-
Post-Norm:后置归一化。
7.1 Post-Norm 结构
Post-Norm 是原始 Transformer 采用的归一化布局之一。
它将归一化放在残差连接之后。
数学表达式:
其中:
-
X:输入特征。
-
F(X):注意力模块或前馈网络的输出。
-
Norm:归一化操作。
计算流程:
输入 X
|
v
注意力机制
|
v
残差连接 Add
|
v
LayerNorm
|
v
输出
这种结构能够对残差相加后的特征进行归一化。
但是,当网络非常深时,Post-Norm 在某些训练设置下可能面临优化和梯度传播方面的挑战。
7.2 Pre-Norm 结构
Pre-Norm 将归一化放在子层计算之前。
数学表达式:
计算流程:
输入 X
|
v
LayerNorm / RMSNorm
|
v
注意力机制
|
v
残差连接 Add
|
v
输出
Pre-Norm 保留了更加直接的残差路径,在深层 Transformer 中通常具有较好的训练稳定性。
现代很多大语言模型采用 Pre-Norm 或其变体。
7.3 Pre-Norm 与 Post-Norm 对比
| 对比维度 | Pre-Norm | Post-Norm |
|---|---|---|
| 归一化位置 | 子层之前 | 残差连接之后 |
| 梯度传播 | 残差路径更直接 | 经过归一化 |
| 深层训练 | 通常更容易稳定 | 对训练设置更敏感 |
| 训练难度 | 通常较低 | 可能较高 |
| 应用 | 现代大模型常见 | 原始 Transformer 等 |
需要注意,Pre-Norm 并不代表所有情况下都优于 Post-Norm,具体表现还取决于网络结构、初始化和训练策略。
八、归一化在大模型中的实际应用
8.1 GPT 模型
GPT 属于 Decoder-only Transformer 架构。
其网络主要由多个 Transformer Block 堆叠而成。
每个 Block 通常包含:
-
多头自注意力机制。
-
残差连接。
-
归一化。
-
前馈神经网络。
-
残差连接。
具体归一化类型和位置取决于 GPT 的具体版本与实现。
8.2 LLaMA 模型
LLaMA 系列模型采用 RMSNorm。
在 Transformer Block 中,注意力模块和 FFN 模块前通常会进行 RMSNorm。
简化结构:
输入 Hidden States
|
v
RMSNorm
|
v
Self-Attention
|
v
Residual
|
v
RMSNorm
|
v
FFN
|
v
Residual
|
v
输出
RMSNorm 使模型能够在保持特征尺度稳定的同时,减少部分归一化计算。
8.3 Qwen 等现代大模型
许多现代 Decoder-only 大模型也采用 RMSNorm 或相关变体。
不同模型可能在以下方面有所差异:
-
RMSNorm 的 epsilon 设置。
-
归一化层的具体位置。
-
是否使用额外的输出归一化。
-
计算精度和算子实现。
-
残差连接的具体设计。
因此,在阅读模型源码时,不能只看模型名称,还需要检查具体配置文件和网络实现。
九、归一化实战:在 Transformer 中使用 RMSNorm
理解了归一化原理之后,我们可以尝试将 RMSNorm 集成到一个简单的 Transformer Block 中。
import torch
import torch.nn as nn
class RMSNorm(nn.Module):
def __init__(self, dim, eps=1e-6):
super().__init__()
self.eps = eps
self.weight = nn.Parameter(
torch.ones(dim)
)
def forward(self, x):
rms = torch.sqrt(
x.pow(2).mean(
dim=-1,
keepdim=True
) + self.eps
)
return self.weight * (x / rms)
class TransformerBlock(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.norm1 = RMSNorm(dim)
self.norm2 = RMSNorm(dim)
self.attention = nn.MultiheadAttention(
embed_dim=dim,
num_heads=num_heads,
batch_first=True
)
self.ffn = nn.Sequential(
nn.Linear(dim, dim * 4),
nn.GELU(),
nn.Linear(dim * 4, dim)
)
def forward(self, x):
# Pre-Norm + Attention
residual = x
x_norm = self.norm1(x)
attn_output, _ = self.attention(
x_norm,
x_norm,
x_norm
)
x = residual + attn_output
# Pre-Norm + FFN
residual = x
x_norm = self.norm2(x)
ffn_output = self.ffn(x_norm)
x = residual + ffn_output
return x
# 测试
x = torch.randn(2, 10, 768)
model = TransformerBlock(
dim=768,
num_heads=12
)
output = model(x)
print("输入形状:", x.shape)
print("输出形状:", output.shape)
输出:
输入形状: torch.Size([2, 10, 768])
输出形状: torch.Size([2, 10, 768])
这个例子实现了一个简化的 Pre-Norm Transformer Block。
实际的大语言模型还需要考虑因果注意力 Mask、位置编码、KV Cache、模型初始化以及混合精度等问题。
十、归一化技术常见面试题
1. 什么是归一化?为什么大模型需要归一化?
归一化是对神经网络中的特征进行尺度调整的操作。
它可以帮助稳定训练过程、改善数值分布,并与残差连接等结构共同改善深层网络的优化表现。
2. BatchNorm 和 LayerNorm 有什么区别?
BatchNorm 主要根据 Batch 维度统计特征,而 LayerNorm 通常针对单个样本的特征维度计算均值和方差。
BatchNorm 依赖 Batch 统计信息,LayerNorm 不依赖其他样本的数据。
3. 为什么 Transformer 更常用 LayerNorm?
Transformer 的输入具有 Batch、Sequence、Hidden 等维度。
LayerNorm 可以针对每个 Token 的隐藏特征独立归一化,不依赖 Batch Size,因此更加适合变长序列和语言模型训练。
4. RMSNorm 和 LayerNorm 有什么区别?
LayerNorm 会计算均值和方差,并进行中心化与缩放。
RMSNorm 不计算均值,而是使用均方根进行尺度调整,计算过程更加简单。
5. 为什么 LLaMA 使用 RMSNorm?
RMSNorm 能够简化归一化计算,在保留特征尺度调整能力的同时减少部分计算开销,因此适合大规模 Transformer 架构。
6. 什么是 Pre-Norm?
Pre-Norm 是一种将归一化放在注意力模块或 FFN 模块之前的结构。
它保留了更直接的残差路径,通常有利于深层 Transformer 的训练稳定性。
7. 归一化会改变张量形状吗?
通常不会。
LayerNorm 和 RMSNorm 主要改变特征数值,不改变输入张量的形状。
8. RMSNorm 是否完全取代 LayerNorm?
不是。
不同任务和模型架构对归一化的需求不同。LayerNorm 仍然广泛应用于各类 Transformer 和其他神经网络。
十一、总结
归一化是大语言模型中非常重要的基础技术。
本文介绍了 BatchNorm、LayerNorm、RMSNorm,以及 Transformer 中常见的 Pre-Norm 和 Post-Norm 结构。
核心知识点总结:
-
BatchNorm:根据 Batch 统计信息进行归一化,在 CNN 中应用广泛。
-
LayerNorm:针对单个样本的特征维度计算均值和方差,是 Transformer 中的经典归一化方法。
-
RMSNorm:通过均方根进行尺度调整,不执行均值中心化,是现代大模型常用的归一化方案。
-
Pre-Norm:将归一化放在网络子层之前,有助于改善深层 Transformer 的训练稳定性。
-
Post-Norm:将归一化放在残差连接之后,是原始 Transformer 采用的结构之一。
对于想要学习大模型底层原理的同学,建议按照以下顺序学习:
深度学习基础 → BatchNorm → LayerNorm → RMSNorm → Transformer → GPT / LLaMA 架构 → 大模型训练与推理优化。
不要只停留在公式层面,最好结合 PyTorch 手动实现归一化层,再阅读 LLaMA、Qwen 等开源模型的源码,理解归一化在真实大模型中的位置和作用。
只有把数学原理、代码实现和模型架构结合起来,才能真正理解大模型归一化技术。
更多推荐

所有评论(0)