03-训练核心 核心 预计 25 分钟

批归一化:稳定训练的里程碑

批归一化(Batch Normalization, BN)在小批次维度上把每层输入重新标准化为零均值单位方差,再经可学习的缩放平移 γ、β 还原表达能力,从而允许更大学习率、加速收敛、并自带轻微正则效果。

一句话定义

批归一化(Batch Normalization, BN)在小批次维度上把每层输入重新标准化为零均值单位方差,再经可学习的缩放平移 γ、β 还原表达能力,从而允许更大学习率、加速收敛、并自带轻微正则效果。

直觉

BN 像「每道工序之间的质量校准台」:无论上游车间(前层参数)怎么波动,交付给下道工序的半成品一律先校准到标准规格(均值 0 方差 1),下游车间再也不用为上游的随机漂移反复重新调机。

为什么重要

BN 是 2015 年后 CNN 训练的默认组件(kp-019 的 ResNet 全线依赖),把 ImageNet 训练时间缩短一个量级,也让「更大学习率 + 更深网络」从冒险变成常规操作。理解它需要把 kp-007 的梯度链、kp-011 的学习率容忍度、kp-012 的方差分析串成一条线,是模块 03 的收官性知识点。

前置知识

  • kp-010(为何大学习率有益也有险)、kp-011(训练动态)、kp-012(激活方差逐层漂移问题)。

核心概念

  • 内部协变量偏移(Internal Covariate Shift):训练中前层参数更新导致后层输入分布持续漂移的原始解释(后续研究对其机制有争议)。
  • 批统计量 μ_B、σ_B²:当前小批次上计算的均值与方差。
  • 可学习参数 γ、β:归一化后的仿射变换,保住网络「想去哪就去哪」的自由。
  • 滑动平均(running stats):训练期间累积的总体 μ、σ²,推理时替代批统计量。
  • train/eval 模式差异:BN 是「训练与推理行为不同」的头号实现细节,忘切换 eval 是经典 bug。
  • LayerNorm:按样本维度归一化的变体,不依赖批次,是 Transformer 的选择(细节指路独立站点)。

原理与机制

对批次 B 内某层某通道的激活集合 {x₁,…,x_m}:μ_B = (1/m)Σxᵢ,σ_B² = (1/m)Σ(xᵢ−μ_B)²,标准化 x̂ᵢ = (xᵢ−μ_B)/√(σ_B²+ε),输出 yᵢ = γ·x̂ᵢ+β。四步各司其职:标准化把漂移的输入拉回稳定区间(kp-012 的方差守恒由「每个批内强制执行」),γ/β 保证归一化不构成表达瓶颈(极端时 γ=σ、β=μ 可复原原分布),ε 防除零。梯度视角是本知识点的深水区:反向传播时 μ_B、σ_B² 本身是 x 的函数,∂yᵢ/∂xⱼ 不再是对角阵——梯度会自然引入批内样本间的耦合项,这正是 BN 隐式正则化的来源(每个样本的训练都受同批其他样本扰动)。为什么允许更大学习率:损失面对参数的曲率被归一化拉平,参数更新造成的后层输入剧变被校准台吸收,kp-011 里「步子大就撞山壁」的风险大幅下降。推理一致性:批统计量只在训练时有意义(推理时可能单样本),故用训练全程的指数滑动平均 μ_run、σ²_run 替代——model.eval() 切换的就是这套统计量。经验位置:Conv→BN→ReLU 三连是 ResNet 时代标准块(kp-018);小批次(<8)时 μ_B、σ_B² 噪声过大,应换 GroupNorm/LayerNorm。

公式或模型

完整的 BN 前向与推理式:

训练: μ_B   = (1/m) Σ_{i=1..m} x_i
       σ_B²  = (1/m) Σ_i (x_i − μ_B)²
       x̂_i   = (x_i − μ_B) / √(σ_B² + ε)
       y_i   = γ · x̂_i + β
推理: y = γ · (x − μ_run)/√(σ²_run + ε) + β

变量说明:m 为批内样本数,γ 初始化为 1、β 初始化为 0(从「恒等」出发学),ε≈1e−5。μ_run 按动量 0.1 的指数滑动平均累积。

图示

        前层参数更新 → 后层输入分布漂移
   epoch1:  ▁▂▃        epoch2: ▃▄▅        epoch3: ▅▆▇   (无 BN:下层层层重调)
                     │
                 ┌───▼───┐
   x ──────────► │  BN   │ ──► 均值0、方差1(γβ可调)──► ReLU
                 └───────┘
                 校准台吸收漂移,下游稳定

直观类比

滑动平均统计量像「 train 期间做的用户画像」:推理时不再依赖「今天这一单」(当前批),而是用训练攒下的总画像(μ_run、σ²_run)。

实例或案例

同一 20 层 CNN 训 CIFAR-10(kp-021 项目可复现的对照):无 BN 时需小心地把学习率压到 0.001 以下才能不炸,收敛 60+ epoch;加 BN 后学习率可直接用 0.05~0.1,15~20 epoch 达到同水平,且激活方差实验(打印每层 std)显示无 BN 时各层 std 相差数十倍、有 BN 时全部稳定在 1 附近。著名 bug 案例:评估阶段忘记 model.eval(),批统计量继续按推理数据更新,同一模型同一数据两次推理结果不同—— train/eval 双态是 BN 带来的最常见工程陷阱(kp-027 调试清单必查项)。

常见误区

  • 「BN 的目的就是防止过拟合」:它的主要收益是优化稳定性与收敛加速,正则效果只是批噪声的副产品。
  • 推理时忘切 eval 模式:批统计量被推理数据污染,结果不可复现。
  • 「批越小 BN 越准」:小批统计量噪声大,m<8 时应改 GroupNorm/LayerNorm。
  • 在 BN 后再接 bias 的 Linear/Conv:BN 的 β 已承担平移,重复的 bias 是死参数(PyTorch 通常自动容忍但浪费)。

与其他知识点的关系

kp-012 提供其方差动机、kp-011 解释其学习率收益、kp-007 的梯度链在其反向传播中出现批耦合项;kp-019/kp-020 的架构史以 BN 为分水岭;kp-029 中 BN 与混合精度的交互(统计量需保持 fp32)是工程细节延伸。

自测题

  1. 写出 BN 的四个训练步骤,并说明 γ、β 为什么不可省。

答案要点:算 μ_B、σ_B²、标准化、γβ 仿射;无 γβ 则网络被强制零均值单位方差,表达力受损。

  1. 为什么推理时不能用批统计量?用什么替代?

答案要点:推理批可能只有 1 个样本且分布不代表总体;用训练期间累积的滑动平均 μ_run、σ²_run。

  1. BN 为什么能容忍更大学习率?

答案要点:归一化吸收了参数更新引起的后层输入分布漂移,损失面曲率变平,大步长不易撞出损失谷。

延伸阅读

  • Ioffe、Szegedy ICML 2015(原文;注意其「内部协变量偏移」解释后来被 Santurkar 等 2018 重新审视)。
  • Goodfellow 等《Deep Learning》8.7.1 节「批标准化」。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。