本文翻译论文为深度学习经典模型之一:GoogLeNet-BN

论文链接:https://arxiv.org/abs/1502.03167v3

摘要:训练深度神经网络的难度在于:前一层网络参数的变化,导致每一层输入的分布也随之变化。通常需要设置小的学习率以及小心的初始化,因此降低了网络的学习速度,并且经常出现非线性饱和,最终导致深度网络难以训练。本文称这种现象为内部协方差偏移(internal covariate shift), 解决办法是对网络层的输入进行归一化。我们吸取其优点,将归一化成为网络结构的一部分,并对每一个最小训练批次(mini-batch)进行归一化操作。归一化可以允许使用更高的学习率以及对初始化的敏感度更低。而且,可以将归一化看作是一种正则化方式,在某些情况下,可以替代Dropout层。应用于经典的分类模型,达到同样的训练精度下,Batch Normalization将训练步数降低了14倍,精确度有了巨大的提升。 使用集成的BN网络,在ImageNet上达到 top-5 4.9%的验证集误差(测试集误差4.8%),接近人类的准确度。

1 Introduction

深度学习在视觉、语音以及其它领域取得重大进展。对于深度网络的训练,随机梯度下降(SGD)是非常有效的,以及SGD的变体:动量优化器(momentum 2013)和 Adagrad(2011)。SGD优化网络参数\Theta,最小化损失公式如下:

x_1..._N是训练集。SGD优化方法是按步进行,每一步考虑一个batch,大小为m。最小的批次(mini-batch)被用来求解损失函数关于待优化参数的梯度,通过如下公式计算:

使用训练样本的子集(mini-batch),而不是每次使用一个样本,在某些方面是很有好处的:1、使用一个batch来估计损失函数在全部训练集上的梯度(优化的整体方向),估计效果优于一个样本,并且随着批次的容量增大,估计质量也会越高。2、由于并行计算平台的进步,一次计算m个样本比计算一个样本m次更快。

虽然随机梯度算法简单而且有效,但是需要小心调整超参数,尤其是学习率的设置以及权重的初值。由于每一层的输入受前面所有层的影响,所以,即使是网络参数小的变动,对后面的影响也会很大,随着网络层数变的更深,对于网络的训练影响更大。

每一层输入的分布变化使得网络不断学习并适应新的分布。当一个学习系统的输入分布变化时,网络正经历协方差偏移(convariate shift, Shimodaira, 2000)。通常的解决办法:领域自适应(Domain Adaptation,Jiang 2008)。但是,协方差偏移的概念可以扩展为学习系统中,整体到局部的概念,子网络或者一层称为局部。考虑如下网络的计算,

领域自适应(Domain Adaptation)是迁移学习中的一种代表性方法,指的是利用信息丰富的源域样本来提升目标域模型的性能。
领域自适应问题中两个至关重要的概念:源域(source domain)表示与测试样本不同的领域,但是有丰富的监督信息;目标域(target domain)表示测试样本所在的领域,无标签或者只有少量标签。源域和目标域往往属于同一类任务,但是分布不同。

F1和F2是任意的变换,学习参数\Theta_1,\Theta_2,使得损失最小。学习\small \Theta_2可以认为是将输入x = F_1(u, \Theta_1)填入子网络:

例如,一步梯度下降如下:

对于 batch 大小 m和学习率 \alpha 等价于以 为输入的独立子网络 F_2。因此,输入分布的特性(比如训练集和测试集具有相同的分布)会影响训练效率,同理,子网络也是如此。既然如此,训练过程中,保证输入的分布不变是非常有必要的。那么\Theta_2就不需要针对输入x的分布变化,再次重新调整。

固定子网络输入的分布,将对子网络外的层具有正作用。假设网络的层的激活函数为sigmoid,z = g(Wu + b),u是该层的输入,W和b是要学习的参数,g(x) = \frac{1}{1+exp(-x)}. 随着|x|的增大,g(x)的导数接近0。那么x=Wu+b所有维度中,绝对值大的值,流入 的梯度将会消失,那么模型训练会变慢。但是,由于x受W和b以及其它所有层的影响,那么W和b的改变会使得x的很多维度陷入非线性饱和状态,降低收敛速度。随着网络的加深,影响越大。实际情况下,使用ReLU以及小心的初始化来解决梯度饱和梯度消失的问题。如果我们能保证网络输入分布更加稳定,那么优化器陷入饱和的可能性会降低,也就加速网络训练。

