Batch Normalization原理总结

Batch Normalization 是Google于2015年提出的一种归一化方法。

BN带来以下优点:

  • 加速训练过程;
  • 可以使用较大的学习率;
  • 允许在深层网络中使用sigmoid这种易导致梯度消失的激活函数;
  • 具有轻微地正则化效果,以此可以降低dropout的使用。

ICS(Internal Covariate Shift)

我们知道在网络训练过程中,随着上一层参数的改变,下一层输入的分布也会发生变化,这样就会导致每一层的数据分布都可能是不一致的,系统就需要花费额外的精力去补偿这部分输入分布变化带来的损失而不是专心于模型的分类问题上。当模型越深时,这种情况更甚,会减缓模型的收敛速度,影响模型的整体性能。这种由于网络参数改变导致输入分布变化的现象被称为“Internal Covariate Shift”(ICS)。

为了使得输入的分布保持一致,我们可以对输入进行规范化操作,即使得数据的均值为0,方差为1。假如某一层的输入为

其中x(i)表示第i维的向量,共d维,可以对输入的每一维都进行如下规范化:

均值和方差是在整个训练集上计算得到的。这种做法虽然可以对输入进行规范化了,但是这种强行加入的操作又可能带来另一个问题——影响了上一层学到的表示。我们希望加入的操作一边规范化改变分布,一边又希望有机会还原原来的分布,这里引用魏秀参的解释,就是提高了网络的capacity(容纳)能力,网络既可以改变输入分布,让其Nomalize,又可以还原原来的输入(保持学习到的表示),就是提高了capacity能力。

为了解决这个这个问题,引入了两个可学习的参数,γ和β。这两个参数应用到规范化后的输出上:

我们注意到,只要这两个参数取合适的值,就可以还原原来的输入。

前面提到,用来规范化的均值和方差是在整个训练集上计算得到的,但是这在使用SGD训练网络的时候是不切实际的,因此做出如下简化:使用每个mini-batch来计算均值和方差。

BN算法的步骤如下:

 

在网络中,Batch Normalization一般应用于非线性层的前面。

 

为什么 Batch Normalization 有效

Batch Normalization可以有效的加快模型的训练,以及使模型训练过程更稳定,Google对此的解释是BN可以减少internal convariate shift(ICS)。

而《How Does Batch Normalization Help Optimization》一文提出BN之所以有效,其根本原因是BN层使得网络的loss landscape变得更加平滑,而不是减少了ICS。

文章指出,BN能够work的真正原因是它重新参数化了优化问题,使得loss landscape更加的平滑

通常,在没有BN的网络中,损失函数不仅非凸,还有很多的平坦和尖锐区域。这些使得以梯度下降为基础的训练算法表现得很不稳定,需要对学习率和参数的初始化认真选择。而加了BN层后,loss landscape变得更加平滑,梯度的方向更加稳定和可预测,网络可以接受较大范围的初始学习率,对参数的初始化也不会很敏感。

下面的两张图可以类比普通的网络和加入BN的网络loss函数情况:

                        

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章