Abstract
在训练网络时,前一层的参数变化会使得后一层输入的分布发生变化,导致训练过程复杂化。 这就要求设置更低的学习率(learning rate)以及更合理的参数初始化,因而减慢了训练过程, 另外,它会使得训练具有可饱和的非线性激活函数(saturating nonlinearities)的模型更加困难 (译注:输入分布的变化可能导致网络层的响应正好处于饱和的区域,进而产生梯度消散问题)
我们将此现象称之为 internal covariance shift,通过对网络层的输入进行标准化来解决这一问题。 具体来说,对模型架构的一部分执行标准化,而标准化的对象是训练输入的mini-batch。 Batch Normalization可以允许我们使用更高的learning rate,也不用太关心参数的初始化。 在一些情况下,作为正则项也可以省去模型中的 Dropout。在图像分类任务中,达到 state-of-art 的 准确率所使用的训练次数减少了14倍,最终的分类错误率也比当前最好的低。
Introduction
随机梯度下降(Stochastic Gradient Descent,SGD)已经被证明是训练深度网络非常有效的方式。 现在一般使用mini-batch的方式,有以下两个好处:
mini-batch的梯度是对training set梯度的估计,mini-batch中样本个数越多越接近traingingset。 受益于当前的计算平台,并行化计算多个,比一个个计算效率要高。
虽然有以上好处,它仍然需要对模型的超参数(hyper-parameter)进行仔细微调,尤其是每一层的输入都会 受到之前层参数的影响。当一个学习系统输入的分布发生变化时,被称之为covarianceshift,这一概念 扩展到深度网络的内部结点,即每层的输入分布也可能变化,称为internalcovarianceshift。
关于具有 saturating nonlinearites 的网络训练困难的例子说明,可参考文章,结论与上文译注相同。
解决方案就是BatchNormalization,可以固定子网络输入层的分布,从而加速训练,减小参数初始化的影响。
Towards Reducing Internal Covariate Shift
从 LeCun [1] 等文献中我们已经知道,当网络的输入值白化(0均值,1方差,去相关)后,网络收敛的更快。 同理,对网络中间每层输入进行白化固定其分布,也会有利于网络训练。
具体到怎么实现呢?(The hard part)首先要考虑到,如果通过修改网络来实现标准化操作,后期的梯度下降 也可能导致标准化的过程更新,进而降低了梯度下降对参数更新的效果。举例:
对一个网络层来说,其输入是$u$,首先加上一个偏置项参数$b$,然后对结果减去一个在训练集上得到的 响应值均值,
$$ \hat{x}=x-E[x] $$ 其中 $x=u+b$,$E[x]=\frac{1}{N}\sum_{i=1}^{N}x_i$,$x_i$ 为训练集样本。
如果梯度更新时,忽略了$b$对$E[x]$的依赖, $$ b \leftarrow b + \Delta{b} $$ 其中$\Delta{b}\propto -\partial{l}/\partial{\hat{x}}$。(偏置项$b$的计算公式,下一层的误差敏感项) 可见参数更新了,但对响应值没有产生作用,即 $$ u+(b+\Delta b)-E[u+(b+\Delta b)]=u+b-E[u+b] $$ 原来的输出就是 $x-E[x]$。毫无疑问,作者对只简单减去均值做了实验,观察到$b$的explosure。
上面的问题是虽然执行了标准化过程,但在梯度优化的过程没有考虑到标准化对参数的影响,即$E[x]$对参数的影响。 为了解决这一问题,我们显式地约定,对于任意的参数值,网络总是产生符合预期分布的响应。 这样在对网络参数计算梯度时,就可以在考虑到标准化过程的同时,兼顾梯度对模型参数的依赖。 标准化过程定义为如下变换:
$$ \hat{x}=Norm(x, \chi) $$ 其中,此变换不仅依赖于此次给定的训练样本$x$,同时依赖$\chi$ (depends on $\Theta$,即模型参数), 在后向传播时,我们要同时计算
$$ \frac{\partial Norm(x,\chi)}{\partial x} and \frac{\partial Norm(x,\chi)}{\partial \chi} $$ 其中后者就是考虑标准化对参数的影响。在这个框架中,白化网络层对计算资源消耗很大,主要是计算训练集数据的 协方差,以及其逆平方根,另外还有在后向传播时梯度的计算。This motivates us 提出另外一种标准化, 既可导又不需要在每次参数更新后对整个训练集进行分析。
Normalization via Mini-Batch Statistics
由于对每层输入的整体白化,计算消耗太大,而且也不是处处可微 (协方差作为逆平方根???),文章做了两个简化。
第一,不是对输入层整体白化,而是对输入向量的每个 feature 标准化。(联合正态分布的边缘分布依然是正态分布, 但边缘分布是正态分布的联合分布不一定依然是正态分布,联想 Bayes 分类器,同样假设的特征之间的独立, 在实际应用中这一假设基本成立)
在计算标准化对参数的影响时,使用了全部训练集,但这在 stochastic optimization 中是不可行的, 所以第二个简化是,使用 mini-batch 来估计均值和方差。
如此可得 Batch Normalizing Transform 的算法:
后向传播的梯度计算:
Moving Average
TODO
实现
caffe 中使用 expotienal 累加的方式,factor 对饱和值的分布影响
gemm 实现均值和方差的计算
caffe iter_size 对 batch normalization 的影响,程序实现均值与方差的结果不同
- LeCun,Y.,Bottou,L.,Orr,G.,and Muller,K. Efficient backprop.