论文泛读 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift(代码

Posted 风信子的猫Redamancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文泛读 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift(代码相关的知识,希望对你有一定的参考价值。

【论文泛读】 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift


论文链接: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。

其实对于现在的深度学习来说,BN层已经见怪不怪了,但是真正有去挖掘这篇论文,或者说懂Batch Normalization的很少了,很多人在网上可能都是摆出公式泛泛而谈,所以我就仔细的看了这篇论文,写下这篇笔记

摘要 Abstract

训练深度神经网络的复杂性在于,每层输入的分布在训练过程中会发生变化,因为前面的层的参数会发生变化。通过要求较低的学习率和仔细的参数初始化减慢了训练,并且使具有饱和非线性的模型训练起来非常困难。我们将这种现象称为 Internal Covariate Shift ,并通过标准化层输入来解决这个问题。我们的方法力图使标准化成为模型架构的一部分,并为每个训练小批量数据执行标准化。 Batch Normalization 使我们能够使用更高的学习率,并且不用太注意初始化。它也作为一个正则化项,在某些情况下不需要Dropout。将批量标准化应用到最先进的图像分类模型上, Batch Normalization 在取得相同的精度的情况下,减少了14倍的训练步骤,并以显著的差距击败了原始模型。使用 Batch Normalization 网络的组合,我们改进了在ImageNet分类上公布的最佳结果:达到了4.9% top-5的验证误差(和4.8%测试误差),超过了人类评估者的准确性。

介绍 Introduction

在这一部分,首先作者介绍了一下SGD,也就是我们常说的随机梯度下降算法。随机梯度下降(SGD)已经被证明是训练深度网络的有效方式,并且随之也出现了动量法和Adagrad等优化算法。SGD优化网络参数 Θ \\Theta Θ,以最小化损失
Θ = arg ⁡ min ⁡ Θ 1 N ∑ i = 1 N l ( x i , Θ ) \\Theta = \\arg \\min_{\\Theta} \\frac{1}{N}\\sum^{N}_{i=1}\\mathscr{l}(x_i,\\Theta) Θ=argΘminN1i=1Nl(xi,Θ)
在训练过程中,我们还通常是一个个mini-batch进行训练的,也就是使用小批量的样本,使用小批量数据来近似损失函数关于参数的梯度

使用小批量样本 m m m有帮助的

  • mini-batch的梯度损失是训练集的梯度估计,并且样本越大越准确,我觉得这一部分类似于大数定律。
  • 由于现代计算平台提供的并行性,对一个批次 m m m的计算比单个样本计算 m m m次效率更高。计算效率会更高

虽然随机梯度是简单有效的,但它需要仔细调整模型的超参数,特别是优化中使用的学习速率以及模型参数的初始值。训练的复杂性在于每层的输入受到前面所有层的参数的影响——因此当网络变得更深时,网络参数的微小变化就会被放大。

对于神经网络来说,每一层输入的分布变化是一个问题,因为这些层需要不断适应新的分布。当学习系统的输入分布发生变化时,据说会经历 Internal Covariate Shift (Shimodaira,2000),这通常是通过域适应(Jiang,2008)来处理的。

这里可能就出现一个词,也就是 Internal Covariate Shift ,这个词在我们的题目也出现了Internal Covariate Shift,这也被称为ICS问题,我觉得我们可以先浅显理解一下:如果训练数据经过网络的每一层后其分布都发生了变化,会极大的降低优化的效率。

接着作者举了一个子网络的例子,旨在说明,如果输入分布相同,对于我们的网络来说,可以减少更多的时间,也可以不用去修改过多的参数。

除此之外,固定分布的输入对我们的网络也是有积极的影响的。比如考虑 s i g m o i d sigmoid sigmoid函数,对于这个激活函数来说,我们很多论文都提到过,随着 ∣ x ∣ |x| x的增加,我们梯度会趋近于0,这意味着对于我们的神经网络来说,除了一开始的具有小的绝对值的输入之外,后面很多的梯度都会消失,会减小我们的训练速度,缓慢收敛。并且这种情况在深层网络中更为明显,这也就是我们常说的梯度消失。在实践中,提出了一个ReLU函数, R e L U = m a x ( 0 , x ) ReLU = max(0,x) ReLU=max(0,x),这个函数就不那么容易出现饱和问题,同时我们也可以调整小的学习率和仔细初始化来解决这个饱和问题,使得我们的优化器不太可能陷入饱和状态,从而加速训练。

作者把训练过程中深度网络内部节点分布变化称为 Internal Convariate Shift,如果解决掉他可以加快我们的训练,所以作者就提出了一个机制,也就是 Batch Normalization ,它是减少 Internal Covariate Shift 的一个步骤,这样做可以显著加速深度神经网络的训练。它通过标准化步骤来实现,标准化步骤修正了层输入的均值和方差。标准化减少了梯度对参数或它们的初始值尺度上的依赖,对通过网络的梯度流动有有益的影响。这允许我们使用更高的学习率而没有发散的风险。此外, Batch Normalization 使模型正则化并减少了对Dropout(Srivastava et al., 2014)的需求。最后, Batch Normalization 通过阻止网络陷入饱和模式让使用饱和非线性成为可能,比如我们可以用sigmoid函数等等

总结一下

  • 保持各层输入的均值和方差稳定,来减弱 internal covariate shift
  • 让梯度受参数及其初值的减小
  • 算作正则项,减少对Dropout的依赖
  • 让卡在饱和区域的概率降低,以便可以使用 saturating nonlinearities

并且在ImageNet的实验中,已经证明了BN层的优化效果是非常好的,改进了当时的最佳结果。

减少 Internal Covariate Shift Towards Reducing Internal Covariate Shift

由于训练过程中网络参数的变化,我们将 Internal Covariate Shift 定义为网络激活分布的变化。我们固定层输入x的数据分布,希望能够提高训练的速度。众所周知(LeCun et al., 1998b; Wiesler & Ney, 2011)如果对网络的输入进行白化,网络训练将会收敛的更快——即输入线性变换为具有零均值和单位方差,并去相关。当每一层观察下面的层产生的输入时,实现每一层输入进行相同的白化将是有利的。通过白化每一层的输入,我们将采取措施实现输入的固定分布,消除 Internal Covariate Shift 的不良影响。

这里面出现了一个词 白化,可能会有一点点陌生,虽然他可能不是很重要,但是我还是查了维基百科等等去寻找他的解释,比较的简单来说,通过白化后,数据不具有相关性,并且具有相同的方差1,均值为0,协方差矩阵为对角矩阵。

这里我们可能需要区分一下几个概念

  • 标准化:均值为0,方差为1,不考虑相关性
  • 去相关化:仅使变量不相关,不考虑方差
  • 有色变换:将白色随机变量转换为指定协方差矩阵的随机向量

白化是不同的,这里有张图,可以表示一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdlEYRz5-1633495734849)(C:\\Users\\86137\\AppData\\Roaming\\Typora\\typora-user-images\\image-20211005012938039.png)]

