BatchNorm 与 LayerNorm 总览
两者公式相似但统计轴、运行状态和使用场景不同。
学习目标
- 同一 2×2 表按列或按行标准化
- 归一化层可以替代输入预处理吗?
- 说明:相同输出 shape 不能证明两种归一化语义相同;应检查统计轴。
为什么需要这个概念
归一化层选定统计轴,计算均值和方差后标准化,再以可学习缩放与偏移恢复适合任务的表示。BatchNorm、LayerNorm、GroupNorm 的统计范围不同。
学习前需要掌握
背景与问题
中间激活的尺度变化会影响训练,但“归一化”不是一个唯一操作。不同方法沿不同轴统计,选错轴会把样本、时间和特征的语义混在一起。
概念定义
归一化层选定统计轴,计算均值和方差后标准化,再以可学习缩放与偏移恢复适合任务的表示。BatchNorm、LayerNorm、GroupNorm 的统计范围不同。
直观理解
同样是一张成绩表,可以按每科在全班中的分布标准化,也可以按每个学生自身的各科分布标准化;两种比较基准不会等价。
核心原理
BatchNorm 对每个通道聚合批内样本及适用的空间/序列位置,训练通常使用当前批统计并维护运行统计。LayerNorm 按每个样本的指定尾部维度统计,不依赖同批其他样本。GroupNorm 则在单样本内按通道分组并包含空间维。
对序列 ,LayerNorm(D) 独立标准化每个 token 的 D 个特征。BatchNorm1d(D) 常要先转成 ,再跨 N 和 L 统计;这会把不同位置放进同一个统计池,不是纯粹的轴语法变化。
归一化不等同于原始数据标准化,也不保证泛化或消除全部分布变化。小批量、在线推理、变长 padding 和跨域数据都可能改变方法是否合适,应按实际统计含义选择。
数学表达
核心公式
归一化层选定统计轴,计算均值和方差后标准化,再以可学习缩放与偏移恢复适合任务的表示。BatchNorm、LayerNorm、GroupNorm 的统计范围不同。
变量含义
S参与统计的元素集合
计算步骤
- 1BN 按列统计,列均值为 3 和 5,标准差均为 2。
- 2LN 按行统计,行均值为 2 和 6,标准差均为 1。
代码对应位置
示例 1同一 2×2 表按列或按行标准化的最小验证:使用完整构造输入核对同一 2×2 表按列或按行标准化,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
S | 参与统计的元素集合 |
完整数值示例
同一 2×2 表按列或按行标准化
已知条件
- 两条样本分别为 (1,3) 和 (5,7)
- 忽略极小 epsilon 的影响,均不使用 affine 参数
计算步骤
- BN 按列统计,列均值为 3 和 5,标准差均为 2。
- LN 按行统计,行均值为 2 和 6,标准差均为 1。
计算结果
BN 近似得到 (-1,-1)、(1,1);LN 近似得到 (-1,1)、(-1,1)。
处理前后对比
- 相同输出 shape 不能证明两种归一化语义相同;应检查统计轴。
同一 2×2 表按列或按行标准化
第一种结果表达“这个样本在两个特征上都低于批内均值”,第二种表达“每条样本的第一个特征都低于自身均值”。它们保存和抹去的信息不同,不能仅按有没有 train/eval 差异互换。
代码保留默认 epsilon 并只格式化到三位小数,便于对照手算;实际实现不应为了精确得到 ±1 而把 epsilon 删除。
计算与实现步骤
- BN 按列统计,列均值为 3 和 5,标准差均为 2。
- LN 按行统计,行均值为 2 和 6,标准差均为 1。
代码实现
示例 1
同一 2×2 表按列或按行标准化的最小验证
example_01.py用途:使用完整构造输入核对同一 2×2 表按列或按行标准化,输出只表示本例计算。
import torch
from torch import nn
x = torch.tensor([[1., 3.], [5., 7.]])
bn = nn.BatchNorm1d(2, affine=False, track_running_stats=False)
ln = nn.LayerNorm(2, elementwise_affine=False)
for name, y in [("BN", bn(x)), ("LN", ln(x))]:
print(name, [[round(v, 3) for v in row] for row in y.tolist()])代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对同一 2×2 表按列或按行标准化,输出只表示本例计算。
y- 目标标签或连续目标值。
Step 1 · 1–7 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
from torch import nn
x = torch.tensor([[1., 3.], [5., 7.]])
bn = nn.BatchNorm1d(2, affine=False, track_running_stats=False)
ln = nn.LayerNorm(2, elementwise_affine=False)
for name, y in [("BN", bn(x)), ("LN", ln(x))]:
print(name, [[round(v, 3) for v in row] for row in y.tolist()])预期输出或运行结果
BN [[-1.0, -1.0], [1.0, 1.0]] LN [[-1.0, 1.0], [-1.0, 1.0]]
常见错误 · 3 条
- 输入标准化混同
- 统计轴错
- no_grad 当 eval
实际应用
- 比较序列模型和视觉模型的归一化
- 小批量训练时选择统计方式
常见错误
- 输入标准化混同
- 统计轴错
- no_grad 当 eval
常见问题
归一化层可以替代输入预处理吗?
不能。原始特征尺度、图像数值范围和预训练输入约定仍要处理;中间层归一化只作用于其接收的表示。
这个示例能说明什么边界?
相同输出 shape 不能证明两种归一化语义相同;应检查统计轴。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。