Skip to content

LayerNorm ​层归一化

参考

层归一化(LayerNorm)

对比 批归一化和层归一化

1. 什么是层归一化

LayerNorm比喻

LayerNorm 就是一个“成绩调节器”—— 它把每个学生的各科成绩,按“他自己”的平均分和标准差做标准化,再用可学习参数微调,让数据分布更稳定,帮助模型训练更快、更稳!

想象你是一个教务老师,要处理两个学生的成绩单:

  • 学生A:语文90,数学95,英语85 → 平均分90,标准差≈4.08
  • 学生B:语文60,数学70,英语80 → 平均分70,标准差≈8.16

你想让他们的成绩“标准化”,便于比较:

层归一化LayerNorm的做法:

    1. 对每个学生自己做标准化:
  • 学生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
    1. 用可学习参数微调(比如语文更重要,就放大点):

乘以 gamma(缩放),加上 beta(偏移)

这样,每个学生都在自己的“尺度”上被公平对待!

2. 数学公式

层归一化的数学公式如下:

其中:

  • :输入(如一个学生的各科成绩)
  • :在指定维度上的均值(如学生自己的平均分)
  • :在指定维度上的方差(如学生自己的成绩方差)
  • :很小的数(默认 1e-5),防止除零
  • (gamma):可学习的缩放参数(默认初始化为1)
  • (beta):可学习的偏移参数(默认初始化为0)
  • :输出(标准化 + 微调后的成绩)

3. 层归一化的作用

    1. 保持数据分布稳定:

因为每个样本的均值和方差都不同,直接用原始数据训练模型可能会导致“梯度爆炸”或“梯度消失”问题。层归一化通过标准化,把数据分布拉回到均值为0、方差为1的标准正态分布,避免了这个问题。

    1. 加速模型训练:

由于数据分布更稳定,模型在训练过程中可以更快地收敛到最优解。

    1. 提高模型泛化能力:
  • 归一化后的数据对异常值更鲁棒,模型在处理异常数据时能保持稳定性。
  • 即使权重初始化不好,归一化也能拉回正轨

4. LayerNorm vs BatchNorm

LayerNorm

特性LayerNorm(层归一化)BatchNorm(批量归一化)
归一化对象每个样本内部(如一个学生的各科成绩)跨样本(如全班的语文成绩)
依赖 batch size?不依赖 → 适合小 batch依赖 → batch 太小效果差
训练/推理行为一致不一致(推理用移动平均)
适用场景Transformer、RNN、小 batchCNN、大 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)

京ICP备2024093538号-1