论文题目:Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift
论文下载地址:https://arxiv.org/pdf/1502.03167.pdf
这篇论文是google团队2015年提出的,一般也叫他inceptionV2或者BN-inception。
可以回顾一下之前的 inceptionV1 :CNN基础论文 精读+复现----GoogleNet & InceptionV1 (一)
作者提出了深度神经网络的复杂性在于每一层的训练都依赖于前一层的结果。前一层发生较大变化将对后面的训练产生较大影响,要降低学习率,使用饱和非线性激活函数很难(Sigmoid和tanh饱和,Relu非饱和),因为会产生梯度消失问题。
提出了一个概念:internal covariate shift
google翻译为:内部协变量转移。
关于 internal covariate shift:
各层输入数据分布的变化阻碍了深度网络的训练。这使得训练过程中要设置更低的学习速率,从而减慢了模型的训练;同时使得使用饱和非线性激活函数的模型变得极度难训练。作者将这种现象称为内部协方差变换。
机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。
什么叫数据分布?
同样大白话,假如要识别猫,有两个数据集,白天拍摄的猫和晚上拍摄的猫。那么这俩的数据集分布差异较大。
更进一步的使用数值举例,比如 范围x1 = [0.1,1],而x2=[100,10000] 显然两者的取值范围分布差异较大。
这会造成什么问题呢?
这就是作者在Abstract里所说的深度神经网络的复杂之处,使用上述例子假设有全连接神经网络,第一层输入为x1,训练完一轮后输入x2,此时的w将拟合x2,由于其前面拟合的是x1,所以这里为了拟合x2将造成w的较大波动导致此后的所有层都产生较大改变(上一层的输出,即下一层的输入数据分布发生较大变化),层数越深复杂性越高,所以不能调较大的学习率(使得训练变慢),其他参数的初始化也要更加小心。
然后作者提出了Batch Normalization,应用在每一个mini_batch,各种参数的调整变的不那么谨慎,还可以充当正则器(可免去dropout)。最后解决了上述问题,并且计算的很快,结果很好。
引言的开始作者首先相对于 One Example SGD 夸赞了一波mini_batch SGD,梯度的更新方向更准,并行速度更快,然后又说了一下SGD的缺点,就是对参数比较敏感。作者言下之意就是 BN可以解决这些问题,至于夸mini_batch, 毕竟BN是基于mini_batch嘛。
第三段提到的一个名词domain adaptation
(领域自适应):
领域自适应(Domain Adaptation)是迁移学习中的一种代表性方法,指的是利用信息丰富的源域样本来提升目标域模型的性能。
领域自适应问题中两个至关重要的概念:源域(source domain)表示与测试样本不同的领域,但是有丰富的监督信息;目标域(target domain)表示测试样本所在的领域,无标签或者只有少量标签。源域和目标域往往属于同一类任务,但是分布不同。
作者也在这里正式提出 Internal Covariate Shift (ICS)的含义: 我们将深层网络内部节点分布在训练过程中的变化称为内部协变量转移(ICS)。
这也与我们在开头对于ICS的理解差不多,就是数据(input)分布的变化。
然后就说出了解决办法就是 Batch Normalization ,BN通过修正输入的均值和方差减少了ICS问题,加快训练速度,减小网络对参数的敏感程度,减少对dropout的需求,还可以使用饱和非线性激活函数了。
为什么在BN之前深层网络不建议使用饱和非线性激活函数?
当采用饱和非线性激活函数的时候,比如用sigmoid:
放一张sigmoid导数图像:
可以看出来,input值必须接近于0,否则input绝对值越大,则其导数越接近0,使得参数权重无法更新,学习效率变低,产生梯度消失的现象。而在深层网络中ICS现象会让数据分布发生变化,让input值的分布不可控,从而更易产生梯度消失现象(使用Relu激活函数+谨慎的参数可以在一定程度上解决梯度消失现象)。
这一章主要是讲解决ICS问题的方向,首先第一段提出了一个可能解决办法,就是在每一层应用白化数据策略。
关于白化数据:
白化的目的是去除输入数据的冗余信息。假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的;白化的目的就是降低输入的冗余性。
假设输入数据集X,经过白化处理后,新的数据X’满足两个性质:
(1)特征之间相关性较低;
(2)所有特征具有单位方差,均值为0。
通过对每一层的输入数据进行白化,对消除ICS问题提起到一定进步作用,且网络训练的更快。
作者提到了两种白化数据的方法:
随后作者说了一下缺点,用了示例并附公式推导。这一块公式简单的说就是 发现每层的输入和输出相等,损失值不变,导数不变,而偏置b和权重w将叠加,最后导致模型参数爆炸。
作者对上述的原因分析:
在更新损失或者导数的时候,并给有将每层的参数和normalization 考虑进去。
作者给出了新的公式:
右边的是导数, 要求其覆盖normalization 和之前的参数。
还没给出具体的式子,就直接分析了一波缺点,计算量太大成本太高,且有的地方无法求导,然后又去寻求新的方法了。
作者为了解决上一章遗留的问题(计算成本和不可微问题),提出了一个公式:
其中的均值和方差var是根据整个数据样本得到的,这种方法加速了收敛,虽然没有使特征去相关。
为了避免normalized改变每层的input信息,normalized必须经过identity 变形。
但这样的方法可能会限制激活函数的非线性能力,所以引入了两个变量gamma和beta,用来缩放(scale)和平移(shift)normalized的值 ,这两个参数可以帮助我们还原normalized的值,保留 模型的表达能力。并且这两个参数也随着网络的训练而学习。
显然此时的BN考虑了整个的mini_batch样本。
在其中的 内部normalized最好的保持是(若数据分布相同) mean为0 var为1,若下一次的mini_batch不再具有相同分布,则通过gamma和beta来调整输出的y值。
从这里就可以看出 这里的步骤已经解决了文章开始提出的ICS问题。规范了数据分布。
后续作者给了BN完整的求导公式,以此证明BN解决了第二章的那个并非处处可导的问题。
3.1节就是在介绍将BN应用在训练和测试的步骤,
训练时就是上面说的那个过程去计算每一个mini_batch,得到输出y。
在测试的时候,由于不适用mini_batch了,所以没法得到maen和var了,所以要保存下训练时每一个mini_batch的maen和var,然后取出所有的maen和var取均值,最后计算y值的公式:
3.2节介绍将BN应用在卷积神经网络里。
这一小节说明了几个问题。
结论1:BN设置在 线性和非线性计算的中间。
为什么不对本层的输入做normalizing ?
因为本层的输入是上一层的非线性输出,经过了非线性计算,数据分布可能已经改变,在这里加入BN,将使其抑制ICS问题的效果变差。
为什么对线性输出做normalizing? :
线性计算能产生对称,非稀疏的分布,对这样的结果做BN,更容易获得稳定的分布。
结论2:BN计算中的bias偏置参数被忽略了,因为被beta取代了(职能取代)。
结论3 BN可以应用在卷积神经网络中。
input输入为(x,y) 则BN作用于每一个x到y的值。
CNN 中输入为(B,C,W,H),则BN作用于一个qxp的平面空间(这块原文没看懂)。
第3.3小节:
结论1 BN能让模型接受更大的学习率(lr)。
在前面的章节已经用sigmoid的那个图说过了,BN会防止梯度困在激活函数的sigmoid或者tanh的0的位置。
结论2: BN能保证模型训练的稳定性,增加对参数值规模的鲁棒性。
论文给出了三个公式用于支撑结论:
第二个公式: 参数值变大,会让其导数值等比例缩小,从而控制参数增长防止梯度爆炸。
第三个公式是说:参数规模大小对结构没影响(公式中后者放大了a倍)。
3.4节,这一节就在解释摘要中说到的,为什么BN可以在一定程度上舍弃dropout的使用。
原因:BN让模型不再为特定的样本生成特定的值,所以一定程度上防止过拟合。
这一大章节都是在说实验,我觉得不必要细看。
总结几个点: