BN算法(Batch Normalization)的原理和作用

一、BN算法概念

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

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

二、Covariate Shift问题

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

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

三、BN算法产生的背景

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CyVBBzuQ-1587043256886)(C:\Users\mi\AppData\Roaming\Typora\typora-user-images\image-20200416203726756.png)]

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

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

四、BN算法的实现和优点

4.1 BN算法的实现

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

img

由于训练过程采用了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公式。公式如下:

img

每一个神经元都会有一对这样的参数 γ \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的向前传导公式:

img

4.2 BN算法在网络中的作用

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

优点:

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

  2. 可以避免激活函数进入非线性饱和区,从而造成梯度弥散问题

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

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

  4. 可以省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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是天才很好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值