小 Batch 训练 CNN 时 BatchNorm 不稳定怎么办?
简化版
小 Batch 下 BatchNorm 的均值和方差估计噪声大,训练统计与推理滑动统计也更易失配。优先方案包括冻结预训练 BN、跨卡同步 SyncBN,或改用不依赖 batch 的 GroupNorm;具体选择取决于显存、分布式通信和迁移场景。
详细版
-
不要只看每卡 batch,要区分普通 BN 的本地统计量与 SyncBN 的全局有效 batch。
-
迁移学习样本少时,冻结 BN 的参数和 running statistics 往往比重新估计更稳。
-
GroupNorm 在每个样本内按通道组归一化,结果不受 batch size 影响。
-
梯度累积不会增大 BN 的统计 batch,因为多个 micro-batch 仍分别前向。
-
可用验证曲线、running statistics 漂移和 train/eval 输出差异诊断问题。
完整版教学
一、小批量首先伤害统计估计
BN 假设一个批次能近似当前特征分布。
检测和分割使用大图时,每卡可能只有 1~2 张,样本相关性又高,通道均值与方差会剧烈波动。
波动不仅给梯度加噪声,还会污染用于推理的滑动统计量。
训练模式看似正常、切到 eval 指标骤降,是典型信号。
二、底层机制与关键公式
SyncBN 在数据并行进程间聚合 sum(x) 与 sum(x²),得到更大的统计样本;代价是每个 BN 层都需要通信。
GroupNorm 则把单样本的 C 个通道分 G 组,在组内跨通道和空间求统计。
冻结 BN 表示推理式使用已有 running statistics,并通常不再更新 γ/β。
只设置 requires_grad=False 并不一定阻止 running statistics 更新,还需将 BN 保持 eval。
BN statistics domain: N * H * W per channel
GN statistics domain: (C/G) * H * W per sample
gradient accumulation != larger BN statistics batch
三、带数字的推演
4 张 GPU 每卡 2 张图:普通 BN 的有效 N 是 2,SyncBN 聚合后是 8。
若做 4 次梯度累积,优化器等效 batch 是 32,但每次 BN 仍只看到 2;累积不能替代同步统计。
四、方案对比与选择
| 方案/场景 | 机制或优势 | 主要代价 |
|---|---|---|
| 冻结 BN | 小数据迁移、已有可靠统计 | 域偏移大时可能不匹配 |
| SyncBN | 多卡且全局 batch 足够 | 增加通信开销 |
| GroupNorm | batch=1/2 的检测分割 | 需选择组数,预训练结构要匹配 |
五、实际执行流程
发现小 batch -> 比较 train/eval 指标 -> 检查 BN 统计漂移
-> 有可靠预训练统计: 冻结
-> 多卡通信可接受: SyncBN
-> 长期 batch 很小: GroupNorm
六、边界条件与工程代价
GN 的组数必须让通道数可整除,常见 G=32 不是定律;通道很少时可减少组数。
InstanceNorm 相当于更细的按样本通道归一化,可能抹去风格信息。
混合使用不同归一化会让权重迁移复杂。
替换预训练 BN 后最好重新微调,而不是假设 γ/β 可直接代表相同变换。
记忆钩子:先区分“优化 batch”和“统计 batch”:梯度累积只改变前者,SyncBN 才扩大后者。
七、常见误区与追问
-
误区:梯度累积可以修复小 Batch 的 BN。 累积只延后参数更新,不合并各次前向的统计量。
-
追问:冻结 BN 要冻结什么? 既要考虑
γ/β梯度,也要停止 running mean/variance 更新。 -
误区:SyncBN 没有代价。 逐层跨卡归约会增加通信和同步等待。
-
追问:GN 为什么与 batch 无关? 它在单个样本内部按通道组和空间位置计算统计。
-
追问:如何确认是 BN 导致的问题? 比较 train/eval 输出、监控滑动统计,并做冻结 BN 或 GN 的对照实验。
八、加强记忆
先区分“优化 batch”和“统计 batch”:梯度累积只改变前者,SyncBN 才扩大后者。
已有可信统计就冻结,多卡可通信就同步,长期极小 batch 则选 GN,并验证 train/eval 差距。