详细解读Batch Normalization中的关键点

介绍

Batch Normalization 是在论文Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中提出来的。

作者在摘要中指出:

训练神经网络是复杂的,因为在训练过程中,每一层输入的分布都会受前一层输出的影响。而且随着网络的加深,网络参数的微小变化都有可能被放大, 所以就需要更低的学习率和更加careful的参数初始化。并且由于这种原因,会使训练结果比理论值低(训练并没使模型达到饱和)。作者通过归一化每一层的输入来解决这个问题。使用BatchNormalization允许我们使用更高的学习率,参数初始化也不用那么的careful,在某些情况下消除了dropout的必要性(作者经过实验得到的结论,使用了Batch Normalization以后,删除Dropout对网络无副作用,也就是说Batch Normalization可以实现Dropout的部分功能)。
作者在当时SOTA(state of the art)的分类模型上进行了实验,以少14倍的训练step实现了相同的精度。

补充: 通过看论文可以知道,作者是用Inception模型在ImageNet数据集上进行的实验。在不使用Batch Normalization时准确率为72.2%,共使用 31.0 ∗ 1 0 6 31.0 * 10^ {6} 31.0106 steps,在使用Batch Normalization后,仅使用 2.1 ∗ 1 0 6 2.1*10 ^{6} 2.1106 steps 就可以达到72.2%的准确率,并且最终可达到74.8%的准确率。由此可见,

  1. Batch Normalization不仅可以提升训练速度
  2. 而且可以提高准确率
  3. 作者还认为,参数初始化时可以不那么careful(模型对参数的初始化不再那么敏感)
  4. 还可以使网络学习的更加饱和(表现为准确率提高)

Batch Normalization 中的关键点

1.可学习的参数

Normalization 其实就是 标准化分化,一般就是 ( x − m e a n ) / v a r i a n c e (x-mean)/variance (xmean)/variance,从而使输入的分布变为均值为0,方差为1的分布。
但是简单地标准化层输入(均值为0,方差为1)可能会改变层可以表示的内容,例如,标准化sigmoid的输入,可能会把部分神经元限制在(-5,5)以外的区域(Note:sigmoid函数在-5,5以外的区域导数接近于0,不利于网络的学习),为了解决这个问题,我们将使用一对参数 γ ( k ) , β ( k ) \gamma ^ {(k)}, \beta ^ {(k)} γ(k),β(k),用于缩放和平移被标准化之后的值。
y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)} = \gamma ^ {(k)} \hat x ^ {(k)} + \beta ^ {(k)} y(k)=γ(k)x^(k)+β(k)
通过一组可学习的参数 γ ( k ) , β ( k ) \gamma ^ {(k)}, \beta ^ {(k)} γ(k),β(k),解决了上面的问题。

2.Batch Normalization在训练时的处理流程

Batch Normalization的处理流程
算法步骤解释

  1. 计算mini-batch的均值
  2. 计算mini-batch的方差
  3. 对mini-batch标准化
  4. 通过可学习的参数 γ , β \gamma,\beta γβ,对标准化后的值进行缩放和平移

3.训练和推理时Batch Normalization的差异

Batch Normalization在训练时是有效的,但是在inference时,既不必要也不可取,我们希望对于给定的输入,会有唯一的输出,而不会与mini-batch内的其他数据相关。
例如:假设我们有3张图片,网络中只有一个Batch Normalization层,要测试第一张图片的结果(假设做回归任务),如果第一张图和第二张图结合,Batch Normalization的均值为1,方差为 0,最终第一张图模型的输出为0.3。而如果第一张图与第二张图结合,Batch Normalization的均值为0,方差为1,最终第一张图的模型的输出为0.6。 对于同一张图,输出的结果不同,这是由于Batch Normalization依赖于mini-Batch的其他数据导致的。
为了解决上述问题,论文作者提出,在测试时使用总体统计数据,而不是mini-batch统计数据。

Batch Normalization可以实现Dropout的功能吗?

论文中尝试了1.完全不使用Dropout,2.Dropout的概率从40%降到10%和5%,对实验结果影响不大。
所以论文作者给的结论是:Batch Normalization 提供了一些正则化效果,减少了泛化误差,也许不再需要使用dropout来进行正则化。

