一、BN算法概念
传统的神经网络,只是在将样本x输入到输入层之前对x进行标准化处理,以降低样本间的差异性。BN
是在此基础上,不仅仅只对输入层的输入数据x进行标准化,还对每个隐藏层的输入进行标准化。
(那为什么需要对每个隐藏层的输入进行标准化呢?或者说这样做有什么好处呢?这就牵涉到一个Covariate Shift
问题)
二、Covariate Shift问题
Convariate shift
是BN
论文作者提出来的概念,指的是具有不同分布的输入值对深度网络学习的影响。当神经网络的输入值的分布不同时,我们可以理解为输入特征值的scale
差异较大,与权重进行矩阵相乘后,会产生一些偏离较大的差异值;而深度学习网络需要通过训练不断更新完善,那么差异值产生的些许变化都会深深影响后层,偏离越大表现越为明显;因此,对于反向传播来说,这些现象都会导致梯度发散,从而需要更多的训练步骤来抵消scale
不同带来的影响,也就是说,这种分布不一致将减缓训练速度。
而BN
的作用就是将这些输入值进行标准化,降低scale
的差异至同一个范围内。这样做的好处在于一方面提高梯度的收敛程度,加快模型的训练速度;另一方面使得每一层可以尽量面对同一特征分布的输入值,减少了变化带来的不确定性,也降低了对后层网络的影响,各层网络变得相对独立,缓解了训练中的梯度消失问题。
三、BN算法产生的背景
做深度学习大家应该都知道,我们在数据处理部分,我们为了加速训练首先会对数据进行处理的。其中我们最常用的是零均值和PCA
(白话)。首先我们进行简单介绍零均值带来的效果:
我们对网络进行参数初始化,一般是采用零均值化。
分析第一张图,初始的拟合直线也就是红色部分,另外的一条绿色直线,是我们的目标直线。从图能够直观看出,应该需要多次迭代才能得到我们需要的目标直线。接着再看第二张图,假设还是和第一张图有相同的分布,只是做了减均值,让数据均值为零,能够直观的发现可能只进行简单的微调就能够实现拟合(理想),大大提高了我们的训练速度。因此,在训练开始前,对数据进行零均值是一个必要的操作。但是,随着网络层次加深,参数对分布的影响不定,导致网络每层间以及不同迭代的相同层的输入分布发生改变,导致网络需要重新适应新的分布,迫使我们降低学习率降低影响。有些人首先提出在每层增加PCA
白化(先对数据进行去相关然后再进行归一化),这样基本满足了数据的0均值、单位方差、弱相关性。但是这样是不可取的,因为在白化过程中会计算协方差矩阵、求逆等操作,计算量会很大,另外,在反向传播时,白化的操作不一定可微。因此,在此背景下BN
算法开始出现。
四、BN算法的实现和优点
4.1 BN算法的实现
上面提到了PCA
白化优点,能够去相关和数据均值,标准差归一化等优点。但是当数据量比较大的情况下去相关的话需要大量的计算,因此有些人提出了只对数据进行均值和标准差归一化,叫做近似白化预处理。
由于训练过程采用了batch随机梯度下降,因此 E [ x ( k ) ] E[x^{(k)}] E[x(k)]指的是一批训练数据时,各神经元输入值的平均值; V a r [ x ( k ) ] \sqrt {Var[x^{(k)}]} Var[x(k)]指的是一批训练数据时各神经元输入值的标准差。
但是,这些应用到深度学习网络还远远不够,因为可能由于这种的强制转化导致数据的分布发生破坏。因此需要对公式的鲁棒性进行优化,就有人提出了变换重构的概念。就是在基础公式的基础之上加上了两个参数
γ
\gamma
γ、
β
\beta
β。这样在训练过程中就可以学习这两个参数,采用适合自己网络的BN
公式。公式如下:
每一个神经元都会有一对这样的参数 γ \gamma γ、 β \beta β。
这样其实当 β ( k ) = E [ x ( k ) ] \beta^{(k)}= E[x^{(k)}] β(k)=E[x(k)], γ ( k ) = V a r [ x ( k ) ] \gamma^{(k)}=\sqrt {Var[x^{(k)}]} γ(k)=Var[x(k)] 时,是可以恢复出原始的某一层所学到的特征的,引入可学习重构参数 γ \gamma γ、 β \beta β,让网络可以学习恢复出原始网络所学习的特征分布。
总结上面,我们会得到BN
的向前传导公式:
4.2 BN算法在网络中的作用
BN
算法像卷积层,池化层、激活层一样也输入一层,BN
层添加在激活函数前,对激活函数的输入进行归一化,这样解决了输入数据发生偏移和增大的影响。
优点:
-
可以增加训练速度,防止过拟合:如果没有归一化,每一层训练后的数据分布都不同,网络需要更大的开销去学习新的分布,造成网络模型更加复杂,因此容易发生过拟合,网络收敛也比较慢。
-
可以避免激活函数进入非线性饱和区,从而造成梯度弥散问题。
不用理会拟合中的
droupout
、L2
正则化项的参数选择,采用BN
算法可以省去这两项或者只需要小的L2
正则化约束。原因,BN
算法后,参数进行了归一化,原本经过激活函数没有太大影响的神经元分布变得明显,经过一个激活函数以后,神经元会自动削弱或者去除一些神经元,就不用再对其进行dropout
。另外就是L2
正则化,由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大,带来的参数不断增大。 -
由于因为
BN
具有提高网络泛化能力的特性,可以减少了你可以移除dropout
比例和正则化参数,这样减少繁琐的调参。 -
可以省
LRN
局部归一化层。
这块有疑问?
在卷积中,会出现每层卷积层中有(L
)多个特征图,AxAxL
特征矩阵。我们只需要以每个特征图为单元求取一对
γ
\gamma
γ、
β
\beta
β,然后在对特征图进行神经元的归一化。
五、参考文献
https://blog.csdn.net/qq_37100442/article/details/81776191?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1
https://blog.csdn.net/fuqiuai/article/details/88386034?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1