论文题目:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
首先看看博客http://blog.csdn.net/happynear/article/details/44238541中最开始介绍的:
为什么中心化,方差归一化等,可以加快收敛?
补充一点:输入x集中在0周围,sigmoid更可能在其未饱和区域,梯度相对更大一些,收敛更快。
Abstract
1.深层网络训练时,由于模型参数在不断修改,所以各层的输入的概率分布在不断变化,这使得我们必须使用较小的学习率及较好的权重初值,导致训练很慢,同时也导致使用saturating nonlinearities 激活函数(如sigmoid,正负两边都会饱和)时训练很困难。
这种现象加 internal covariate shift ,解决办法是:对每层的输入进行归一化。
本文方法特点是 :making normalization a part of the model
architecture and performing the normalization for each training
mini-batch
Batch Normalization 让我们可以使用更大的学习率,初值可以更随意。它起到了正则项的作用,在某些情况下,有它就不需要使用Dropout了。
在Imagenet上, achieves the same accuracy with 14 times fewertraining steps
Introduction
1. SGD:
用minibatch去近似整个训练集的梯度,在并行计算下,m个合成一个batch计算比单独计算m次快很多。
2.SGD虽然简单高效,但是需要调节很多超参,学习率,初值等。各层权重参数严重影响每层的输入,输入的小变动随着层数加深不断被放大。
这带来一个问题:各层输入分布的变动导致模型需要不停地去拟合新的分布。
当一个学习系统的输入分布是变化的时,即训练集的样本分布和测试集的样本分布不一致,训练的模型就很难有较好的泛化能力,这叫做 covariate shift (Shimodaira, 2000),解决办法是domain adaptation (Jiang, 2008).和迁移学习。
BN想把输入的均值方差规范化,使输入分布一致,但是仅均值、方差一样的分布就一定一样吗?但是思路是这样,而且效果好。
也可以不只关注学习系统整体,而关注它的内部,如一个subnetwork或 a layer:
损失函数为:
sub-network的损失函数为:
SGD:
is exactly equivalent to that for a stand-alone network F2 with input x.
输入X的分布保持不变的话,参数就不需要 readjust 去补偿X分布的变化。
注意Sigmoid 函数的特性,当输入不集中在 0 附近时(饱和时),梯度会非常小,训练会很慢。然而,输入x受前面层的参数的影响,这些参数的变化很可能导致x过早变化到sigmoid函数的饱和区域,收敛减慢。这种影响随着深度增加而加大。
ReLU和好的初值、更小的学习率可以解决梯度消失的问题。但是,要是我们能让输入更稳定,就不太可能 get stuck in the saturated regime,训练也会加快。
3.这种深度网络内部,参数不断变化导致的各层输入分布的变化 称为 Internal Covariate Shift.
Batch Normalization
a.保持各层输入的均值和方差稳定,来减弱 internal covariate shift;
b.也让梯度受参数及其初值的减小;
c.它也算作正则项,减少对Dropout的依赖;
d.它让卡在饱和区域的概率降低,以便可以使用 saturating nonlinearities
Towards Reducing Internal Covariate Shift
1.网络输入白化会加快收敛 (LeCun et al., 1998b; Wiesler & Ney, 2011)
并不是直接在每层规范化这么简单,如果模型的优化求梯度时不考虑到归一化的话,会影响模型,就是你优化半天学到了某种分布,一规范化,就把这它破坏了。
2.规范化与某个样本的各层输入及所有样本的各层输入都有关(对某个规范化时用到了所有样本):
在反向传导时,求导需考虑下面两项:
这样基于整个训练集的白化是非常耗时的,因为白化需要计算 x 的协方差矩阵及白化部分,还需计算BP算法中的求导。
但是基于某个或者部分样本进行规范化又会changes the representation ability of a network
所以本文在minibatch内归一化,再用可以学习的 γ 和 β 来拟合minibatch的统计量与整个训练集统计量之间的关系。
Normalization via Mini-Batch Statistics
1.有两个方面简化计算:
a.把 x 向量中每个元素当成独立随机变量单独进行规范化,向量中各变量独立了,也没有什么协方差矩阵了。这种规范化在各变量相关的情况下依然能加速收敛,(LeCun et al., 1998b),此外,如果看成向量中变量的联合概率,需要计算协方差矩阵,如果变量个数大于minibatch中样本数,协方差矩阵不可逆!!
b.在每个mini-batch中计算得到mini-batch mean和variance来替代整体训练集的mean和variance. Algorithm 1.
simply normalizing each input of a layer may change what the layer can represent.normalizing the inputs of a sigmoid would constrain them to the linear regime of the nonlinearity
为了解决这个问题,we make sure that the transformation inserted in the network can represent the identity transform.也就是用用可以学习的 γ 和 β 去拟合出与原先等价的变换。
采用 normalize via mini-batch statistics ,the statistics used for normalization can fully participate in the gradient backpropagation
Batch Normalizing Transform:
只要minibatch中的样本采样与同一分布,规范化后的输入 x 期望为0,方差为1,把规范后的 x 进行线性变换得到 y 作为后续层的输入,可以发现 后续层的输入具有固定的均值和方差的。尽管 规范化后的 x 的联合分布在训练过程中会改变(源于第一个简化,本文的规范化是把 x 向量中各个变量当作独立的,单独规范化的,所以他们的联合分布并不稳定,只是单独是稳定的),但还是可以使训练加速。
2.优化中也需要对 BN 变换的两个参数进行优化,链式法则求导就可以了:
BN 变换是可微的,通过BN变换,可以减弱输入分布的 internal covariate shift ,并且学习到这个线性变换让 BN变换 与网络本来的变换 等价,preserves the network capacity
Training and Inference with Batch-Normalized Networks
1.使用BN,把网络中各层输入 x 变为 BN(x)即可。可以使用SGD及其各种变种训练。
2.训练时候在minibatch内规范化非常高效,但是推断时就不需要而且不应该这样了。推断是我们希望输出只取决于输入,所以规范化中的期望、方差用全部数据计算:
就是各minibatch的方差求平均,minibatch数量为m。
注意:推断时,均值和方差是固定的,那么规范化这步线性变换可以和 γ、β 这步线性变换 合成 一个线性变换。训练BN网络步骤如下:
Batch-Normalized Convolutional Networks
1. BN 可以用于任意层的 activations,但是把 BN 加在 W u +b 之后,非线性激活函数之前更好!
因为前层的 activations (这层的输入 u)是非线性输出的,其分布很可能在训练中变化;而 W u +b 更可能有 a symmetric, non-sparse distribution, that is “more Gaussian”
(Hyv¨arinen & Oja, 2000); 规范化它更有可能得到稳定的 activations 分布。
2. 注意 b 可以不管,因为减均值时 b 会被消掉,b 的作用其实被 β 代替了,所以:
BN是对 x =W u 的每一维单独规范化
3.对卷积层,规范化也该保持卷积特性,即 相同feature map,不同 location
的元素 用相同方式规范化:
a mini-batch of size m and feature maps of size p × q, m*p*q个元素一起规范化!每个 feature map 有一对 γ β。
Batch Normalization enables higher learning rates
1.太大的学习率可能导致 梯度爆炸或消失以及卡在局部极值,BN可以防止参数小变换被逐层放大,通过修改 γ、β可以优化 activations的变化。
一般来说,大学习率增加参数的scale,在BP中放大了梯度,导致模型爆炸。然而使用了 BN,每层的BP不受其参数影响:
The scale does not affect the layer Jacobian nor, consequently, the gradient propagation.
而且:大权重会导致更小的梯度,所以BN可以稳定参数的增长。
2.BN还可以使 layer Jacobians 的奇异值接近 1 .这更利于训练 (Saxe et al.,2013).
论文中有在高斯、独立且变换为线性等条件下,可以推出来,但是说实话假设有点太苛刻,有点强行解释的味道,论文也提出更普适的结论需后续研究。
Batch Normalization regularizes the model
1.使用BN后,训练时对于单个样本与整个minibatch综合考虑了,training network no longer producing deterministic values for a given training example
这有利于提升网络的泛化能力,可以代替 Dropout
Experiments
Activations over time
在mnist上用3个隐层,每层100个的神经元的网络进行实验,初值为高斯,sigmoid函数,迭代50000次,minibatch为60个样本,损失为交叉熵。
(a)可以看到,加BN测试精度更高,而且最开始就达到了较高的精度;
(b,c)可以明显看到加BN后分布更加稳定。图中三条线为{15,50,85}分位数。
后面的实验就看论文了。