第3章:神经网络核心
训练神经网络之批量归一化
1. 批量归一化的动机
- 内部协变量偏移问题:深度神经网络训练过程中,各层输入的分布会随参数更新而改变,导致训练效率下降。
- 梯度消失/爆炸缓解:通过规范化激活值范围,改善梯度流动。
- 允许更高学习率:减少对参数初始化的敏感性,使网络更稳定。
2. 技术原理
2.1 基本操作
对于每个mini-batch的输入数据:
- 计算均值:
- 计算方差:
- 归一化:
- 缩放平移:
2.2 关键特性
- (缩放因子)和(偏移因子)是可学习参数
- 是为数值稳定性添加的小常数(通常1e-5)
- 推理阶段使用全体数据的移动平均统计量
3. 实现优势
| 优势 | 说明 |
|---|---|
| 加速收敛 | 减少每层输入分布变化带来的震荡 |
| 正则化效果 | 添加了轻微噪声,类似Dropout |
| 网络深度支持 | 使超深层网络(如ResNet)训练成为可能 |
4. 变体与改进
- Layer Normalization:沿特征维度归一化,适用于RNN
- Instance Normalization:图像生成任务中保持风格不变性
- Group Normalization:小批量场景的替代方案
5. PyTorch实现示例
import torch.nn as nn
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 64, 3)
self.bn1 = nn.BatchNorm2d(64) # 通道数需匹配卷积输出
self.fc = nn.Linear(64*28*28, 10)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x) # 通常在卷积后、激活前
x = F.relu(x)
return self.fc(x)
6. 注意事项
- batch size影响:过小的batch会导致统计量估计不准
- 特殊网络结构:RNN中需考虑时间步维度
- 与Dropout的配合:部分研究表明BN可能减少对Dropout的需求
7. 经典论文参考
[Ioffe & Szegedy, 2015] "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" (ICML)
