一、BN算法概念

传统的神经网络,只是在将样本x输入到输入层之前对x进行标准化处理,以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化。

(那为什么需要对每个隐藏层的输入进行标准化呢?或者说这样做有什么好处呢?这就牵涉到一个Covariate Shift问题)

二、Covariate Shift问题

Convariate shiftBN论文作者提出来的概念,指的是具有不同分布的输入值对深度网络学习的影响。当神经网络的输入值的分布不同时,我们可以理解为输入特征值的scale差异较大,与权重进行矩阵相乘后,会产生一些偏离较大的差异值;而深度学习网络需要通过训练不断更新完善,那么差异值产生的些许变化都会深深影响后层,偏离越大表现越为明显;因此,对于反向传播来说,这些现象都会导致梯度发散,从而需要更多的训练步骤来抵消scale不同带来的影响,也就是说,这种分布不一致将减缓训练速度。

BN的作用就是将这些输入值进行标准化,降低scale的差异至同一个范围内。这样做的好处在于一方面提高梯度的收敛程度,加快模型的训练速度;另一方面使得每一层可以尽量面对同一特征分布的输入值,减少了变化带来的不确定性,也降低了对后层网络的影响,各层网络变得相对独立,缓解了训练中的梯度消失问题。

三、BN算法产生的背景

做深度学习大家应该都知道,我们在数据处理部分,我们为了加速训练首先会对数据进行处理的。其中我们最常用的是零均值和PCA(白话)。首先我们进行简单介绍零均值带来的效果:

vision卷积神经网络 卷积神经网络bn_归一化

我们对网络进行参数初始化,一般是采用零均值化。

分析第一张图,初始的拟合直线也就是红色部分,另外的一条绿色直线,是我们的目标直线。从图能够直观看出,应该需要多次迭代才能得到我们需要的目标直线。接着再看第二张图,假设还是和第一张图有相同的分布,只是做了减均值,让数据均值为零,能够直观的发现可能只进行简单的微调就能够实现拟合(理想),大大提高了我们的训练速度。因此,在训练开始前,对数据进行零均值是一个必要的操作。但是,随着网络层次加深,参数对分布的影响不定,导致网络每层间以及不同迭代的相同层的输入分布发生改变,导致网络需要重新适应新的分布,迫使我们降低学习率降低影响。有些人首先提出在每层增加PCA白化(先对数据进行去相关然后再进行归一化),这样基本满足了数据的0均值、单位方差、弱相关性。但是这样是不可取的,因为在白化过程中会计算协方差矩阵、求逆等操作,计算量会很大,另外,在反向传播时,白化的操作不一定可微。因此,在此背景下BN算法开始出现。

四、BN算法的实现和优点

4.1 BN算法的实现

上面提到了PCA白化优点,能够去相关和数据均值,标准差归一化等优点。但是当数据量比较大的情况下去相关的话需要大量的计算,因此有些人提出了只对数据进行均值和标准差归一化,叫做近似白化预处理。

vision卷积神经网络 卷积神经网络bn_数据_02

由于在训练过程中使用了随机梯度下降,因此E(x)指得是一批训练数据时,各个神经元输入的平均值; Var(x) 指得是一批训练数据输入时,各个神经元输入值的标准差。

但是,这些应用到深度学习网络还远远不够,因为可能由于这种的强制转化导致数据的分布发生破坏。因此需要对公式的鲁棒性进行优化,就有人提出了变换重构的概念。就是在基础公式的基础之上加上了两个参数 γ 、 β 。这样在训练过程中就可以学习这两个参数,采用适合自己网络的BN公式。公式如下:

vision卷积神经网络 卷积神经网络bn_数据_03


总结上面,我们会得到BN的向前传导公式

vision卷积神经网络 卷积神经网络bn_vision卷积神经网络_04

4.2 BN算法在网络中的作用
BN算法像卷积层,池化层、激活层一样也输入一层,BN层添加在激活函数前,对激活函数的输入进行归一化,这样解决了输入数据发生偏移和增大的影响。

优点

1、可以增加训练速度,防止过拟合:如果没有归一化,每一层训练后的数据分布都不同,网络需要更大的开销去学习新的分布,造成网络模型更加复杂,因此容易发生过拟合,网络收敛也比较慢。

2、可以避免激活函数进入非线性饱和区,从而造成梯度弥散问题。不用理会拟合中的droupout、L2正则化项的参数选择,采用BN算法可以省去这两项或者只需要小的L2正则化约束。原因,BN算法后,参数进行了归一化,原本经过激活函数没有太大影响的神经元分布变得明显,经过一个激活函数以后,神经元会自动削弱或者去除一些神经元,就不用再对其进行dropout。另外就是L2正则化,由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大,带来的参数不断增大。

3、由于因为BN具有提高网络泛化能力的特性,可以减少了你可以移除dropout比例和正则化参数,这样减少繁琐的调参。

4、可以省LRN局部归一化层。