文章

29 将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a Neural Network)

29 将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a Neural Network)

一、核心思想

  Batch Normalization(BN) 是在神经网络的每一层中,在计算线性输出 $z^{[l]}$ 之后、激活函数 $g^{[l]}$ 之前,对 $z^{[l]}$ 进行归一化处理,从而加速训练、提升稳定性并减少对初始化的敏感性。

关键位置:BN 插入在 $z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}$ 和 $a^{[l]} = g^{[l]}(z^{[l]})$ 之间。


二、标准前向传播 vs 带 BN 的前向传播

1. 无 BN 的标准流程(第 $l$ 层):

\[z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g^{[l]}(z^{[l]})\]

2. 引入 BN 后的流程:

  • 先计算原始 $z^{[l]}$(但可省略偏置项 $b^{[l]}$,见下文)
  • 对当前 mini-batch 中的 $z^{[l]}$ 进行归一化:

    \[\mu_B = \frac{1}{m} \sum_{i=1}^m z^{[l](i)}, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (z^{[l](i)} - \mu_B)^2\] \[\hat{z}^{[l](i)} = \frac{z^{[l](i)} - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}\]

    其中 $\epsilon$ 是防止除零的小常数(如 $10^{-8}$)。

  • 再通过可学习的缩放和平移参数 $\gamma^{[l]}, \beta^{[l]}$ 进行仿射变换:

    \[\tilde{z}^{[l](i)} = \gamma^{[l]} \odot \hat{z}^{[l](i)} + \beta^{[l]}\]

    ($\odot$ 表示逐元素相乘)

  • 最后输入激活函数:

    \[a^{[l](i)} = g^{[l]}(\tilde{z}^{[l](i)})\]

注意:$\beta^{[l]}$ 和 $\gamma^{[l]}$ 是可学习参数,与优化器中的超参数 $\beta$(如 Adam 中的 $\beta_1, \beta_2$)完全不同


三、偏置项 $b^{[l]}$ 的冗余性

  由于 BN 会减去 batch 均值 $\mu_B$,任何加在 $z^{[l]}$ 上的常数偏置都会被抵消:

\[z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]} \xrightarrow{\text{BN}} \hat{z}^{[l]} = \frac{W^{[l]} a^{[l-1]} + b^{[l]} - \mu_B}{\sigma_B}\]

  而 $\mu_B$ 本身就包含 $b^{[l]}$ 的贡献,因此 $b^{[l]}$ 失去作用

  ✅ 结论:使用 BN 时,可安全移除偏置项 $b^{[l]}$,即设:

\[z^{[l]} = W^{[l]} a^{[l-1]}\]

  然后由 $\beta^{[l]}$ 承担“偏移”功能。


四、参数维度说明

  设第 $l$ 层有 $n^{[l]}$ 个神经元,则:

  • $W^{[l]} \in \mathbb{R}^{n^{[l]} \times n^{[l-1]}}$
  • $\gamma^{[l]}, \beta^{[l]} \in \mathbb{R}^{n^{[l]}}$(通常以列向量形式 $(n^{[l]}, 1)$ 存储)

  每个神经元有自己的 $\gamma$ 和 $\beta$,用于独立控制其输出分布。


五、训练流程(Mini-batch 梯度下降 + BN)

  对每个 mini-batch $X^{(t)}$($t = 1, 2, …, T$)执行:

1. 前向传播(每层 $l$):

  • 计算 $z^{[l]} = W^{[l]} a^{[l-1]}$(无 $b^{[l]}$)
  • BN 归一化 → $\tilde{z}^{[l]} = \gamma^{[l]} \odot \hat{z}^{[l]} + \beta^{[l]}$
  • 激活:$a^{[l]} = g^{[l]}(\tilde{z}^{[l]})$

2. 反向传播:

  • 计算梯度:$dW^{[l]}, d\gamma^{[l]}, d\beta^{[l]}$
  • 不再需要 $db^{[l]}$(因 $b^{[l]}$ 已移除)

3. 参数更新(以梯度下降为例):

\[W^{[l]} := W^{[l]} - \alpha \, dW^{[l]} \\ \gamma^{[l]} := \gamma^{[l]} - \alpha \, d\gamma^{[l]} \\ \beta^{[l]} := \beta^{[l]} - \alpha \, d\beta^{[l]}\]

🔁 同样适用于 Momentum、RMSprop、Adam 等优化器。


六、实践建议

  • 在主流深度学习框架(如 TensorFlow、PyTorch)中,BN 只需一行代码:

    • TensorFlow: tf.keras.layers.BatchNormalization()
    • PyTorch: torch.nn.BatchNorm1d()
  • 框架会自动处理均值/方差的计算、参数更新及推理阶段的滑动平均。
  • 无需手动实现 BN 的细节,但理解其原理有助于调试和设计网络。

七、关键要点总结 ✅

项目说明
插入位置在 $z^{[l]}$ 计算后、激活函数前
归一化对象每个 mini-batch 中每个神经元的 $z$ 值
可学习参数$\gamma^{[l]}$(缩放)、$\beta^{[l]}$(偏移)
偏置项$b^{[l]}$ 可省略,被 $\beta^{[l]}$ 取代
训练方式每个 mini-batch 独立计算均值和方差
优化兼容性与所有主流优化器(SGD、Adam 等)兼容
符号注意BN 中的 $\beta^{[l]}$ ≠ Adam/Momentum 中的超参数 $\beta$

八、后续预告

  虽然 BN 能显著加速训练,但其为何有效仍需深入理解——例如:

  • 减少内部协变量偏移(Internal Covariate Shift)?
  • 平滑损失 landscape?
  • 允许更高学习率?

  这些将在下一节详细探讨。

本文由作者按照 CC BY 4.0 进行授权