副标题 / 摘要
BatchNorm 利用批内统计稳定训练,LayerNorm 基于单样本统计适配变长序列。本文用 ACERS 框架对比两者原理、场景与取舍,并给出最小 PyTorch 示例。

  • 预计阅读时长:14~18 分钟
  • 标签batchnormlayernormnormalization
  • SEO 关键词:BatchNorm, LayerNorm, 归一化
  • 元描述:系统对比 BN 与 LN 的机制差异、工程成本与适用场景。

目标读者

  • 想理解归一化差异的入门读者
  • 需要在 CNN/Transformer 中做结构选型的工程实践者
  • 关注训练稳定性与推理一致性的开发者

背景 / 动机

归一化是深度学习训练稳定性的核心技术。
BN 在视觉模型中表现优秀,但在 NLP/小批量场景中常不稳定。
LN 则不依赖 batch 大小,成为 Transformer 的默认选择。

核心概念

  • BatchNorm(BN):按 batch 维度统计均值/方差。
  • LayerNorm(LN):按特征维度统计均值/方差。
  • 训练/推理差异:BN 需要 running stats,LN 不需要。

A — Algorithm(题目与算法)

用通俗语言说明主题内容

  • BN:用“整批样本”的统计量做归一化。
  • LN:用“单个样本”的特征统计量做归一化。

基础示例(1)

  • CNN 大 batch 训练时,BN 统计稳定,收敛更快。

基础示例(2)

  • Transformer 小 batch/变长序列时,LN 更稳定。

实践指南 / 步骤

  1. 图像模型 + 大 batch → 首选 BN。
  2. 语言模型/小 batch → 首选 LN。
  3. 多卡训练 → 评估 SyncBN 或改用 LN。
  4. 推理时注意 BN 的 running stats 是否正确。

可运行示例(最小 PyTorch 对比)

import torch
import torch.nn as nn


torch.manual_seed(42)

x = torch.randn(4, 8)

bn = nn.BatchNorm1d(8)
ln = nn.LayerNorm(8)

out_bn = bn(x)
out_ln = ln(x)

print(out_bn.mean(dim=0))
print(out_ln.mean(dim=1))

解释与原理

  • BN 使用 batch 统计,训练时依赖 batch size。
  • LN 使用样本内统计,不依赖 batch。
  • 推理阶段 BN 使用 running mean/var,而 LN 直接使用当前样本。

C — Concepts(核心思想)

方法类型

BN 与 LN 都属于特征归一化,用于稳定训练与改善梯度流。

关键公式

BatchNorm(按 batch 统计):

$ \mu = \frac{1}{m} \sum_{i=1}^{m} x_i, \quad \sigma^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu)^2 $

$ \text{BN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \odot \gamma + \beta $

LayerNorm(按特征统计):

$ \mu = \frac{1}{d} \sum_{j=1}^{d} x_j, \quad \sigma^2 = \frac{1}{d} \sum_{j=1}^{d} (x_j - \mu)^2 $

$ \text{LN}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \odot \gamma + \beta $

解释与原理

  • BN 聚焦 batch 统计,适合大规模稳定训练。
  • LN 聚焦特征统计,适合变长序列与小 batch。

E — Engineering(工程应用)

场景 1:视觉模型训练(BN)

  • 背景:CNN 大 batch 训练,样本分布稳定。
  • 为什么适用:BN 统计可靠,收敛更快。
  • 代码示例(Python):
import torch
import torch.nn as nn

x = torch.randn(8, 3, 32, 32)
bn = nn.BatchNorm2d(3)
print(bn(x).shape)

场景 2:Transformer 训练(LN)

  • 背景:NLP 中序列长度可变且 batch 小。
  • 为什么适用:LN 不依赖 batch 统计。
  • 代码示例(Python):
import torch
import torch.nn as nn

x = torch.randn(2, 5, 64)
ln = nn.LayerNorm(64)
print(ln(x).shape)

场景 3:多卡训练与同步

  • 背景:小 batch 多卡训练时 BN 统计不稳定。
  • 为什么适用:SyncBN 或 LN 可提升一致性。
  • 代码示例(Python):
import torch
import torch.nn as nn

bn = nn.SyncBatchNorm(32)
print(bn.num_features)

R — Reflection(反思与深入)

  • 时间复杂度:两者都是 O(d),但 BN 需要跨 batch 统计。
  • 空间复杂度:BN 额外维护 running stats。
  • 替代方案
    • GroupNorm:批大小不敏感,适合小 batch 的 CNN。
    • RMSNorm:在 Transformer 中进一步简化。
  • 工程可行性:BN 在大 batch 视觉任务中最稳,LN 在 NLP/LLM 中几乎默认。

常见问题与注意事项

  • BN 小 batch 会导致统计噪声大。
  • 推理时 BN running stats 错误会导致偏移。
  • LN 在某些视觉任务上不如 BN。

最佳实践与建议

  • 视觉大 batch → BN;语言模型 → LN。
  • 小 batch CNN 可考虑 GroupNorm。
  • 关注推理时是否与训练统计一致。

S — Summary(总结)

核心收获

  • BN 依赖 batch 统计,LN 依赖特征统计。
  • BN 在大 batch 视觉训练中效果更好。
  • LN 在小 batch 和序列任务中更稳定。
  • 选择归一化需结合任务与硬件资源。

推荐延伸阅读

  • Batch Normalization 论文
  • Layer Normalization 论文
  • GroupNorm/RMSNorm 相关研究

参考与延伸阅读

小结 / 结论

BN 与 LN 不是“谁更好”,而是“谁更适合”。
从 batch 规模与任务类型出发,才能做出正确选择。

行动号召(CTA)

用你的模型对比 BN 与 LN 的收敛曲线,做一次最小消融实验。