在很多的程序中,可以我们的白化实现会通过,PCA+归一化,这样子我们的数据既不相关,并且方差为1,均值为0

数据相关经常用协方差矩阵来表示,如果一个分布在给定正交基是各项独立,互不相关的话,那么协方差矩阵就是对角矩阵。因为每一个维度只与自己相关(对角线),与其他的维度都为0,所以协方差矩阵为对角矩阵。

参考

解释完白化,接着就继续读论文吧。

作者接着考虑在每个训练步骤或在某些间隔来白化激活值,通过直接修改网络或根据网络激活值来更改优化方法的参数*(Wiesler et al., 2014; Raiko et al., 2012; Povey et al., 2014; Desjardins & Kavukcuoglu)*。然而,如果这些修改分散在优化步骤中,那么梯度下降步骤可能会试图以要求标准化进行更新的方式来更新参数,这会降低梯度下降步骤的影响。

这里举了一个例子,比如考虑一个层,他的输入 u u u加上学习到的偏置 b b b,通过减去在训练集上计算的激活值的均值对结果进行归一化: x ^ = x − E [ x ] , x = u + b , X = x 1... N \\hat{x} = x - E[x],x=u+b,X=x_{1...N} x^=xE[x],x=u+b,X=x1...N是训练集上 x x x值的集合, E [ x ] = 1 N ∑ i = 1 N x i E[x] = \\frac{1}{N}\\sum^{N}_{i=1}x_i E[x]=N1i=1Nxi。如果梯度下降步骤忽略了 E [ x ] E[x] E[x] b b b的依赖,那它将更新 b ← b + Δ b b\\larr b+\\Delta b bb+Δb,其中 Δ b ∝ − ∂ ℓ / ∂ x Δb ∝−∂ℓ/∂x Δb/x,然后 u + ( b + Δ b ) − E [ u + ( b + Δ b ) ] = u + b − E [ u + b ] u+(b+\\Delta b)-E[u+(b+\\Delta b)] = u +b -E[u+b] u+(b+Δb)E[u+(b+Δb)]=u+bE[u+b](这个公式成立的原因是 E [ x ] E[x] E[x] b b b没什么关系,所以 E [ Δ b ] = Δ b E[\\Delta b] = \\Delta b E[Δb]=Δb)。因此,结合 b b b的更新和接下来标准化中的改变会导致层的输出没有变化,从而导致损失没有变化。随着训练的继续, b b b将无限增长而损失保持不变。如果标准化不仅中心化而且缩放了激活值,问题会变得更糟糕。并且作者在最初的实验也发现了这一点,当标准化参数在梯度下降步骤之外计算时,模型会爆炸。