我们称深层网络内部节点分布的改变为内部协方差偏移(Internal Covariate Shift)。消除内部协方差偏移,可以加速网络的训练。我们提出一个新的机制,批归一化(Batch Normalization),通过在每一步内降低内部协方差偏移(通过固定每一层的均值和方差),可以极大提高网络的训练速度。BN还有一个好处是可以降低梯度在流入网络对于参数尺度变化或者初值的依赖性。这样可以使用更高的学习率,而不会有发散的危险。更进一步,BN正则化了网络,降低了对Droput的需求。最后,BN可以避免网络陷入饱和。

2 Towards Reducing Internal Covariate Shift

我们定义内部协方差偏移为网络激活值的分布改变,体现在训练过程中网络参数的不断改变。为了改善训练过程,我们尽量降低内部协方差偏移。通过固定每一层输入的分布,期待提高训练速度。众所周知,如果输入经过白化操作,那么网络收敛会更快,例如线性变换至具有零均值和单位方差,以及去相关。当每一层观察到由其它层产生的输入层,那么每一层的输入都可以获得同样的白化效果。通过白化每一层的输入,我们将会得到固定的输入分布,因此降低了层内协方差偏移的影响。

我们通过在训练的每一步或者一定的时间间隔考虑白化激活操作:要么直接修改网络,要么根据网络的激活值,修改优化算法的参数。但是,如果这些修改伴随优化的每一步,那么梯度下降会尝试以归一化更新的方式更新梯度,降低了梯度步骤的影响。例如,考虑某一层的输入为u,并添加学习的偏置b,通过计算训练数据的均值:\hat{x} = x - E[x],x = u + b,\chi = {x_1...x_N}是训练集的值,E[x] = \frac{1}{N}\sum_{i=1}^{N}x_i。如果一个梯度下降步骤忽略E[x]对b的依赖,那么更新如下 b \leftarrow b + \Delta b,这里\Delta b \propto -\partial \iota /\partial \hat{x}。那么就有:u + (b + \Delta b) -E[u + (b+\Delta b)] = u + b - E[u + b]。这样的话,对于b的更新以及后续归一化的影响的结合,对于层的输出以及损失没有产生任何影响。随着训练的进行,b可能变化很大,但是损确保持固定。如果归一化不仅进行中心化操作,而且对激活值进行缩放,那么这种情况将更加严重。我们在最初的实验中观察到了这种现象,如果归一化参数在每一步梯度更新外进行计算,模型就会训练失败。

上述的方法的问题在于梯度下降优化过程中,没有考虑归一化发生的情况。为了解决这个问题,我们希望,对于任何参数值,网络产生的激活值总会是我们期望的分布。这样做可以保证损失梯度的更新考虑到了模型参数与归一化的关系,以及对于模型训练参数的依赖。令向量x为层的输入,\small \chi是与x相对应的训练集。归一化可以写成如下变换:

它不仅依赖给定的训练样本x,而且依赖所有的样本\small \chi,如果x是由另外的层产生,那么每一个\small \hat{x}依赖训练参数\small \Theta。反向传播时,需要计算相应的雅克比矩阵:

如果忽略了后面的一项,那么会导致上面描述的训练爆炸。在这种框架下,白化层的输入代价很高,需要计算关于输入x的协方差矩阵\small Cov[x] = E_x\in \chi [xx^{T}] - E[x]E[x^{T}]以及平方根,那么白化后的激活值为\small Cov[x]^{-1/2}(x - E[x]),以及反向传播的导数。这就激发我们寻找一种不同的归一化方式,不需要在每一次参数更新后,分析整个训练集。

