Appearance
LayerNorm 层归一化
层归一化(LayerNorm)
1. 什么是层归一化
LayerNorm比喻
LayerNorm 就是一个“成绩调节器”—— 它把每个学生的各科成绩,按“他自己”的平均分和标准差做标准化,再用可学习参数微调,让数据分布更稳定,帮助模型训练更快、更稳!
想象你是一个教务老师,要处理两个学生的成绩单:
- 学生A:语文90,数学95,英语85 → 平均分90,标准差≈4.08
- 学生B:语文60,数学70,英语80 → 平均分70,标准差≈8.16
你想让他们的成绩“标准化”,便于比较:
层归一化LayerNorm的做法:
- 对每个学生自己做标准化:
- 学生A:(90-90)/4.08=0, (95-90)/4.08≈1.22, (85-90)/4.08≈-1.22
- 学生B:(60-70)/8.16≈-1.22, (70-70)/8.16=0, (80-70)/8.16≈1.22
- 用可学习参数微调(比如语文更重要,就放大点):
乘以 gamma(缩放),加上 beta(偏移)
这样,每个学生都在自己的“尺度”上被公平对待!
2. 数学公式
层归一化的数学公式如下:
其中:
- :输入(如一个学生的各科成绩)
- :在指定维度上的均值(如学生自己的平均分)
- :在指定维度上的方差(如学生自己的成绩方差)
- :很小的数(默认 1e-5),防止除零
- (gamma):可学习的缩放参数(默认初始化为1)
- (beta):可学习的偏移参数(默认初始化为0)
- :输出(标准化 + 微调后的成绩)
3. 层归一化的作用
- 保持数据分布稳定:
因为每个样本的均值和方差都不同,直接用原始数据训练模型可能会导致“梯度爆炸”或“梯度消失”问题。层归一化通过标准化,把数据分布拉回到均值为0、方差为1的标准正态分布,避免了这个问题。
- 加速模型训练:
由于数据分布更稳定,模型在训练过程中可以更快地收敛到最优解。
- 提高模型泛化能力:
- 归一化后的数据对异常值更鲁棒,模型在处理异常数据时能保持稳定性。
- 即使权重初始化不好,归一化也能拉回正轨
4. LayerNorm vs BatchNorm
LayerNorm
| 特性 | LayerNorm(层归一化) | BatchNorm(批量归一化) |
|---|---|---|
| 归一化对象 | 每个样本内部(如一个学生的各科成绩) | 跨样本(如全班的语文成绩) |
| 依赖 batch size? | 不依赖 → 适合小 batch | 依赖 → batch 太小效果差 |
| 训练/推理行为 | 一致 | 不一致(推理用移动平均) |
| 适用场景 | Transformer、RNN、小 batch | CNN、大 batch 图像分类 |
为什么 Transformer 用 LayerNorm?
- 因为序列长度可变,batch 内样本长度可能不同 → BatchNorm 难处理
- LayerNorm 对每个位置独立归一化 → 更稳定
5. 代码示例
python
import torch
import torch.nn as nn
# 创建 LayerNorm:对最后一维(特征维)归一化
ln = nn.LayerNorm(normalized_shape=3) # 或写 ln = nn.LayerNorm(3)
# 输入:2个学生,每人3科成绩
x = torch.tensor([[90.0, 95.0, 85.0], # 学生A
[60.0, 70.0, 80.0]]) # 学生B
print("原始成绩:\n", x)
# 前向计算
y = ln(x)
print("标准化后:\n", y)