神经网络训练过程的本质是学习数据的分布,如果训练数据与测试数据的分布不同将大大降低网络的泛化能力;如果某些训练数据的每批batch数据分布也不同,则也大大消耗训练的时间从而使训练变得低效和复杂。
随着网络的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之改变,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度和过拟合的风险。
举个例子,比如6个mini-batch,前4个要求向a方向+0.1,后2个要求a方向-0.2,最终有效梯度为0.1*4-0.2*2=0,还是在原地踏步,极大影响训练的效率。
BN算法解决的就是这样的问题,他通过对每一层的输入增加归一化处理,将所有批数据强制在统一的数据分布下,从而达到加速训练的目的。
BN可以减少过拟合和增加泛化能力,提升训练速度,或梯度爆炸等无法训练的状况时可以尝试BN来解决。
下面看BN的流程:
在神经网络中,我们会在输入层对数据进行归一化,BN则是在每一层输出的时候和下一层输出之间加入了一个归一化层,将输入数据的归一化强制为均值为0,方差为1的分布:
但这样的数据分布位于0附近,若激活函数是Sigmoid,进行这样变换的数据会处于函数的非饱和区域,近似于线性变换,破坏了这一层变换之前所学习到的特征分布。所以,为了恢复原始数据分布,引入了重构变换以及需要学习的参数,
:
,
当γ和β等于数据的方差和均值时,y=x,在BN中,这两个参数是需要学习的,让网络可以学习恢复出原始网络所要学习的特征分布。
所以最后完整的BN前向传导过程公式为:
上述的计算方法用于在训练过程中。在测试时,所使用的均值和标准差是整个训练集的均值和标准差。由于训练集的数量较大,均值和标准差的计算量是很大的,所以一般会使用移动平均法来计算,这里不详述。