以前的一些方法使用一个样本,或者在图像网络中,使用给定位置的不同特征图来计算统计量。但是,这种丢弃激活值的绝对尺度的方法改变了网络的表达能力。我们想要保存网络的信息,通过能够归一化激活值的这种方式,能够使用一个样本与整个样本的统计量产生一定相关。

3  Normalization via Mini-Batch Statistics

由于对每一层进行全白化(full whitening)的代价很高,并且也不是处处可微的,因此我们在两个方面做了简化处理。1、与之前联合白化层的输入和输出特征不同的是,我们独立的归一化每个标量特征,使其具有零均值和单位方差。对于某一层输入维度为d维,也即是\small x = (x^{(1)}...x^{(d)}),我们将归一化每一个维度,公式如下:

这里在整个训练集上计算期望和方差。如LeCun 1998b中陈述,这种归一化可以加速收敛,即使特征是相关的。

值得注意的是,简单的归一化每一个层的输入可能会改变网络层的表达能力。例如,归一化sigmoid的输出会使得值处在非线性变换的线性部分。为了解决这个问题,我们保证嵌入网络内部的变换(下面的等式)可以表达恒等变换。为了达到这个目的,我们为每一个激活值\small x^{(k)}引入一对参数,\small \gamma ^{(k)},\beta ^{(k)},它们可以缩放和移动归一化值:

这些参数和模型参数一起学习,并且能够恢复网络本身的表达能力。事实上,如果设置\small \gamma ^{(k)} = \sqrt{Var[x^{(k)}]}, \beta ^{(k)} = E[x^{(k)}],我们可以恢复原始的激活值(等价于网络本身的表达能力),如果这是最优的选择的话。

在训练批次的设置中,每一步迭代是基于整个训练集,使用整个训练集归一化激活值。但是,这种操作和使用随机优化的方式不好兼容。因此,我们作了第二个简化:2、最小批次随机梯度下降算法,每一个mini-batch产生一个均值和方差的估计。这样,归一化中的统计量可以完全参与到梯度反向传播中。值得注意的是,最小批次计算的是每一个维度的方差,而不是联合协方差;在联合的情况下,由于最小批次的值远远小于需要白化的激活值的数量,会导致奇异协方差矩阵,因此需要正则化。

考虑mini-batch\small \Beta\small \ss,大小为m。由于归一化独立的应用于每一个激活值,我们特别关注激活值\small x^{(k)}\small \kappa。该mini-batch下有激活值m个,如下表示:

令激活值为\small \hat{x}_1...m,它们的线性变换为\small y_1...m,这种变换表达如下:

称之为批归一化变换(Batch Normalizing Transform)。算法1中,表达了这个算法,\small \epsilon是常数,用来保证方差的数值稳定性。

BN变换可以在网络中操作任何激活值。\small y = BN_\gamma,\beta(x),表明参数\gamma \beta需要学习,但是需要注意的是,BN变换并不是单独处理每一个样本的激活值。而是,BN变换依赖于一个mini-batch的所有样本。经过缩放和移动的值y传到网络的其它层。归一化的激活值\small \hat{x}是变换的内部值,但是他们的出现是重要的。并且任何\small \hat{x}值都期望具有零均值和单位方差的分布,如果忽略\small \epsilon,每一个mini-batch具有相同的分布。每一个归一化的激活值\small x^{(k)}可以看作是子网络(\small y^{(k)} = \gamma ^{(k)}\hat{x}^{(k)} + \beta ^{(k)})的输入。这些子网络具有固定的均值和方差,在训练的过程中,尽管这些归一化的值\small x^{(k)}的联合分布可能会改变,我们期待这种这种归一化的引入可以加速子网络的收敛速度,那么也就加速了整个网络的收敛速度。

在训练过程中,我们需要计算BN变换的反向传播,并且计算关于BN变换的参数的梯度,根据反向链式传播准则:

这样,BN变换是可导的变换,并且将归一化激活值引入网络中。这样可以保证模型训练过程中,在具有更少的层内协方差偏移的情况下持续训练,也就加速了网络的训练。进一步,学习到的仿射变换可以应用于归一化的激活值,那么BN就可以表达恒等变换,以及保存网络的容量。

3.1 Training and Inference with Batch Normalized Networks

