【深度学习】论文导读:google的批正则方法(Batch Normalization: Accelerating Deep Network Training by Reducing...)

论文下载:

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

google2015年的论文,首次提出批正则方法,优化深度神经元网络的学习

摘要

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

介绍

背景依然是基于训练一个深层网络,算法基于最广为使用的SGD和BP,迭代的过程采用mini-batch方法,这些都是最基础的。然后作者提出一个问题,在以往模型的训练当中,通常需要很谨慎的选择模型的超参数,特别是学习率的选择和参数的初始化。因为深层网络中,就单层而言,每一层的输入是前面所有层的输出,这个输出往往是不稳定的,它会随着前面层的参数的迭代更新而产生变化,这导致两个问题:
1、每一层都要学习一个变化的数据分布,但是我们希望输入我们系统的数据,它的分布最好是稳定的。
原因可以见大牛的文章 http://blog.csdn.net/happynear/article/details/44238541
为了方便大家,我把它摘录到这里:

来源:happynear的博客

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


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

然后在F2上用mini-batch的梯度下降


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

解决Internal Covariate Shift问题

还是采用层间fix数据分布的一种做法。但是这要求我们在训练的时候同时也对Normalization过程中的参数进行优化和更新,原因论文里说了,单个值x的修正是基于训练集上xi的整体来做的


根据论文中的观点,如果忽视均值对模型参数的依赖,那么最终会导致输出不变。这当然是有问题的,事实上每个参数的更新都会对均值产生影响
最终Batch Normalization过程可以用一个函数来表示:小x是当前训练样本,大x是全体训练集,帽x是求得的结果

他依赖于正在训练的样本和所有的训练样本,反向传播的时候也需要考虑 的因素 ,如果没有考虑后者,那么就发发生上述的问题。
关于白化,文中提出它的计算量比较大,所以做了两点简化:
第一点,我们简单的作如下处理使得输入集合服从均值为0,方差为1的分布

上述的k是第k维的数据,最后的结果是经过Batch Normalization变换的值。(均值和方差是在训练集上计算的)
你会发现这个值的绝对值会很小,当它输入sigmoid函数时,会发现整体数据处在sigmoid的非饱和区域:

如图,这个区域接近于线性,这显然不是我们想要的,作者为了解决这一问题,对结果又施加了一个反变换(确保至少可以把数据还原为原数据)这里的两个参数都是需要后续去学习的。

第二点,最初的讨论是基于均值方差在整个训练集上计算,但是随机梯度下降只是对当前情况的优化,所以这是不现实的,因此第二点简化用mini-banch训练的时候,均值和方差来自于banch而不是整个训练集。(这样可以保证BP顺利进行)
那么整一个BN变换算法就完成了

接下来就是BP过程对新引入参数的更新,直接用链式法则推导

mini-banch上如何训练?

取网络中间层的一个子集,然后对每一个元素做BN变换(使用上述的算法进行),在完成了所有batch的迭代之后,训练完成。但此时的模型还不是最好的,作者又提出在全体训练集上求取均值和方差(无偏估计),去取代模型BN变换层的对应均值和方差,这其实很好理解。训练完成后的均值方差还只是最后一个banch的均值方差,我们最后的模型是基于训练集的,所以最后还需要增加加一步替换操作。
以下是整一个BN算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值