简单的解释batch normalization

文字来源于https://www.zhihu.com/question/38102762

作者:Xf Mao
链接:https://www.zhihu.com/question/38102762/answer/131113368
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

搬运一下我在csdn上的博客,关于google那篇Batch Normalization论文的理解


摘要
在深度网络的训练中, 每一层网络的输入都会因为前一层网络参数的变化导致其分布发生改变,这就要求我们必须使用一个很小的学习率和对参数很好的初始化,但是这么做会让训练过程变得慢而且复杂。作者把这种现象称作 Internal Covariate Shift。通过Batch Normalization可以很好的解决这个问题,并且文中提出的这种Batch Normalization方法前提是用mini-banch来训练神经网络。

介绍
背景依然是基于训练一个深层网络,算法基于最广为使用的SGD和BP,迭代的过程采用mini-batch方法,这些都是最基础的。
然后作者提出一个问题,在以往模型的训练当中,通常需要很谨慎的选择模型的超参数,特别是学习率的选择和参数的初始化。因为深层网络中,就单层而言,每一层的输入是前面所有层的输出,这个输出往往是不稳定的,它会随着前面层的参数的迭代更新而产生变化,这导致两个问题:
1、每一层都要学习一个变化的数据分布,但是我们希望输入我们系统的数据,它的分布最好是稳定的。
原因楼上的这篇博客已经详述了 《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现为了方便大家,我把它摘录到这里:

来源:happynear的博客

//图片(见原网址)

而神经网络模型在初始化的时候,权重W是随机采样生成的,一个常见的神经元表示为:ReLU(Wx+b) = max(Wx+b,0),即在Wx+b=0的两侧,对数据采用不同的操作方法。具体到ReLU就是一侧收缩,一侧保持不变。
随机的Wx+b=0表现为上图中的随机虚线,注意到,两条绿色虚线实际上并没有什么意义,在使用梯度下降时,可能需要很多次迭代才会使这些虚线对数据点进行有效的分割,就像紫色虚线那样,这势必会带来求解速率变慢的问题。更何况,我们这只是个二维的演示,数据占据四个象限中的一个,如果是几百、几千、上万维呢?而且数据在第一象限中也只是占了很小的一部分区域而已,可想而知不对数据进行预处理带来了多少运算资源的浪费,而且大量的数据外分割面在迭代时很可能会在刚进入数据中时就遇到了一个局部最优,导致overfit的问题。
这时,如果我们将数据减去其均值,数据点就不再只分布在第一象限,这时一个随机分界面落入数据分布的概率增加了多少呢?2^n倍!如果我们使用去除相关性的算法,例如PCA和ZCA白化,数据不再是一个狭长的分布,随机分界面有效的概率就又大大增加了

2、一旦前层的参数产生变化,经过多层以后会被放大,类似于“蝴蝶效应”(这一点我觉得从梯度弥散上可以看出来,我们想要输出产生微小的变化,但是前层的微小变化会导致输出的巨大变化,于是系统就几乎不更新前层的值了)
用公式来表达就是,相当于网络F1的输出被喂到F2中
//公式

在机器学习中,最终我们要学习的是数据的分布规律,我们总希望数据分布大致相同(如果训练数据的分布和测试数据的分布不同,那么再好的模型也不能泛化,因为训练数据集本身就是没有代表性的),应用到神经网络也是如此,上式的xi是不断改变的,后面的网络总要调整参数去补偿这种改变,致使整个网络复杂化,也容易过拟合。作者认为,让xi有一个稳定的分布,会有有利于网络的训练,并针对这个问题,提出了Batch Normalization方法。
Batch Normalization方法,总的来说就是对层间的数据做均值和方差的修正,最终它让一些饱和非线性的激活函数可以被使用(如Sigmoid)而这些激活函数的使用正是梯度弥散的罪魁祸首(Hinton在2010提出ReLU解决了梯度问题)


 

猜你喜欢

转载自blog.csdn.net/ccbrid/article/details/79802236