为了归一化网络,根据算法1,我们在每一层添加BN变换。之前任何一层接受的输入为x,现在输入我BN(x)。我们可以使用批量梯度下降或者随机mini-batch梯度下降方法来训练添加有BN的网络,或者一些变型的优化算法。归一化操作需要考虑mini-batch的大小对效率的影响,但是在预测阶段没有这种顾虑;我们期望输出仅仅依赖输入。基于这个原因,一旦训练好了网络,我们使用归一化操作:

使用统计的方法,而不是使用mini-batch的统计量。忽略\small \epsilon的影响,上面的归一化值和训练过程一样,应该具有均值为0、方差为1的特质。我们使用无偏差方差估计\small Var[x] = \frac{m}{m-1} \cdot E_B[\sigma^{2}_B],均值和方差是根据mini-batch计算。使用移动均值,我们可以追踪模型在训练过程中的精度。因为在预测过程中,均值和方差是固定的,归一化仅仅是线性变换。它包含的参数就是\small \gamma \beta,产生一个线性变换来代替BN(x)。算法2给出了训练过程中BN的处理流程。

3.2 Batch-Normalized Convolutional Networks

BN可以应用于网络中任何的激活值。这里我们关注包含仿射变换的操作,网络通常的非线性操作:

W和b是模型要学习的参数,g是非线性激活函数,比如sigmoid或者ReLU,这个公式覆盖全连接层和卷积层。我们将BN添加在非线性前面,归一化 x = Wu +b。当然也可以归一化输入u,但是由于u是上一个非线性变换的输出,随着训练,它的分布形状是不断变化的,约束相邻时刻的激活值无法消除协方差方差偏移。作为对比,Wu+b更加偏向具有对称、非稀疏的分布,也即是更加符合高斯分布的特点;归一化更容易产生稳定的分布。

注意的是,归一化,可以忽略b的影响,在减均值会将b去掉,所以z=g(Wu+b)变为:

这里,BN被独立的应用于x=Wu的每一个维度,每一个维度都有一对参数\small \gamma ^{(k)},\beta ^{(k)}.

对于卷积层,我们希望归一化能够保证卷积的特性,同一张特征图不同位置的不同元素采用同一种归一化方式。为了达到这样的目的,我们联合归一化一个mini-batch内不同位置的所有激活值。在算法1中,令B为一张特征图中所有元素,包含一个mini-batch以及空间位置,所以对于大小为m的mini-batch,特征图大小为pxq,我们使用有效的mini-batch大小为\small m^' = |\ss | = m\cdot pq。我们为以每一张特征图学习一对参数\small \gamma ^{(k)},\beta ^{(k)},而不是每一个激活值。算法2的更新类似,以至于在推断阶段,BN变换可以对一张特征图的每一个激活位置使用相同的线性变换,具体计算可以参考下图:

3.3 Batch Normalization Enables Higher Learning Rates

在传统的深度网络中,太高的学习率可能导致梯度爆炸或者梯度消失,以及陷入局部最优,BN可以解决上述问题。整个网络使用BN,可以避免参数微小的变化会使得激活值的梯度被放大更大;例如,它保证训练不会陷入非线性的饱和区域。

BN也可以使得网络对参数的尺度更加宽松。一般情况下,大的学习率会放大层参数的尺度,也就在反向传播中放大梯度,导致模型爆炸。但是,使用BN,参数尺度的变化不会影响反向传播。事实上,对于标量a,

即,尺度不会对层的雅克比矩阵造成影响,进而影响梯度。更进一步,更大的权重导致小的梯度,BN也会稳定参数的增长。

我们进一步推测,批标准化可能会导致雅可比行列式的奇异值接近于1,这被认为对训练是有利的(Saxe et al., 2013)。考虑具有标准化输入的两个连续的层,并且变换位于这些标准化向量之间:\small \hat{z} = F(\hat{x})。如果我们假设\small \hat{x}\small \hat{z}是高斯分布且不相关的,那么\small F(\hat{x}) \approx J\hat{x}是对给定模型参数的一个线性变换,\small \hat{x}\small \hat{z}有单位方差,并且\small I = Cov[\hat{z}] = JCov[\hat{x}]J^T = JJ^T。因此,\small JJ^T = I是正交的,其保留了反向传播中的梯度大小。尽管上述假设在现实中不是真实的,但我们希望批标准化有助于梯度传播更好的执行。这有待于进一步研究。