上述方法的问题就是梯度下降优化的时候,没有考虑标准化,为了解决这个问题呢,我们希望对于任何参数值,网络总是产生具有所需分布的激活值。这样做能更好的解释标准化和对模型参数 Θ \\Theta Θ的依赖。

x x x为层的输入,将其看作向量, X ^ \\hat{X} X^是输入在训练集上的集合。标准化可以写为变换
x ^ = N o r m ( x , X ^ ) \\hat{x}=Norm(x,\\hat{X}) x^=Norm(x,X^)
它不仅仅依赖于给定的训练样本 x x x, 并且也依赖于所有的样本 X ^ \\hat{X} X^,如果他们是由另一层生成的,还都依赖于 Θ \\Theta Θ。对于反向传播,我们就需要计算雅可比行列式
∂ N o r m ( x , X ^ ) ∂ x  和  ∂ N o r m ( x , X ^ ) ∂ X ^ \\frac{\\partial Norm(x,\\hat{X})}{\\partial x}\\text{ 和 }\\frac{\\partial Norm(x,\\hat{X})}{\\partial \\hat{X}} xNorm(x,X^)  X^Norm(x,X^)
在这个框架中,输入是昂贵的,或者可以理解为耗费的计算资源是比较大的,因为它要求计算协方差矩阵 C o v [ x ] = E x ∈ X ^ [ x x T ] − E [ x ] E [ x ] T Cov[x]=E_{x \\in \\hat{X}}[xx^T] - E[x]E[x]^T Cov[x]=ExX^[xxT]E[x]E[x]T和他的平方根的倒数,从而生成白化的激活 C o v [ x ] − 1 / 2 ( x − E [ x ] ) Cov[x]^{-1/2}(x-E[x]) Cov[x]1/2(xE[x])和这些变换进行反向传播的偏导数。所以促使着我们寻找另一种替代的防范,可以以微分的方式进行输入标准化,并且在每次参数更新后不需要对整个训练集进行分析。并且我们希望通过对相对于整个训练数据统计信息的单个训练样本的激活值进行归一化来保留网络的信息。

通过Mini-Batch 统计标准化 Normalization via Mini-Batch Statistics

如果对于每一层都进行白化的代价是很昂贵的,并且也不是处处可微的,所以呢,对此相处了两个必要的简化

首先,我们可以单独标准化标量特征,使其均值为0,方差为1,而不用总体白化。

可以用标准化,用以下公式对每一维进行标准化,其中期望和方差在整个训练集上计算。
x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \\hat{x}^{(k)}=\\frac{x^{(k)}-E[x^{(k)}]}{\\sqrt{Var[x^{(k)}]}} x^(k)=论文笔记-Batch Normalization

论文笔记-Batch Normalization

论文笔记:Batch Normalization

网络优化Batch Normalization(inception V2) 论文解析(转)

经典BN很NB,精读论文《Batch Normalization》

BN(Batch Normalization) 原理与使用过程详解