该视频主要讨论Batch Normalization的一些坑。
Batch Norm后还有一个channel-wise仿射,是一个退化的卷积层,这里不讨论。
Batch Norm的训练和测试具有不一致性,测试时vanilla BN方法是更新一个exponential moving average,也就是图中的\(u_{EMA}\)
为什么可以训练和测试不一致?
DropOut和Data Augmentation也是这样——可以理解为训练是在测试的基础上加噪声,测试是训练的平均。
不过噪声本身也是一种正则化。
不稳定的模型或最后N次迭代中不稳定的数据
常见的错误是——"false overfitting",在可能出现overfitting时但是迭代次数又很少时需仔细甄别
如何减小Normalization batch size?
Ghost BN
其实现是在一个batch中分离
如何在改变SGD的batch size同时控制NBS不变?
使用Accumulate Gradients。
其实现是积累几次迭代的梯度后将gradients平均再去更新模型。
NBS特别小时的解决方案
Batch Renormalization。
训练: \(\hat{x}=\frac{x-\mu_{B}}{\sigma_{B}} \times\) stop gradient \((r)+\) stop gradient \((d)\)
测试: \(\hat{x}=\frac{x-\mu_{E M A}}{\sigma_{E M A}}\)
\(r, d\) pushes \(\mu_{B}, \sigma_{B}\) similar to \(\mu_{E M A}, \sigma_{E M A}\)
Reduce noise \(\&\) inconsistency
Need to tune the limit on \(r, d\)
数据非独立同分布时容易出现BN会学习到一些捷径
一般发生在:
在判别器中,会有两个分布,希望只有一个去更新EMA:
数据就来自于模型,解决方法是:
DQN中提出的target network或是Precise BN
PyTorch中momentum的0.1是别人的0.9;
TensorFlow中EMA的更新不是在层计算的同时发生,新手容易忘记更新EMA更新的操作加入到训练中,解决方法是使用tensorpack.models.BatchNorm;
使用哪个\(\mu, \sigma ?\)
\(\mu_{B}\), \(\sigma_{B}\) ; \(\mu_{E M A}\), \(\sigma_{E M A}\) ; Batch ReNorm
如何计算\(\mu_{B}\), \(\sigma_{B}\):
Per-GPU BN,Sync BN,Ghost BN,Virtual BN
是否更新\(\mu_{E M A}\), \(\sigma_{E M A}\)With \(\mu_{B}\), \(\sigma_{B}\):
YES,NO,Separate BN
测试/微调时用什么:
EMA,Precise BN,Adaptive BN,Frozen BN
原文:https://www.cnblogs.com/lvjincheng/p/11380490.html