3.4 Batch Normalization Regularizes the Model

当网络中有BN层,一个mini-batch内的一个样本将和其它样本有关系,那么单个样本就无法产生决定性的值。在我们的实验中,我们发现这将有益于模型的生成。通常,Dropout用于降低网络的过拟合,但是BN可以替代其作用,或者极大弱化Dropout的作用;

4 Experiments

4.1 Activations over time

为了验证内部协方差漂移的影响,以及BN可以抑制它的能力,我们考虑数字分类问题,输入图片大小为28x28,三个全连接层,每一层的激活单元为100个。每一层隐藏层使用sigmoid非线性激活函数,W初始化为小的随机高斯值。最后一层为10个节点的全连接层(每一个表示一类),损失函数为交叉熵。网络训练50000步,mini-batch为60,。每一个隐藏层添加一层BN操作。该实验主要是比较基准网络和BN网络在MNIST上的差别,而不是得到行内标准。

图一给出了两种网络的训练过程,以及测试结果。BN网络得到更高的测试精度。为了解释原因,我们研究了训练过程中,原网络N和BN网络中sigmoid的输入变换情况。图1,bc中可以看出,每个网络最后一层的分布的变化过程。原网络中,均值和方差变化较大,那么将使得下一层的训练变得复杂。作为对比,BN网络中的分布变化更加稳定,有助于训练。

4.2 ImageNet Classification

我们将BN应用在Inception网络中,使用ImageNet数据集进行训练。该网络有大量的卷积核池化层,使用softmax预测图片的分类,输出1000个概率值。卷积层使用ReLU激活函数,与Inception不同的是:将5x5卷积替换为2个3x3卷积,滤波器个数增加到128个。网络包含13.6x10^6个参数,除了顶层的softmax层,没有全连接层,更详细的表述在附录里。我们称这种模型为Inception模型。模型使用没有动量的司机梯度下降算法,mini-batch为32。所有的网络在训练过程中评估top1精确度。在测试集上,每张图使用单个裁剪。

在我们的实验中,我们评估了不同的Inception版本。在所有的情况下,BN放在所有的非线性输入端,也即是Conv-BN-ReLU。

4.2.1 Accelerating BN Networks

简单的将BN添加到网络中不能很好体现该方法的优势。为了证明BN的巨大作用,我们进一步改变网络以及相应的训练参数:

  • Increase Learning Rate:在添加BN的网络中,我们可以使用较大的学习率,因此加速了网络的训练,而且没有副作用。
  • Remove Dropout: 正如3.4描述的那样,BN可以达到Dropout的效果,用BN替代Dropout,可以增加训练速度,并且不会增加过拟合。
  • Reduce the L2 Weight Regularization: 在Inception模型中,L2损失可以控制模型的过拟合,在修改的BN-Inception模型中,该损失降低5倍。结果表明,测试集精度有改善。
  • Accelerate the Learning Rate Decay: 在训练Inception模型中,学习率呈现指数衰减。由于我们的网络比Inception训练更快,我们减低了6倍的学习率速度。
  • Remove Local Repose Normalization: LRN对于网络有好处,但是BN可以取代他。
  • Shuffle Training Examples More Thoroughly: 我们尽可能打乱训练数据,防止同样的数据总是出现在一个batch中。这会导致验证集精度提高1%,这与BN可以作为正则化方法相符合。
  • Reduce The Photometric Distortions: 因为BN网络训练速度更快,观察每一个数据更少,我们使得网络更多的关注真实的图片,也即是更少的扭曲原图片;

4.2.2 Single-Network Classification

我们评估如下的网络,所有的网络训练在LSVRC2012的训练集上,在验证集上测试:

Inception: 网络结构如4.2描述,初始学习率为0.0015.

BN-Baseline: 在Inception的基础上添加BN,添加位置为非线性激活函数之前。

