在 Transformer 模型中,主要使用 Layer Normalization(层归一化) 作为正则化层,而不是 Batch Normalization(批归一化)。以下是详细说明:


1. Layer Normalization(层归一化)

Transformer 中所有核心子层(自注意力层和前馈神经网络)的输出都接 LayerNorm,其作用:

  • 归一化方式:对单个样本的所有特征通道进行归一化(沿特征维度 $C$),而非批处理维度。
    $$\mu = \frac{1}{C} \sum_{i=1}^C x_i, \quad \sigma = \sqrt{\frac{1}{C} \sum_{i=1}^C (x_i - \mu)^2}$$
  • 结构位置:应用于 残差连接(Residual Connection)之后,形成 Add & Norm 模块:
    $$\text{Output} = \text{LayerNorm}(x + \text{Sublayer}(x))$$
    其中 $\text{Sublayer}$ 是自注意力或前馈网络。

为什么用 LayerNorm 而不是 BatchNorm?

特性 LayerNorm BatchNorm
序列长度敏感性 ✅ 独立处理每个样本 ❌ 依赖固定序列长度
小批量表现 ✅ 稳定 ❌ 小批量不稳定
推理一致性 ✅ 无统计量依赖 ❌ 需移动平均

2. Dropout(随机失活)

Transformer 中辅助使用的正则化技术:

  • 应用位置
  1. 自注意力的注意力权重计算后(Softmax 输出后)
  2. 前馈网络(FFN)的激活函数(如 ReLU)输出后
  3. 嵌入层(Embeddings)的输出
  • 作用:随机丢弃部分神经元(默认比例 $p=0.1$),减轻过拟合。

Transformer 中的具体实现位置

以 Transformer 编码器层为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TransformerEncoderLayer(nn.Module):
def __init__(self):
self.self_attn = MultiHeadAttention()# 多头自注意力
self.ffn = PositionwiseFFN()# 前馈网络
self.norm1 = LayerNorm()# 第一次层归一化
self.norm2 = LayerNorm()# 第二次层归一化
self.dropout = nn.Dropout(p=0.1)# Dropout层

def forward(self, x):
# 自注意力子层
attn_output = self.self_attn(x)
x = x + self.dropout(attn_output)# 残差连接 + Dropout
x = self.norm1(x)# LayerNorm

# 前馈网络子层
ffn_output = self.ffn(x)
x = x + self.dropout(ffn_output)# 残差连接 + Dropout
x = self.norm2(x)# LayerNorm
return x

经典模型中的使用

模型 正则化方案
原始 Transformer (2017) LayerNorm + Dropout (p=0.1)
BERT LayerNorm + Dropout (p=0.1)
GPT 系列 LayerNorm (前置) + Dropout
ViT (视觉 Transformer) LayerNorm

总结

  • 核心正则化层Layer Normalization(残差连接后使用)
  • 辅助正则化:Dropout(应用于注意力、FFN 和嵌入层)
  • 设计动机:解决序列数据变长问题,提升训练稳定性,避免过拟合。

📌 关键点:Transformer 摒弃了 CNN 中常用的 BatchNorm,因 LayerNorm 更适配序列数据的特性(可变长度、小批量敏感)。