目录
1、Internal Covariate Shift现象
网络在训练过程中,中间层的权重在不断发生变化,导致该层输出数据的分布发生改变,这种数据分布的改变称为’Internal Covariate Shift’。
2、BatchNormalization算法
为了解决Internal Covariate Shift现象,Sergey Ioffe and Christian Szegedy提出了BatchNormalization算法,This operation simply zero-centers and normalizes each input, then scales and shifts the result using two new parameter vectors per layer: one for scaling, the other for shifting,具体步骤如下所示:
- μ B μ_B μB是输入均值向量,该向量元素个数等于输入个数(或者输入通道数),该值是在一个batch上计算得到的;
- σ B σ_B σB是输入标准差向量,该向量元素个数等于输入个数(或者输入通道数),该值是在一个batch上计算得到的;
- m B m_B mB是batch size大小;
- x ^ ( i ) \hat{x}^{(i)} x^(i)是一个批次中第i个输入实例的零中心和归一化后的值;
- γ为缩放因子向量,该向量元素个数等于输入个数(或者输入通道数),在训练过程中不断学习更新;
- β为平移因子向量,该向量元素个数等于输入个数(或者输入通道数),在训练过程中不断学习更新;
- z ( i ) z^{(i)} z(i)是一个批次中第i个输入实例经过缩放和平移后的结果。
在推理过程中,输入的batch size可能很小,甚至是1,因此求得的均值和标准差不具有代表性,实际此时输入的均值 μ B和标准差σ B实际采用的是整个训练集的均值和标准差,而这两个值在训练过程中是随着训练的推进逐渐迭代更新的,而不是训练完后再在整个数据集上计算均值和标准差,这两个在训练过程中不断迭代更新的均值和标准差分别称为moving_mean, moving_variance,是由训练集决定的,不需训练。
3、BatchNormalization层的参数量
由以上所述可知,一个BatchNormalization层涉及到的参数包含在四个矩阵(向量)中,分别是gamma, beta, moving_mean, moving_variance,这四个矩阵的元素数都是相同的,即等于输入个数(或者输入通道数),其中一半是可训练的,而另一半是不需要训练的。
4、BatchNormalization层的计算量
将上面的3式代入4式,可以整理成 z ( i ) = a x + b z^{(i)} = ax+b z(i)=ax+b的形式,在模型部署的时候,推理框架往往是先把a和b提前计算出来,这样推理到BN层时,直接代入ax+b公式,可以减少一部分计算量。对于一个输入特征图大小为W*H的BN层来说,每个通道要进行计算量为 W ∗ H ∗ ( 1 + 1 ) W*H*(1+1) W∗H∗(1+1), 括号中的两个1分别表示一次加法和一次乘法,如果输入特征图的通道数为C,那么一共计算量为:
FLOPs = 2*C*W*H
C是BatchNormalization层的输入通道数,W和H分别是BatchNormalization层输入特征图的宽和高分辨率,2指的是包括乘法和加法。
实际应用中往往将BatchNormalization层合并到卷积层,而不单独考虑其计算量。
5、BatchNormalization层的优点
- BatchNormalization提高了模型的泛化能力,采用BatchNormalization层后,可以考虑去掉较早的dropout或l2等正则化方法;
- 提高训练速度,采用BatchNormalization层后。可以设置一个较大的初始学习率,而且在此基础上的训练速度也会大大提高。
6、BN层和卷积层的融合
假设卷积层的输出为conv(x), BN层的输出为BN(x),则conv(x)和BN(x)可分别表示为:
将conv(x)代入到BN层计算公式并进行整理可得:
下面进行进一步整理,令:
这样,卷积层和BN层融合后的结果就可以表示为:
这时可以发现卷积层和BN层融合后的结果这表示为一个新的卷基层,这个新的卷积层的权重为
W
f
u
s
e
d
W_{fused}
Wfused,偏置为
B
f
u
s
e
d
B_{fused}
Bfused。