热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【论文阅读笔记】BatchNormalization_AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift

前提知识:  covariateshift,协向量变化,即输入变量x自身的变化【对于一个可学习系统的输入分布在改变。通俗的说,

前提知识:
  covariate shift, 协向量变化,即输入变量x自身的变化【对于一个可学习系统的输入分布在改变。通俗的说,就是一个网络在训练过程中每层子网络的输入在不断变化】
  Batch-Normalization,使得网络层输入的分布呈现标准正态分布【均值为0,方差为1】,其可使网络的训练加快【每一层网络的分布不一样,所需的学习率lr不一样,网络系统需要使用最低的那个lr来保证模型在收敛】,亦可部分解决梯度爆炸现象的问题【通过减少梯度对于参数初始值的依赖性】。
  数据初始化,以图像为例,其每个channel的数字都在0~255,即在二维笛卡尔坐标中,数据都分布在第一象限,且附近像素点之间具有强相关性,这使得数据分布显得狭长。这就使得随机分界面出现在第一象限的概率为1/4(在二维的情况下),且狭长的分布形状使得随机分界面出现在数据分布周边的概率更低,这就需要多次迭代模型才能收敛,而且大量数据外的分割面迭代可能会进入局部最优解。如果使用PCA和ZCA白化使得数据分布不再狭长,其随机分布界面靠近数据分布的几率就大了些;如果在每个维度都减去均值,则在每个维度上都增加了22倍几率的扩散,总共增加了2n" role="presentation">2n的分布几率。


为什么模型训练前要对输入数据做归一化处理?

  学习过程的本质就是为了学习数据分布,一旦训练数据和测试数据的分布不同,那么模型的泛化能力也大大降低。况且如果每批(Batch)训练数据的分布各不相同,那么模型在每次迭代都要去学习适应不同的分布,这会降低模型的收敛速度。因此,我们需要对输入数据进行归一化处理。


概要

  训练深层神经网络是复杂的,因为每一层的输入在训练的过程中都在不断的变化(前一层的参数在不断的变化)。这使得我们训练模型的时候需要应用低学习率、谨慎地初始化参数,以及使得非线性饱和模型的训练变得十分困难,这些现象的结果就是降低了训练的速度。我们把这个现象称为【internal covariate shift,内部协变量变化】,并通过规范化层输入来解决这个问题。【Batch-Normalization,批处理】允许我们使用更高的学习率,允许我们不用那么在意初始化,并且在一些情况下不需要使用【Dropout】。使用Batch-Normalization能提升数倍的训练速度,并大幅度提高准确度【刷新了当年(2015年)ImageNet分类的top-5准确值】。


内部协向量变化

由于神经网络每层的输入都受到前面所有层的参数的影响,因此随着网络变得更深,网络参数的微小变化就会放大,这使得深层神经网络的训练变得困难[complicated]。已知如果输入经过了白化操作【均值为0,方差为1】,网络收敛的速度就会加快,所以本文借鉴了这种想法,将每层网络的分布都进行这种操作作为下一层的输入。


在Mini-Batch上的Normalization

  如果每层都使用白化操作,那么计算协相关矩阵要耗费大量时间,且不一定可逆,所以在实际操作中,作者借鉴了其中最重要的一点:在输入变量的每个维度上都使它0均值和单位方差,


x(k)1=x(k)E[x(k)]Var[x(k)]x1(k)=x(k)−E[x(k)]Var[x(k)]
由于每次 Normalization 都是在一个Mini-Batch上操作的【即计算均值的时候,在一个batch上(比如5)进行均值运算】,所以该操作称为
Batch-Normalization。但如果简单的直接正规化每一层的输入,那么会破坏其正常的分布(如将Sigmoid函数的input进行正规化,则会将非线性编程线性的【这是因为Sigmoid函数在0附近时基本呈线性】),所以使用两个参数来学习原来正常的分布

y(k)=γ(k)x(k)1+β(k)y(k)=γ(k)x1(k)+β(k)
值得一提的是,如果令

γ(k)=Var[x(k)]β(k)=E[x(k)]γ(k)=Var[x(k)]且β(k)=E[x(k)],我们将恢复原始的函数。
需要之后详细了解的一点是,在ReLU这种分段函数上是不存在Sigmoid那种小范围内呈线性的特点的,且在ReLU函数后,函数值又重回了第一象限,这个情况下的归一化是不是更应该在 ReLU 激活函数之后,而不是在 Wx+b 上?


实验

  作者说将 Normalization 放在激活函数前(如ReLU和Sigmoid)会比较好,因为训练刚开始的时候,参数变化幅度大,即参数不稳定,在激活函数下趋于饱和的神经元容易被破坏分布,不如退而在Wx+bWx+b上进行 Batch Normalization,因为初始的W是从标准高斯分布中采样得到的,而W中元素的数量远大于x,Wx+b每维的均值本身就接近0、方差接近1,所以在Wx+bWx+b后使用 Batch Normalization 能得到更稳定的结果。
  使用 Batch Normalization 后,可以移除或使用较低的 dropout,与以前使用 40%~50%相比,文中分别使用了10%,5%,0%的 dropout 训练模型,结果大大加快了训练速度。类似的,使用 Batch Normalization 后,可以降低 L2L2权重衰减系数。因为 L2L2正则化的作用在于处理局部最优解导致的部分权重系数较大,而使用 Batch Normalization后,随机分界面就更接近数据内部,可以在一定程度下减缓局部最优解的问题,因而可以减小L2L2权重衰减系数。


猜想

  使用 Batch Normalization,初始权重会更接近数据内部,这就在一定程度上避免了过拟合现象,而 dropout 的作用在于使部分神经元失活从而避免过拟合,这与 Batch Normalization 作为一个整体避免过拟合的作用冲突,所以使用 Batch Normalization 时需要减少 dropout 的使用。


推荐阅读
author-avatar
Lanboream
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有