Layer Normalization的可学习参数:为什么gamma和beta正在从大模型中消失
2016年,Jimmy Lei Ba、Jamie Ryan Kiros和Geoffrey Hinton在论文《Layer Normalization》中提出了一个看似简单的设计:在归一化操作后添加两个可学习参数gamma和beta。九年后的今天,LLaMA、Mistral、Gemma等主流大模型都在悄悄移除这些参数——或者至少移除其中一部分。这个趋势背后隐藏着怎样的技术逻辑?
一个被忽视的设计细节
Layer Normalization的计算公式在几乎所有教科书中都被写成:
$$y = \frac{x - \mu}{\sigma} \cdot \gamma + \beta$$其中$\mu$和$\sigma$是输入的均值和标准差,$\gamma$是缩放参数,$\beta$是偏移参数。大多数初学者的直觉是:归一化把数据变成均值为0、方差为1的分布,那为什么还要加回缩放和偏移?
这个问题的答案揭示了深度学习中最容易被误解的设计之一。
为什么不是"撤销归一化"
一个常见的误解是gamma和beta会"撤销"归一化的效果。实际上,它们的作用恰恰相反——它们让归一化操作变得有意义。
考虑一个简单的问题:如果所有层的激活值都被强制归一化为均值为0、方差为1,会发生什么?答案是模型的表达能力会被严重限制。某些特征可能天然地需要更大的尺度,某些位置可能需要非零的偏移。强制归一化会抹杀这些差异。
Batch Normalization的原始论文(Ioffe和Szegedy, 2015)给出了一个关键洞察:
“The learned affine transform applied to these normalized activations allows the BN transform to represent the identity transformation.”
这句话的深层含义是:通过学习gamma和beta,归一化层可以在必要时"退回到"不进行任何变换的状态。这是一种安全网机制——如果归一化对某些特征是有害的,网络可以通过学习让gamma接近$\sigma$、beta接近$\mu$,从而近似恢复原始分布。
graph LR
A[输入x] --> B[归一化<br/>均值0方差1]
B --> C[仿射变换<br/>γ缩放 β偏移]
C --> D[输出y]
E[训练中学习] --> C
style C fill:#e1f5fe
style E fill:#fff3e0
恒等初始化的智慧
为什么PyTorch、TensorFlow和JAX都默认将gamma初始化为1、beta初始化为0?这不是随意的选择。
当$\gamma=1, \beta=0$时,LayerNorm在训练初期表现为"纯归一化"——输出是标准的均值0、方差1分布。这是一种中性起点:既没有完全抹杀归一化的效果,也没有过度干预。网络可以根据需要,在训练过程中逐步调整这两个参数。
这个设计体现了深度学习中的一个重要原则:让模型自己决定是否需要某种变换。如果某个特征确实需要保持较大的尺度,网络会在训练中学会增大对应的gamma值。
graph TD
A["初始化: γ=1, β=0"] --> B{训练过程中}
B --> C["γ→σ: 恢复原始尺度"]
B --> D["γ保持≈1: 维持归一化"]
B --> E["β→μ: 恢复原始偏移"]
B --> F["β保持≈0: 零中心输出"]
C --> G[模型自动选择最优策略]
D --> G
E --> G
F --> G
style A fill:#e8f5e9
style G fill:#c8e6c9
梯度流:gamma和beta如何影响学习
理解gamma和beta的作用,需要深入到反向传播的数学细节。设$L$为损失函数,LayerNorm的输出为$y_{bh}$(batch维度$b$,hidden维度$h$),则gamma和beta的梯度为:
$$\frac{\partial L}{\partial \gamma_q} = \frac{\partial L}{\partial y_{bq}} \cdot \frac{\mu_{bq}}{\sigma_b}$$$$\frac{\partial L}{\partial \beta_q} = \frac{\partial L}{\partial y_{bq}} \cdot \mathbf{1}_b$$这里的$\mu_{bq} = x_{bq} - m_b$是中心化后的输入,$\sigma_b = \sqrt{v_b + \epsilon}$是标准差。关键观察是:
- gamma的梯度与归一化后的激活值成正比。如果某个特征在归一化后仍然表现"异常"(值较大),它会产生更大的梯度来调整gamma。
- beta的梯度直接来自上游梯度的和。任何输出位置的误差都会直接影响beta的更新。
更复杂的是输入$x$的梯度,它涉及到gamma:
$$\frac{\partial L}{\partial x_{pq}} = \frac{\partial L}{\partial y_{pq}} \cdot \frac{\gamma_q}{\sigma_p} - \frac{\partial L}{\partial y_{ph}} \cdot \frac{\gamma_h}{H} \cdot \left(\frac{\mathbf{1}_q}{\sigma_p} + \frac{\mu_{ph}\mu_{pq}}{\sigma_p^3}\right)$$这个公式揭示了一个重要事实:gamma不仅影响缩放操作本身,还影响梯度回传的分布。较大的gamma会放大梯度信号,可能导致训练不稳定。
graph TD
subgraph "前向传播"
A1[输入 x] --> B1[计算均值μ]
A1 --> C1[计算方差σ²]
B1 --> D1[中心化 x-μ]
C1 --> E1[标准化 /σ]
D1 --> E1
E1 --> F1[缩放 ×γ]
F1 --> G1[偏移 +β]
G1 --> H1[输出 y]
end
subgraph "反向传播"
H2[∂L/∂y] --> G2[∂L/∂β]
H2 --> F2[∂L/∂γ]
H2 --> E2[∂L/∂x]
F2 --> E2
end
style F1 fill:#ffcdd2
style G1 fill:#c8e6c9
style F2 fill:#ffcdd2
style G2 fill:#c8e6c9
T5的"叛逆":移除beta参数
2020年,Google发布的T5模型做了一个看似违反直觉的设计选择:LayerNorm层中不使用beta参数,甚至不进行均值中心化。具体来说,T5使用的归一化公式是:
$$y = \frac{x}{\sqrt{\frac{1}{H}\sum x^2 + \epsilon}} \cdot \gamma$$这正是后来被称为RMSNorm的形式。为什么T5敢这样做?
T5论文给出的解释是:“removing bias and centering simplifies the implementation and has negligible impact on performance.” 但这只是表面原因。
深入分析可以发现,T5的每个Transformer层都包含一个Feed-Forward Network (FFN),这个FFN本身就有偏置参数。如果FFN的偏置已经足够表达所需的"偏移",那么LayerNorm中的beta就变得冗余。这类似于为什么现代大模型中线性层也移除了偏置——残差连接和归一化层已经在做"偏移"的工作。
RMSNorm的崛起
T5之后,LLaMA、Mistral、Gemma等模型都采用了RMSNorm。RMSNorm的设计哲学是:只做幅度归一化,不做均值中心化。
为什么这在大模型中行得通?Sebastian Raschka在分析中指出:
“RMSNorm preserves the useful magnitude-normalization behavior while removing the mean-centering step, which makes the transformer block slightly simpler and better aligned with efficiency-focused large-scale model design.”
这里的"效率"不仅指计算速度(少一次均值计算约节省15%的时间),更指训练稳定性。在大规模预训练中,均值中心化可能引入不必要的复杂性:
- 残差流的干扰:Transformer的残差连接要求各层的输出能够直接相加。如果每层都强制均值为0,会破坏残差流中的信息累积。
- Pre-LN架构的特殊性:现代大模型普遍采用Pre-LN(归一化在子层之前),此时输入的分布已经被上一层调整过,强制中心化可能矫枉过正。
graph TD
subgraph "Post-LN (原始Transformer)"
A1[输入] --> B1[子层计算]
B1 --> C1[残差连接]
C1 --> D1[LayerNorm]
D1 --> E1[输出]
end
subgraph "Pre-LN (现代大模型)"
A2[输入] --> D2[LayerNorm]
D2 --> B2[子层计算]
B2 --> C2[残差连接]
C2 --> E2[输出]
end
style D1 fill:#ffcdd2
style D2 fill:#c8e6c9
graph LR
subgraph "LayerNorm"
A1[输入] --> B1[减均值]
B1 --> C1[除标准差]
C1 --> D1[乘γ]
D1 --> E1[加β]
E1 --> F1[输出]
end
subgraph "RMSNorm"
A2[输入] --> C2[除RMS]
C2 --> D2[乘γ]
D2 --> F2[输出]
end
style B1 fill:#ffcdd2
style E1 fill:#ffcdd2
style C2 fill:#c8e6c9
style F2 fill:#c8e6c9
Pre-LN vs Post-LN:参数的重要性差异
2025年11月的一篇论文《Impact of Layer Norm on Memorization and Generalization in Transformers》揭示了一个关键发现:
“Eliminating LayerNorm parameters in Pre-LayerNorm models exacerbates memorization and destabilizes learning, while in Post-LayerNorm models, the impact is less severe.”
这解释了为什么在Post-LN时代(如BERT、GPT-2),gamma和beta被视为必不可少;而在Pre-LN时代(如LLaMA),它们可以被简化甚至移除。
Pre-LN架构中,归一化层位于子层之前,输入尚未经过该层的变换。此时如果移除可学习参数,网络就完全依赖于子层自身的参数来调整激活分布——这可能导致表达能力不足和梯度流不稳定。
Post-LN架构中,归一化层位于残差连接之后,输入已经融合了当前层和之前所有层的信息。此时即使移除可学习参数,残差路径本身也能提供足够的"偏移"能力。
graph TD
A["Pre-LN移除参数"] --> B[记忆化加剧]
A --> C[学习不稳定]
A --> D[梯度流异常]
E["Post-LN移除参数"] --> F[影响较小]
E --> G[残差路径补偿]
H[原因分析] --> I[输入分布差异]
H --> J[梯度传播路径]
H --> K[残差累积效果]
I --> B
J --> C
K --> G
style B fill:#ffcdd2
style C fill:#ffcdd2
style D fill:#ffcdd2
style F fill:#c8e6c9
style G fill:#c8e6c9
当gamma=1、beta=0不够用时
尽管初始化为gamma=1、beta=0是标准做法,但这并不意味着它是唯一选择。在某些场景下,不同的初始化策略可能更有优势。
零中心化重参数化
2025年的一项研究提出了"Zero-centered Re-parameterization of LayerNorm",建议将gamma和beta存储为零附近的值,而不是传统的1和0。原因在于:
- 权重衰减兼容性:如果gamma初始化为1,应用权重衰减会将其拉向0,可能导致归一化效果被削弱。如果gamma初始化为0附近,权重衰减会将其保持在"适度归一化"的范围内。
- 量化精度:在模型量化中,零附近的值通常能获得更高的精度表示。
上下文学习的影响
2024年的一项研究发现,LayerNorm的参数对**上下文学习(In-Context Learning)**有显著影响。当gamma的分布更加"锐利"(方差较大)时,模型在few-shot任务上表现更好。这提示我们:LayerNorm的参数可能不仅仅是"技术细节",而是模型推理能力的重要组成部分。
graph TD
A["γ初始化策略"] --> B["γ=1 (标准)"]
A --> C["γ≈0 (零中心化)"]
A --> D["γ高方差 (上下文学习)"]
B --> E[兼容传统训练]
B --> F[权重衰减拉向0]
C --> G[权重衰减友好]
C --> H[量化精度更高]
D --> I[Few-shot性能提升]
D --> J[推理能力增强]
style E fill:#e1f5fe
style G fill:#e8f5e9
style I fill:#fff3e0
Dynamic Tanh:归一化的终结?
2025年CVPR的一篇论文《Transformers without Normalization》提出了一个令人惊讶的发现:可以用一个简单的函数完全替代归一化层:
$$\text{DyT}(x) = \tanh(\alpha x)$$其中$\alpha$是可学习的标量参数。作者观察到,LayerNorm的输入-输出映射往往呈现S形曲线,类似于tanh函数。通过直接使用tanh,可以在不计算均值和方差的情况下实现类似的"激活值压缩"效果。
graph LR
A[输入x] --> B["tanh(αx)"]
B --> C[输出y]
D["可学习参数α"] --> B
style B fill:#e8f5e9
style D fill:#fff3e0
更关键的是,实验表明:移除DyT中的可学习参数α会导致性能下降。这似乎暗示:即使不需要完整的归一化操作,某种形式的"可学习缩放"仍然是必要的。
这为gamma和beta的必要性提供了新的视角:它们可能不是为了"撤销归一化",而是为了提供一种轻量级的激活值调节机制。这种机制在大模型中可能比我们想象的更重要。
graph TD
A[LayerNorm] --> B["计算均值μ"]
A --> C["计算方差σ²"]
A --> D["归一化"]
A --> E["γ缩放"]
A --> F["β偏移"]
G["Dynamic Tanh"] --> H["直接tanh变换"]
G --> I["α缩放参数"]
J["共同特征"] --> K[可学习缩放]
K --> E
K --> I
style E fill:#ffcdd2
style I fill:#c8e6c9
style K fill:#e1f5fe
实践中的权衡
对于模型设计者,gamma和beta的选择取决于多个因素:
模型规模
- 小型模型(<1B参数):建议保留完整的gamma和beta。小模型的表达能力有限,需要归一化层的完整功能来弥补。
- 中型模型(1B-10B):可以尝试移除beta,只保留gamma。这个规模下,残差连接已经提供了足够的偏移能力。
- 大型模型(>10B):RMSNorm(只有gamma,无均值中心化)是主流选择。计算效率的提升在大规模训练中更加显著。
架构选择
- Post-LN:必须保留gamma和beta。Post-LN对归一化层的依赖更强。
- Pre-LN:可以简化参数,但完全移除可能导致训练不稳定(2025年研究已证实)。
训练稳定性需求
如果训练中出现以下问题,可能需要调整gamma和beta的策略:
- 梯度爆炸:检查gamma的分布。如果gamma普遍较大(>2),可能需要添加权重衰减或使用零中心化初始化。
- 训练震荡:尝试冻结gamma和beta一段时间,让网络的其他部分先稳定下来。
- 泛化性能差:考虑增加gamma的方差初始化,这可能在few-shot任务上有帮助。
graph TD
A[模型设计决策] --> B{模型规模}
B -->|小型<1B| C[保留完整γ和β]
B -->|中型1B-10B| D[移除β保留γ]
B -->|大型>10B| E[使用RMSNorm]
A --> F{架构类型}
F -->|Post-LN| G[必须保留γ和β]
F -->|Pre-LN| H[可简化参数]
A --> I{训练问题}
I -->|梯度爆炸| J[权重衰减+零中心化]
I -->|训练震荡| K[冻结参数]
I -->|泛化差| L[增加γ方差初始化]
style C fill:#ffcdd2
style E fill:#c8e6c9
style G fill:#ffcdd2
style H fill:#c8e6c9
代码实现:手动LayerNorm
理解gamma和beta的最佳方式是实现一个自定义的LayerNorm:
import torch
class LayerNormManual(torch.autograd.Function):
@staticmethod
def forward(ctx, x, gamma, beta, eps=1e-5):
# 计算均值和方差
mean = x.mean(dim=-1, keepdim=True)
var = x.var(dim=-1, keepdim=True, unbiased=False)
# 归一化
x_norm = (x - mean) / torch.sqrt(var + eps)
# 仿射变换
y = x_norm * gamma + beta
# 保存反向传播需要的中间变量
ctx.save_for_backward(x_norm, gamma, torch.sqrt(var + eps))
return y
@staticmethod
def backward(ctx, grad_output):
x_norm, gamma, std = ctx.saved_tensors
H = x_norm.shape[-1]
# gamma和beta的梯度
grad_gamma = (grad_output * x_norm).sum(dim=tuple(range(grad_output.dim() - 1)))
grad_beta = grad_output.sum(dim=tuple(range(grad_output.dim() - 1)))
# 输入的梯度(简化版)
grad_x = grad_output * gamma / std
return grad_x, grad_gamma, grad_beta, None
# 使用示例
x = torch.randn(32, 512, requires_grad=True)
gamma = torch.ones(512, requires_grad=True)
beta = torch.zeros(512, requires_grad=True)
y = LayerNormManual.apply(x, gamma, beta)
这个实现展示了gamma和beta在反向传播中的核心作用:gamma参与输入梯度的缩放,beta直接吸收输出梯度。
结语:简化不是消除
gamma和beta从现代大模型中的"消失",并非意味着它们不重要。相反,这反映了深度学习架构设计的成熟:
- 从Post-LN到Pre-LN:架构的演进让归一化层的负担减轻了。
- 从LayerNorm到RMSNorm:去除了冗余操作,保留了核心功能。
- 从固定设计到动态调整:Dynamic Tanh等工作提示我们,归一化的本质可能比传统公式更简单。
gamma和beta的故事是深度学习发展的缩影:重要的设计不会被抛弃,只会以更优雅的形式存在。当我们在2025年回顾LayerNorm的九年历程,会发现这个看似简单的层,承载着深度学习中最深刻的权衡——稳定性与表达力、效率与效果、简化与保留。
下一次当你在模型代码中看到nn.LayerNorm(hidden_size)或者nn.RMSNorm(hidden_size)时,想一想这行代码背后的九年演进。gamma=1、beta=0的初始化,不是历史的偶然,而是无数研究者不断简化的结果。
timeline
title Layer Normalization九年演进史
2016 : LayerNorm提出<br/>γ和β作为标准设计
2019 : RMSNorm论文发表<br/>移除均值中心化
2020 : T5模型发布<br/>简化LayerNorm参数
2022 : LLaMA采用RMSNorm<br/>成为大模型标配
2025 : Dynamic Tanh提出<br/>挑战归一化必要性
2025 : Pre-LN参数研究<br/>揭示记忆化机制
参考文献
- Ba, J. L., Kiros, J. R., & Hinton, G. E. (2016). Layer Normalization. arXiv:1607.06450.
- Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML 2015.
- Raffel, C., et al. (2020). Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. JMLR.
- Zhang, B., & Sennrich, R. (2019). Root Mean Square Layer Normalization. NeurIPS 2019.
- Raschka, S. (2024). Why do many modern LLMs use RMSNorm instead of LayerNorm? sebastianraschka.com
- Raschka, S. (2024). Why do some LLMs remove bias terms from linear layers? sebastianraschka.com
- Zhu, X., et al. (2025). Transformers without Normalization. CVPR 2025.
- Research on Layer Norm’s Impact on Memorization and Generalization (2025). arXiv:2511.10566.
- Xiong, R., et al. (2020). On Layer Normalization in the Transformer Architecture. ICML 2020.
- Understanding Batch Normalization - Cornell CS Technical Report (2018).