BN-X5:Inception-BN基础上,其它修改如4.2.1所示。初始学习率增加5倍,0.0075。同样的学习率应用在Inception上,会引起模型参数无限小。

BN-X30:如BN-X5,初始学习率为.045.

BN-X5-Sigmoid:如BN-X5,但是激活函数为sigmoid。我们也实验过Inception+sigmoid,但是模型精度保持随机。

图2展示了网络的验证精度,横轴为训练步骤。31x10^6步骤后,Inception达到72%的精度。图3表明,对于每一个网络,达到同样的72.2%的精度,需要的步数,以及最大验证集精度

         

对于BN-Baseline,达到Inception网络同样的精度,但是使用了少于一半的步数。按照4.2.1修改网络,极大的提高了网络的训练速度。BN-X5达到72.2%的精度,比Inception少了14倍的步骤。有趣的是,学习率更高的网络(BN-X30),初始精度略低,但是最终的精度更高。在6x10^6步数后,达到74.8%的精度,相比于Inception大概少了5倍的步数。

我们仍验证了,降低了内部协方差偏移,可以使得BN+Sigmoid可以训练,尽管一般来说,这样的网络时很难训练的。事实上,BN-X5-Sigmoid达到了69.8%的精度。没有BN的情况下,Inception+Sigmoid从来没有达到1/1000的精度。

5、论文核心解析

论文研究目的:缓解深度神经网络难以训练的问题,使得能够更快(达到同样的精度,需要更少的步数)、更容易(对学习率和权重参数初始化敏感度更低,并且训练更稳定)、更好(最终的效果更好)的训练深度神经网络;

解决什么问题?

BN是为了解决 "Internal Covariate Shift",即内部协方差偏移的问题。论文中给出了较为规范的定义:在深层网络训练的过程中,由于网络中参数变化而引起内部结点数据分布发生变化的过程被称作 Internal Covariate Shift。简单的说,随着训练的进行,每一层的参数不断被更新,其分布也在不断的变化(ICS),那么网络的需要不断的适应新的不同的分布,也就导致网络难以训练。

什么是BN?

在一个mini-batch的训练中,对相应的激活值做规范化操作(通常为BN(Wx)),使得结果输出均值为0,方差为1(具体见算法1),最后的 "Scale and Shift" 操作则是为了让BN能够有可能还原最初的输入,从而保证不会降低整个网络本身的表达能力。(有关表达能力的解释:实际上BN可以看作是在原模型上加入的“新操作”,这个新操作很大可能会改变某层原来的输入。当然也可能不改变,不改变的时候就是“还原原来输入”。如此一来,既可以改变同时也可以保持原输入,那么模型的表达就提升了)

BN的优势?

(1)BN使得网络中每层输入数据分布相对稳定,加速模型的学习速度

BN通过规范化与线性变换使得每一层网络的输入数据的均值与方差都在一定范围内,使得后一层网络不必不断去适应底层网络中输入的分布变化,从而实现网络中层与层之间的解耦,允许每一层进行独立学习,有利于提高整个神经网络的学习速度。

(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定

参考知乎资源:https://zhuanlan.zhihu.com/p/34879333

可以看到,经过BN操作以后,权重的缩放值会被“抹去”,因此保证了输入数据分布稳定在一定范围内。另外,权重的缩放并不会影响到对 的梯度计算并且当权重越大时,即 越大,1/a越小意味着权重W的梯度反而越小这样BN就保证了梯度不会依赖于参数的 scale,使得参数的更新处在更加稳定的状态。

(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题

在不使用BN层的时候,由于网络的深度与复杂性,很容易使得底层网络变化累积到上层网络中,导致模型的训练很容易进入到激活函数的梯度饱和区;通过BN操作可以让激活函数的输入数据落在梯度非饱和区,缓解梯度消失的问题;另外通过自适应学习\small \gamma\small \beta让数据保留更多的原始信息。

(4)BN具有一定的正则化效果

在Batch Normalization中,由于我们使用mini-batch的均值与方差作为对整体训练样本均值与方差的估计,尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。

 

Logo

更多推荐