第四章:大模型(LLM)
第九部分:最强开源大模型:Llama3 原理介绍与实现
第二节:归一化方法:Normalization & RMSNorm
1.归一化的背景与作用
在深度学习中,尤其是大模型(LLM)中,网络非常深,训练中容易出现梯度消失或梯度爆炸的问题。归一化(Normalization)方法的出现,就是为了让每一层的输入分布更加稳定,从而提高训练效率与模型性能。
主要作用:
-
稳定训练:避免梯度消失或梯度爆炸。
-
加快收敛:梯度的尺度统一后,优化器可以更快找到最优解。
-
提高泛化能力:减少内部协变量偏移(Internal Covariate Shift)。
常见归一化方法:
-
BatchNorm:按批次归一化,常用于 CV。
-
LayerNorm:按层归一化,更适合 Transformer。
-
RMSNorm:LayerNorm 的一种变种,计算量更小,Llama 系列采用它。
2.Layer Normalization(层归一化)
原理
对输入向量 (假设是 Transformer 一层的特征向量)进行归一化:
其中:
然后再进行仿射变换:
-
γ,β 是可训练参数(scale 和 shift)。
-
ϵ 是防止除零的小常数。
特点
-
归一化操作在特征维度上进行,而不是批次维度。
-
Transformer 中广泛采用,因为不依赖 batch size。
3.RMSNorm(Root Mean Square Normalization)
Llama 系列采用 RMSNorm 替代 LayerNorm,它可以减少计算量,同时保持性能。
原理
RMSNorm 只使用均方根(Root Mean Square)来归一化,不再减去均值:
归一化公式:
-
g 是可训练的 scale 参数(对应 LayerNorm 的 γ)。
-
不使用 shift(β)参数。
-
RMSNorm 的核心是去中心化操作,只关注向量的整体幅度,而不减去均值。
优点
-
计算更高效:省略减均值操作。
-
梯度传播更稳定:只对尺度进行归一化。
-
效果接近 LayerNorm,尤其在 LLM 中表现优秀。
4.Llama3 中的归一化实现
在 Llama3 的 Transformer 层中,RMSNorm 被用于:
-
Self-Attention 模块前
-
FeedForward 模块前
核心 PyTorch 代码示例(伪代码):
import torch
import torch.nn as nn
class RMSNorm(nn.Module):
def __init__(self, dim, eps=1e-6):
super().__init__()
self.eps = eps
self.scale = nn.Parameter(torch.ones(dim))
def forward(self, x):
# 计算均方根
rms = x.norm(2, dim=-1, keepdim=True) / (x.shape[-1] ** 0.5)
# 归一化
x_norm = x / (rms + self.eps)
return x_norm * self.scale
注意点
-
x.norm(2, dim=-1)
计算的是每个向量的 L2 范数。 -
除以向量长度的平方根,保证归一化结果不随向量维度改变。
-
self.scale
允许模型重新学习合适的尺度。
5.总结对比
方法 | 均值中心化 | 参数 | 计算量 | 应用 |
---|---|---|---|---|
LayerNorm | ✅ | γ, β | 较高 | Transformer、RNN |
RMSNorm | ❌ | γ | 较低 | Llama 系列 LLM |
小结:
-
RMSNorm 是 LayerNorm 的轻量替代方案。
-
在大模型中,尤其是 Llama3,RMSNorm 可以减少显存和计算开销,同时训练更稳定。