笔记:batch normalization:accelerating deep network training by reducing internal covariate shift

概述:训练机器学习系统时,一个一般的假设是它每次的输入的分布是稳定的。如果不满足这个假设,就是covariate shift,这个通常通过domian adaption解决。在训练一个复杂的机器学习系统时,同样要求这个sub-network对应的输入(activation)分布(distribution)是稳定的,如果不满足这个假设,就是本文提出的internal covariate shift(ICS)。本文CNN训练中,存在的ICS问题提出batch normalizaiton,一方面通过normalization使得每个网络层的输入尽量保持稳定的分布(均值为0以及单位方差),另一方面通过一个线性变化(transform)使得该层的输入在表达能力上也同时保持较好的效果。
对于CNN训练中存在的ICS问题,在原文中通过一个带sigmoid activation function的层进行了说明,具体而言:首先这个中间层的输入是原始数据在先网络(preceding network)上变化后的结果,所以这层的输入首先是跟它前面的网络参数有很大关联,这样的话前面网络参数的变化必然带来这层在输入上的变化,而且这个网络深度越深,这种现象就会被扩大(amplify),从而导致输入的不稳定;另一方面,对于一个sigmoid激活函数,它的导数随着自变量绝对值增大而减小,输入x的很多维上的梯度往往太小而导致梯度不能有效的传播(saturation problem and gradient descent)。之前,解决这个问题的方法包括 using Rectified linear units,care initialization以及small learning rate。这往往导致的问题就是学习速度太慢并且学习的效果太依赖于初始化。如果能够保持每层输入的分布稳定, 那么这个问题就能很好的解决,本文从这个角度提出了batch normalization。除了保持输入数据的稳定性之外,BN技术还能消除梯度算法中梯度与参数大小和初始值之间的关系,同时regularized the model并且减少对dropout的需求。文章通过实验验证,通过BN技术,可以显著提高学习的效率,同时也能提高模型的性能。
关于数据白化(whitening)的介绍参考UFLDL:http://ufldl.stanford.edu/wiki/index.php/Whitening
对于每层的输入单独进行白化的过程的弊端主要有两点:代价太高,同时不一定可导。本文基于白化进行了两个简化,从而提出了batch normalization。batch normalization可以分为两个步骤:normalization与linear transform。这个操作在训练阶段都是基于mini-batch的,对每个维度进行。下面从这两个方面介绍BN:
1)normalize:这个步骤使得每个dimension上面的分布稳定:在一个mini-batch上符合零均值以及单位方差的分布。具体操作文章用下面的式子表示:
normalization
需要注意的地方在于这个是在一个mini-batch上的操作,其中的统计特征的计算(均值和方差)也都是基于mini-batch的。
2)上面的normalization会改变输入的表达能力,因此在normalization操作后增加了一个transform的操作,对于第k维,执行下面的线性变换:
linear transform
这上面从x到y的变换成为batch normalization,它在文章用下面算法表示:
batch normalization
理解的时候需要注意的地方是:这儿的activation可以理解为一个维度。BN操作这里也是dimensionality independent。这里的gamma和beta参数也是需要另外学习的。在反向传播过程中,这个变换的梯度可以通过链导法则导出来,文章给出了如下公式:
backpropagation
在inference阶段与training不同在于,这个transform在全部的数据(populations)上进行。文章用algorithm2表示:
algorithm2
接下来文章讨论如何在卷积网络中使用BN算法技术。BN技术实际可以用在任何层来输入前面来使得这层网络的输入分布变得稳定,从而提高整个模型的训练速度。卷积网络每层的变换一般可以看成一个仿射然后加上一个非线性映射,公式表示如下:
layer transform
其中u表示这层的输入,W*u+b就是仿射(affinity transformation,就是线性变换);g就是非线性变化(nonlinearity)。作者在3.2部分讨论了两个在CNN网络中应用BN技术时应该注意的问题:
a) 何时使用BN操作:要么对输入u使用,要么对x=W*u+b使用。W*u+b通常而言,分布上更加符合对称、非稀疏的分布,也就是分布上更加符合高斯分布,所以文章在x=W*u+b上使用BN技术。在使用BN技术中,由于会对输入做零均值的normalization,所以可以将x中的常数项b忽略掉,也就是将原来的网络变形为下面的式子:
new layer
另外一点是这里的变换都是在一个维度(activation)上面讨论的,每个维度是相互独立的。
b)对于卷积网络而言,我们希望BN在对每个feature map进行normalization时使用同样的映射,所以在卷积层使用的normalization参数都是从一个mini-batch上所有样本学习。这与Inference阶段的改变是相似的。
由于还没动手做实验,单纯看了文章,难免理解有错误,多多指正。

Reference:
[1]Ioffe S, Szegedy C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift[J]., 2015.
[2]https://www.zhihu.com/question/38102762 知乎上的分析,非常地道
[3]http://blog.csdn.net/happynear/article/details/44238541C
[4]http://blog.csdn.net/happynear/article/details/44238541
[5]http://ufldl.stanford.edu/wiki/index.php/Whitening;很正的关于deep learning的学习资料。

展开阅读全文

没有更多推荐了,返回首页