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

一 为什么读这篇

Inception系列的第二篇,Inception-v2,这篇论文引入了后来被广泛使用的Batch Normalization,重点从原作角度看看是到底怎么提出BN的,另外通过读这个,后续也可以看看各种各样的Normalization变种


二 截止阅读时这篇论文的引用次数

2018.12.27 7936次。比Inception-v1还是差点。


三 相关背景介绍

2015年2月刊发于arXiv。也中了2015年的ICML。二作Christian Szegedy是Inception-v1的一作,一作Sergey Ioffe的介绍就比较少了,不过后续几个Inception系列都是他和Christian Szegedy合作完成的


四 关键词

Inception v2

BN-Inception

Batch Normalization

Covariate Shift


五 论文的主要贡献

1 提出了Batch Normalization


六 详细解读

0 题目

对,没错。就是题目。。。本文题目就解释了BN是干什么的,通过减少Internal Covariate Shift(内部协变量偏移)来加速网络的训练。那么什么是Covariate Shift呢,先从Covariate(协变量)开始,协变量是指与因变量线性相关并在探讨自变量与因变量关系时通过统计技术加以控制的变量。常用的协变量包括因变量的前测分数,人口统计学指标以及与因变量明显不同的个人特征等。covariate shift可以直接根据字面意思去理解:样本点x的变化。伴随新数据产生,老数据会过时。Covariate shift methods就是把训练集的实例赋予不同的权重,以使它的分布更接近于测试集的分布。Covariate Shift – Unearthing hidden problems in Real World Data Science。covariate shift现象以及解决方法提出训练集和预测集样本分布不一致的问题就叫做『covariate shift』

1 介绍

本文对『Internal Covariate Shift』的定义:是一种现象。每一层的输入分布都会随着训练的进行而变化,从而导致模型难以训练。用BN的话可以用更高的学习率,同时不用太在意初始化。同时BN还是一种正则化技术,可以在某种程度上替代dropout。

由于饱和问题导致的梯度消失,减缓了训练的速度。将在训练过程中网络内部节点分布的变化称之为内部协变量偏移(Internal Covariate Shift)。BN可以朝着减少内部协变量偏移的方向迈进。它是通过固定层的输入的均值和方差来完成的。BN还可以减少梯度流失,通过减少梯度对不同尺度参数或初始值的依赖来实现。

2 朝着减少内部协变量偏移迈进

将内部协变量偏移(Internal Covariate Shift)定义为由于训练期间网络参数的变化导致的网络激活分布的变化。通过LeCun等人过去的工作已知通过白化(whitened)的输入能更快的闭合(这是整个BN idea的灵感来源)。通过白化每一层的输入,将朝着实现固定的输入分布迈出一步,这将消除内部协变量偏移的不良影响。

3 通过小批量统计进行规范化

完全白化每一层的输入代价是昂贵的,并且不是处处可微的,所以做了2点必要的简化首先单独规范化每个标量特征,通过0均值和1方差实现。

另外如果只是简单的规范化每一个层的输入,有可能改变层的表示,例如,规范化sigmoid的输入将会把它们约束到非线性的线性状态。为了解决这个问题,确保将插入到网络的变换表示为恒等变换。为了达到这个效果,引入新的参数,一个用来缩放,一个用来平移规范化后的值。

这些参数与原始模型参数一起学习,并用来恢复网络的表示能力。

理论上在训练的每一步都应该用整个数据集来规范化激活,但当使用随机优化时这是不切实际的,所以做出第二点简化:在每次mini-batch中生成每个激活均值和方差的估计。通过这种方式,规范化用到的统计量能够完全参与到梯度的后向传播中。

『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第1张图片
bn-alg1.png

期望规范化能加速子网络的训练,当然也就加速了整个网络的训练。BN变换是可微的变换。更重要的是,应用于这些规范化的激活而学习到的仿射变换允许BN变换表示为恒等变换并保留了网络容量

3.1 BN网络的训练和推理

在推理期间,均值和方差是固定的。

『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第2张图片
bn-alg2.png

3.2 BN卷积网络

在非线性变换前加BN。

不能只对u做规范化,它减少不了协变量偏移,需要对Wu+b整体做规范化,因为它『更高斯』(是对称的,非稀疏分布),规范它能得到更稳定的分布,但是注意其中的b是可以省略的。

和普通的网络不同的是,卷积是每个feature map学一组和,而不是每个激活学。

3.3 BN能够启用更高的学习率

太高的学习率可能导致梯度消失或爆炸,BN通过对整个网络中的激活进行规范化,可以防止参数的微小改变扩大到更大,例如,可以防止训练陷入非线性的饱和状态。

通常大的学习率会增加层的参数的缩放,之后会在反向传播的时候放大梯度,从而导致模型爆炸。然后,BN不受参数的缩放的影响,即

更重要的是,更大的权重会导致更小的梯度,而BN可以稳定参数的增长。

BN对梯度传播的精确影响仍然是未来的一个研究领域。

3.4 BN能够正则化模型

当用BN训练时,每个样本与在mini-batch中的其他样本联系起来,因此对于一个给定的训练样本,训练网络不再生成一个固定的值,通过实验发现这种效应有利于网络的泛化。

4 实验

4.1 Activations over time(激活的变化)

『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第3张图片
bn-fig1.png

更稳定的分布更有助于训练。

4.2 ImageNet分类

『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第4张图片
bn-fig5.png

相比V1,有如下变化

1 5x5卷积层用两个连续的3x3卷积层代替(我屮,Inception块的结构都改了)。这增加了网络的最大深度,也增加了25%的参数量,30%的计算量

2 28x28的Inception模块从2增加到3(即3a,3b变为3a,3b,3c)

3 在Inception模块中,有时用平均池化,有时用最大池化

4 在任意两个Inception模块之间没有完全的池化层,而是用stride2的卷积做下采样(3c,4e)(记得ResNet也是不用pooling,而是用stride的卷积做下采样的)

用带动量的SGD,batch_size=32,还是用DistBelief,但是评估准则改用top1准确率了。

4.2.1 加速BN网络

简单的给网络增加BN并不能完全发挥其优越性。需要做如下修改

1 增加学习率

2 不用dropout

3 减小L2正则

4 加速学习率衰减

5 不用Local Response Normalization

6 更彻底地对训练样本做shuffle(不用让相同的样本总是在一个mini-batch中同时出现,就这点更改让val提了1%。。)

7 减少图像失真(因为BN训练的快,所以每个样本观察的次数少,所以使其聚焦于真样本,增强的样本就要少用)

4.2.2 单模
『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第5张图片
bn-fig2.png
『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第6张图片
bn-fig3.png

原始Inception结构加个BN后,只需要不到一半的迭代次数就能达到同样的效果。用4.2.1的修改后,能更快的加速网络收敛,不过有个好玩的是x30比x5的准确率还要高,(初始学习率分别是0.045,0.0075),难道更大的学习率还能产生更好的效果?

另外,通过实验发现,如果用了BN,激活函数为sigmoid时也能玩得转,如果不加BN,则完全玩不转了。

4.2.3 ensemble
『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记_第7张图片
bn-fig4.png

还是一样的,做了tta后涨分明显,ensemble到没那么明显了。ensemble的基模型都是用的BN-x30。

另外,这里有个瓜要吃。图4中本文用来作对比的『Deep Image』是吴韧带领的百度异构计算团队搞的,原本是2015年ILSVRC的第一,后来因涉嫌多次提交作弊而被取消成绩,成为当时业界的一大丑闻,彼时吴恩达还在百度,不得已挥泪斩马谡,最后已开除吴韧作为回应。

5 结论

响应主题,通过减少协变量偏移来帮助训练。BN对每个激活仅增加了两个额外的参数。


七 读后感

本文初看起来特别吓人,全篇没几张图,连论文题目都有相对罕见的专业术语。不过真正读起来还好,没有之前预想的那么难,难点主要还是在于起初的一些理论铺垫,真正的讲BN如何用的部分读起来就相对轻松了。


八 补充

知乎:请问batch_normalization做了normalization后为什么要变回来?

梯度消失的好例子
知乎:深度学习中 Batch Normalization为什么效果好? 魏秀参博士的这个回答总结的非常到位

Batch Normalization原理与实战

keras bn源码

pytorch bn源码

你可能感兴趣的:(『Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift』论文笔记)