LayerNorm不同于BatchNorm,其與batch大小無關,均值和方差 在 每個樣本的特征維度 C 內計算,
適用于 變長輸入(如 NLP 任務中的 Transformer)
詳細的BatchNorm在之前的一篇文章進行了詳細的介紹:深度學習中Batch Normalization(BN)原理、作用淺析-CSDN博客
這里主要介紹適合于Transformer架構的兩個歸一化操作RMSNorm 和 LayerNorm
RMSNorm 和 LayerNorm 的本質區別
RMSNorm(Root Mean Square Normalization)和 LayerNorm(Layer Normalization)都是 歸一化方法,但它們的本質區別在于 是否去均值(Mean-Centering) 以及 歸一化的方式。
LayerNorm公式
- μ:均值,計算的是特征
x
在d
維度上的平均值。 - σ2:方差,用于衡量數值分布的變化范圍。
- γ,β:可學習的縮放和偏移參數。
- LayerNorm 不僅僅縮放數據,還會讓其均值歸一化到
0
,保證分布居中
RMSNorm公式
- RMSNorm 直接用
RMS(x)
歸一化,而不去均值。 - RMSNorm 只調整
L2
范數的大小,不影響數據的中心位置。
代碼實現
class LayerNorm(nn.Module):def __init__(self, dim, eps=1e-5):super().__init__()self.eps = epsself.weight = nn.Parameter(torch.ones(dim))self.bias = nn.Parameter(torch.zeros(dim))def forward(self, x):mean = x.mean(dim=-1, keepdim=True)std = x.var(dim=-1, keepdim=True, unbiased=False).sqrt()return self.weight * (x - mean) / (std + self.eps) + self.biasclass RMSNorm(nn.Module):def __init__(self, dim, eps=1e-5):super().__init__()self.eps = epsself.weight = nn.Parameter(torch.ones(dim))def forward(self, x):rms = torch.sqrt(torch.mean(x ** 2, dim=-1, keepdim=True) + self.eps)return self.weight * (x / rms)
RMSNorm 的優缺點
LayerNorm 的優點
- 更穩定的梯度更新
- 由于均值歸 0,梯度更新不會受到偏移影響。
- 適用于 Transformer、BERT、GPT。
- 適用于不同任務
- 既可以用于 NLP(Transformer),也可以用于 CNN。
- 適用于變長輸入(如 RNN、BERT)。
- 訓練和推理一致
- LayerNorm 不依賴 batch_size,在訓練和推理時表現一致。
LayerNorm 的缺點
- 計算量大
- 需要 計算均值和方差,相比 RMSNorm 額外增加一次均值計算,計算量更高。
- 計算開銷大,不適合大模型
- 在 大規模 Transformer(如 LLaMA) 中,LayerNorm 計算量太大,影響訓練速度。
- 對 batch_size 影響較大
- 在 小 batch_size 時,LayerNorm 可能表現不穩定。
RMSNorm 的優缺點
RMSNorm 的優點
- 計算更快
- 僅計算 L2 歸一化,比 LayerNorm 計算量少 約 30%。
- 適用于大模型(如 LLaMA, GPT-4)
- 在 大模型訓練中,RMSNorm 比 LayerNorm 更高效。
RMSNorm 的缺點
- 不去均值,可能影響訓練穩定性
- 在某些任務中,均值歸 0 能穩定訓練,而 RMSNorm 不能。
- 不適用于 CNN
- CNN 依賴均值信息,RMSNorm 不計算均值,可能導致訓練不穩定。
總結
RMSNorm通過簡化歸一化過程,降低計算復雜度,提供了一種有效的歸一化方法。它在保持模型性能的同時,提高了計算效率,是LayerNorm的有力替代方案。