Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift(BN)

自古美人都是妖i 提交于 2019-12-29 14:37:27

internal covariate shift(ics):训练深度神经网络是复杂的,因为在训练过程中,每层的输入分布会随着之前层的参数变化而发生变化。所以训练需要更小的学习速度和careful参数初始化,这将减缓训练的速度。

bn的目的就是解决ics

我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

 

对于深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。

我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal  Covariate Shift”。

bn算法就是需要对每层输入进行预处理,但预处理处理的是线性变换的数据,而不是经过激活函数的数据。并且bn算法每次处理的是一个batch的数据,即平均值和标准差都是一个batch的平均和一个batch的标准差。

根据之前我们训练全连接网络的经验,要想让训练能收敛,选择合适的超参数如learning_rate或者参数的初始化非常重要,如果选择的值不合适,很可能无法收敛。当然使用更好的算法如momentum或者adam等可以让算法更容易收敛,但是对于很深的网络依然很难训练。

把某层的输入限制在均值为0方差为1的分布会使网络的表达能力变弱,所以增加两个可学习的参数β、γ对数据进行缩放和平移,这样对BN层进行一些限制的放松。

 

 

 

 

 

 

http://blog.csdn.net/happynear/article/details/44238541

http://blog.csdn.net/hjimce/article/details/50866313

http://geek.csdn.net/news/detail/160906

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!