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()
- TensorFlow:
- 框架会自动处理均值/方差的计算、参数更新及推理阶段的滑动平均。
- 无需手动实现 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?
- 允许更高学习率?
这些将在下一节详细探讨。