您现在的位置是:网站首页> 内容页

论文笔记:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

  • 公海555000kkapp
  • 2019-06-18
  • 407人已阅读
简介ICML2015S.IoffeandC.Szegedy解决什么问题(What)分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个

ICML 2015S. Ioffe and C. Szegedy

解决什么问题(What)

    分布不一致导致训练慢:每一层的分布会受到前层的影响,当前层分布发生变化时,后层网络需要去适应这个分布,训练时参数的变化会导致各层分布的不断变化,这个问题被定义为“internal covariate shift”,由于每一层的分布不一样,就会导致训练很慢梯度消失和梯度爆炸:深度网络中微小的参数变动引起梯度上的剧变,导致训练陷入sigmoid的饱和区需要使用较小的学习率:大的学习率可能会导致参数的scale变大,导致bp时梯度放大,引起梯度爆炸。另外由于分布不一致,大的学习率容易导致分布变化不稳定需要小心翼翼地设置权重初始化:设置合理的初始化权重可以减小陷入sigmoid饱和区导致的梯度消失或梯度爆炸需要正则:防止过拟合,提高泛化能力

为什么能解决(Why)

    加速收敛:在每一层的输入对数据进行规范化,使每层的分布不会出现很大的差异,可以加快训练。BN因为对数据分布做了规范,能减小前层对后层的影响,后层更容易适应前层的更新。减小梯度消失和梯度爆炸:对于sigmoid来说,数据规范化后大部分落在sigmoid的中间区域,可以避免优化的时候陷入“saturated regime”(sigmoid的两边),能够减小梯度消失和梯度爆炸的出现。一般化地说(不仅考虑sigmoid),BN规范化后,对于较大的权重会有较小的梯度,对于较小的权重会有较大的梯度(如下面公式所示),不容易出现梯度消失或梯度爆炸)。[ BN(Wu) =BN((aW)u) ][ frac{partial BN((aW)u))}{partial u}=frac{partial BN((W)u))}{partial u} ][ frac{partial BN((aW)u))}{partial (aW)} = frac{1}{a} frac{partial BN(Wu))}{partial W} ]允许使用较大的学习率:BN使训练更适应参数的scale,大权重有小梯度,这就不怕大的学习率导致bp的梯度放大引起梯度爆炸。另外分布较为一致,较大的学习率也不会导致不稳定的学习可以不需要小心翼翼地设置权重初始化:初始化对学习的影响减小了,可以不那么小心地设置初始权重。举例来说,对于一个单元的输入值,不管权重w,还是放缩后的权重kw,BN过后的值都是一样的,这个k被消掉了,对于学习来说,激活值是一样的。减小对正则的需要: 对于一个给定的训练样本,网络不产生一个确定的值,它会依赖于mini-batch中的其它样本。论文的实验发现这种效应有利于网络的泛化,可以减小或者不用dropout。

BN是怎么做的(How)

    对于一个神经元的一个mini-batch上的一批数据,做一次BN,假设batch size为m先求mini-batch的均值: [muleftarrow frac{1}{m}sum_{m}^{i=1}x_{i}]然后求mini-batch的方差:[sigma ^{2}leftarrow frac{1}{m}sum_{m}^{i=1}(x_{i}-mu)^{2}]然后把每个数据归一化:[hat{x_i}leftarrow frac{x_i - mu}{sqrt {sigma ^{2} + varepsilon }}]这样就得到了均值为0,方差为1的一批数据。我们可能不希望所有的数据总是均值为0,方差为1。这可能会改变原来的网络层能表示的东西,比如把sgmoid限制在了0附近的线性区域。所有我们使用另外两个参数来转换一下,使得网络能学到更多的分布。它既可以保持原输入,也可以改变,提升了模型的容纳能力。[y_ileftarrow gamma hat{x_i}+eta equiv BN_{gamma eta}(x_i)]对每个神经元的每个mini-batch数据做这样的BN转换,然后训练,每个BN的参数(gamma eta)不同在测试阶段,由于我们不适用mini-batch,那么如何使用均值和方差来归一化呢,论文中给出的方法是使用所有mini-batch 的均值和方差来估计出两个统计量来作为每个测试样本BN时的均值和方差[E[x]leftarrow E_B[mu_B]][Var[x]leftarrow frac{m}{m-1}E_B[sigma ^{2}_B]][y = frac{x-E(x)}{sqrt{Var[x]+varepsilon }}gamma+eta]

激活前还是激活后做BN(Where)

对于一个神经元的运算$ x = Wu+b $ 和 $ z = g(x) $,g为激活函数可以对u做BN,也可以对x做BN但是u可能是另一个非线性函数的输出,它的分布容易受到训练的影响而改变而(Wu+b)更可能有一致的,非稀疏的分布,对它归一化更可能产生稳定的分布

实验小结

mnist:用了BN后,收敛更快,准确率更高,随着训练的进行,分布更加平稳

ImageNet单网络分类:BN:提升了Inception的收敛速度和准确率BNx5:做了一些修改,其中学习率扩大为原BN的5倍,相比于BN,收敛更快,准确率更高BNx30:在BNx5的基础上,学习率扩大为原BN的30倍,相比于BNX5,准确率更高BNx5-sigmoid:虽然不如以上结果好,但是相比于不用BN,准确率更高

ImageNet集成网络分类:使用带BN的集成的Inception,在ImageNet的validation上达到了最好的表现

其它:CNN中的BN

在CNN中对一个mini-batch中的一个feature map的所有单元做BN假设原来一个mini-batch中的大小为m,做BN时,一批数据的大小为m现在在CNN中,假设一个feature map中大小为p*q,则做BN时一批数据的大小为m*p*q

其它:Internal Covariate shift(ICS)统计学习基于这样一个假设,希望源空间和目标空间的分布是一致的,covariate shift是分布不一致假设之下的一个分支问题,指的是条件概率一致,但是边缘概率不同,如下公式所示[P_{source}(Y|X=x)=P_{target}(Y|X=x)][P_{source}(X)eq P_{target}(X)]神经网络各层的分布是不同的,但是同一样本的label是一致,这就是符合了covariate shift的定义,因为不止对于输入,而对于中间层的输入都有这个问题,所有在前面加个“internal covariate shift”,定义这个各层之间分布不一致的问题。BN可以减小ICS带来的影响,但是不是解决ICS的办法,因为这并没有保证各层的分布一致,只是规范化了均值和方差。

一点点小感受

通常来说BN和dropout都是很有用的trick,值得多多尝试但是之前做实验的时候,发现加了BN效果反而下降了,还有dropout也是,加了后没提升一些trick在你的数据和任务上并不一定总是work的,还是实践至上,要多跑实验,尝试各种配置

文章评论

Top