Removing Dropout from Modified BN-Inception speeds up training, without increasing overfitting.

当然,还有令一种可能,Batch Normalization和Dropout不能同时使用。
由于Dropout对神经元的随机失火,从而使得经过Batch Normalization计算mean 和 std是不准确的,或者说Dropout导致Batch Normalization的输入有一些噪音。

据我所知,在实际应用中,对于分割任务或者分类任务,会在网络的最后几层使用Dropout,现在好像没有严格的理论能证明它可以完全取代Dropout。(个人见解)

实验结果解释

Batch Normalization论文中的结果
上图就是Batch Normalization论文中提供的实验结果
Inception:是指最原始的Inception
BN-Baseline:是在Inception的激活函数前都使用了Batch Normalization (Note: Inception的激活函数都是ReLU)
BN-x5:在BN-Baseline的基础上,学习率扩大5倍
BN-x30:在BN-Baseline的基础上,学习率扩大30倍
BN-x5-Sigmoid:在BN-x5的基础上,将激活函数全部换为sigmoid

实验说明

  1. 模型Inception和BN-Baseline可以得到Batch Normalization可以提升训练速度,同时提升模型准确率的结论
  2. 模型BN-Baseline , BN-x5, BN-x30可以得到,使用Batch Normalization可以使用更高的学习率,会有更快的速度和更高的准确率
  3. BN-x5-Sigmoid结果虽然只有69.8%,但是如果在不使用Batch Normalization,只将Inception的ReLU换位Sigmoid,准确率不会超过1/1000(amazing),使用sigmoid激活函数作为非线性激活函数,训练难度是众所周知的难啊!!!(没研究过这个)。但是在使用了BN时,居然有69.8%的准确率(more amazing)

tips

  1. Batch Normalization 是一种通用技术,可用于规范化一个层的输入。它可以用于大多数网络模型,如多层感知器,卷积神经网络和循环神经网络。
  2. 一般在激活函数前使用
  3. 使用更大的学习率
  4. 对参数初始化没那么敏感
  5. 不使用Dropout或者较低的Dropout概率,或者在网络的最后几层用Dropout

总结

  1. Batch Normalization已经被广泛验证,是确实有效的一种方式。所以现在的神经网络都会使用Batch Normalization。
  2. Batch Normalization在训练时mean 和 variance是统计得到的, γ , β \gamma,\beta γ,β是可学习的参数
  3. Batch Normalization 在测试时,使用整个数据集的mean 和 variance,是计算训练过程中所有数据的mean 和 variance得到的。
  4. Batch Normalization 带来的好处是:1.可以使用更大的学习率,2.更快的训练速度,3.模型会有更高的准确率,4.可以实现Dropout的部分功能

将维基百科的解释放在最后,供大家参考

Batch normalization (also known as batch norm) is a method used to make artificial neural networks faster and more stable through normalization of the layers’ inputs by re-centering and re-scaling.[1] It was proposed by Sergey Ioffe and Christian Szegedy in 2015.[2]

While the effect of batch normalization is evident, the reasons behind its effectiveness remain under discussion. It was believed that it can mitigate the problem of internal covariate shift, where parameter initialization and changes in the distribution of the inputs of each layer affect the learning rate of the network.[2] Recently, some scholars have argued that batch normalization does not reduce internal covariate shift, but rather smooths the objective function, which in turn improves the performance.[3] However, at initialization, batch normalization in fact induces severe gradient explosion in deep networks, which is only alleviated by skip connections in residual networks.[4] Others sustain that batch normalization achieves length-direction decoupling, and thereby accelerates neural networks.[5]

After batch norm, many other in-layer normalization methods have been introduced, such as instance normalization, layer normalization, group normalization.

大致意思为:
虽然Batch Normalization的效果很明显,但其有效性背后的原因仍在讨论中
在Batch Normalization之后,又引入了许多其他的层内标准化方法,如实例标准化、层标准化、组标准化。


参考文献

  1. 什么是批归一化(Batch Normalization)
  2. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
  3. pytorch对Batch Normalization的解释以及参数解释
  4. A Gentle Introduction to Batch Normalization for Deep Neural Networks
  5. Batch Normalization
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值