论文

NLP论文笔记合集(持续更新)

原论文:《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》

对 Batch Normalization 进行解释:《How Does Batch Normalization Help Optimization?》

介绍

2015-06发表的文章,提出了 batch normalization。在过去,训练过程中,随着前一层参数的变化,每一层输入的分布都会发生变化,我们将这种现象称为 internal covariate shift,网络需要适应这种分布不一致从而增加了学习的难度。这需要较低的学习率和更谨慎地进行参数初始化来减缓这个问题,但同时又会减慢了训练速度,并且使得训练具有饱和非线性的模型非常困难。为了能够使用更高的学习率加速训练,对于模型来说不敏感的参数初始化,以及具有饱和非线性的模型,该文章提出了 batch normalization。

优点

  1. 允许模型使用更高的学习率,加速训练;
  2. 使得进行参数初始化不用那么谨慎;
  3. 支持模型使用饱和非线性的激活函数;
  4. 抑制梯度损失和梯度爆炸。
  5. 具有一定的正则化作用,dropout 可以被移除或抑制过拟合的作用会降低。

缺点

  1. 文章说它解决 internal covariate shift 的问题,而文章《How Does Batch Normalization Help Optimization?》说明了 batch normalization 其实和 internal covariate shift 的关系并不大,其能工作的原因是使损失平面更加平滑,并给出了其结论的数学证明;
  2. 对于nlp任务,不像cv,它的输入通常是不等长的,batch normalization 效果并不好。

模型结构

考虑一个大小为 m m m 的 mini-batch B = { x 1... m } \mathcal{B}=\{\mathrm{x}_{1...m}\} B={x1...m},它是前一层自身 mini-batch 的输出,是当前层的输入。每一个样例输入 x = ( x ( 1 ) . . . x ( d ) ) \mathrm x=(x^{(1)}...x^{(d)}) x=(x(1)...x(d)) 都是 d d d 维的。batch normalization 是针对一个 mini-batch 的每个维度进行的,因此为了简化符号,对于输入的第 k k k x ( k ) x^{(k)} x(k),接下来将忽略上标 ( k ) ^{(k)} (k)

对于输入的第 k k k 维的 batch normalization 计算如下:
μ B ← 1 m ∑ i = 1 m x i / / mini-batch 均值 \mu_{\mathcal{B}} \leftarrow \frac{1}{m}\sum\limits_{i=1}^mx_i \quad\quad\quad\quad\quad// \text{mini-batch 均值} μBm1i=1mxi//mini-batch 均值 σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) 2 / / mini-batch 方差 \sigma_{\mathcal{B}}^2 \leftarrow \frac{1}{m}\sum\limits_{i=1}^m(x_i-\mu_{\mathcal{B}})^2 \quad\quad\quad\quad\quad// \text{mini-batch 方差} σB2m1i=1m(xiμB)2//mini-batch 方差 x ^ i ← x i − μ B σ B 2 + ϵ / / normalize \hat{x}_i \leftarrow \frac{x_i-\mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^2+\epsilon}} \quad\quad\quad\quad\quad// \text{normalize} x^iσB2+ϵ xiμB//normalize y i = γ x ^ i + β / / 缩放和平移 y_{i} = \gamma \hat{x}_i+\beta \quad\quad\quad\quad\quad// \text{缩放和平移} yi=γx^i+β//缩放和平移 ϵ \epsilon ϵ 是一个加在 mini-batch 方差上的常数,不需要学习。 γ , β \gamma,\beta γ,β 是待学习的参数。 μ B , σ B 2 \mu_{\mathcal{B}},\sigma_{\mathcal{B}}^2 μB,σB2 显然是网络中需要保留的统计量,但它只是一个 batch 的统计量,用来代表整个数据集显然是不合适的,因此需要在训练过程中,求得能够代表整个数据集信息的统计量 μ , σ 2 \mu,\sigma^2 μ,σ2

论文中是说,训练结束后,在 inference 阶段,处理多个训练 mini-batch B \mathcal{B} B,每个 size 为 m m m,并对其进行平均 E [ x ] ← E B [ μ B ] \mathrm{E}[x] \leftarrow \mathrm{E}_{\mathcal{B}}[\mu_{\mathcal{B}}] E[x]EB[μB] V a r [ x ] ← m m − 1 E B [ σ B 2 ] \mathrm{Var}[x] \leftarrow \frac{m}{m-1} \mathrm{E}_{\mathcal{B}}[\sigma_{\mathcal{B}}^2] Var[x]m1mEB[σB2]

而在 pytorch 代码中,是通过简化的方法(累积滑动平均值)求 E [ x ] , V a r [ x ] \mathrm{E}[x],\mathrm{Var}[x] E[x],Var[x] E [ x ] n e w = ( 1 − m o n e n t u m ) × E [ x ] + m o n e n t u m × μ B \mathrm{E}[x]_{new} = (1- \mathrm{monentum}) \times \mathrm{E}[x] + \mathrm{monentum} \times \mu_{\mathcal{B}} E[x]new=(1monentum)×E[x]+monentum×μB V a r [ x ] n e w = ( 1 − m o n e n t u m ) × V a r [ x ] + m o n e n t u m × σ B 2 \mathrm{Var}[x]_{new} = (1- \mathrm{monentum}) \times \mathrm{Var}[x] + \mathrm{monentum} \times \sigma_{\mathcal{B}}^2 Var[x]new=(1monentum)×Var[x]+monentum×σB2其中 momentum 默认值:0.1。

所以最终 batch normalization 的变换为: y = γ V a r [ x ] + ϵ ⋅ x + ( β − γ E [ x ] V a r [ x ] + ϵ ) y=\frac{\gamma}{\sqrt {\mathrm{Var}[x]+\epsilon}}\cdot x+(\beta-\frac{\gamma \mathrm{E}[x]}{\sqrt {\mathrm{Var}[x]+\epsilon}}) y=Var[x]+ϵ γx+(βVar[x]+ϵ γE[x])

文章部分翻译

Abstract

深层神经网络的训练是复杂的,因为在训练过程中,随着前一层参数的变化,每一层输入的分布都会发生变化。这需要较低的学习率和仔细的参数初始化,从而减慢了训练速度,并且使得训练具有饱和非线性的模型非常困难。我们将这种现象称为 internal covariate shift,并通过 normalize 层输入来解决这个问题。我们的方法将 normalization 作为模型体系结构的一部分,并为每个训练 mini-batch 执行 normalization,从而发挥了它的优势。batch normalization 允许我们使用更高的学习率,并且在初始化时不用那么小心。它还充当正则化器,在某些情况下消除了 dropout 的需要。应用于最先进的图像分类模型,batch normalization 以比原始模型的训练少14倍的步骤实现了相同的精度,并显著优于原始模型。使用 batch-normalized 网络集成的模型,我们改进了 ImageNet 分类的最佳公布结果:达到前五的4.9%验证误差(和4.8%的测试误差),超过了人类评分员的准确度。

1 Introduction

深度学习极大地提升了视觉、语言和许多其他领域的技术水平。随机梯度下降(SGD)已被证明是训练深层网络的一种有效方法,SGD变体(如momentum(Sutskever et al.,2013)和Adagrad(Duchi et al.,2011))已被用于实现最先进的性能。SGD优化了网络的参数 Θ \Theta Θ,从而将损失降至最低 Θ = a r g   min Θ 1 N ∑ i = 1 N ℓ ( x i , Θ ) \Theta=\mathrm{arg} \, \underset{\Theta}{\text{min}}\frac{1}{N}\sum\limits_{i=1}^N\ell(\mathrm{x}_i,\Theta) Θ=argΘminN1i=1N(xi,Θ)其中 x 1... N \rm{x}_{1...N} x1...N 是训练数据集。在SGD中,训练按步进行,并且在每一步中考虑一个大小为 m m m 的 mini-batch x 1... m \rm{x}_{1...m} x1...m。使用 mini-batch 来近似损失函数相对于参数的梯度,通过计算 1 m ∂ ℓ ( x i , Θ ) ∂ Θ . \frac{1}{m}\frac{\partial \ell (\mathrm{x}_i,\Theta)}{\partial \Theta}. m1Θ(xi,Θ).

一次使用 mini-batch 个样例,而不是一次使用一个样例,在几个方面都有帮助。首先,mini-batch 损失的梯度是对训练集梯度的估计,估计的质量随着 batch size 的增加而提高。第二,由于现代计算平台提供的并行性,批量计算可能比单个样例的 m m m 次计算更有效。

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

各层输入分布的变化带来了一个问题,因为各层需要不断适应新的分布。当学习系统的输入分布发生变化时,据说会经历 covariate shift(Shimodaira,2000)。这通常通过 domain adaptation 来处理(Jiang,2008)。然而,covariate shift 的概念可以扩展到整个学习系统之外,以应用于其它部分,例如子网络或层。考虑网络计算 ℓ = F 2 ( F 1 ( u , Θ 1 ) , Θ 2 ) \ell=F_2(F_1(\rm{u},\Theta _1),\Theta _2) =F2(F1(u,Θ1),Θ2)其中 F 1 F_1 F1 F 2 F_2 F2 是任意变换,参数 Θ 1 \Theta _1 Θ1 Θ 2 \Theta _2 Θ2 将被学习以最小化损失 ℓ \ell 。可以将学习 Θ 2 \Theta _2 Θ2 视为输入 x = F 1 ( u , Θ 1 ) \rm{x}=F_1(\rm{u},\Theta _1) x=F1(uΘ1) 馈入到子网络 ℓ = F 2 ( x , Θ 2 ) . \ell=F_2(\rm{x},\Theta _2). =F2(x,Θ2).
例如,一个梯度下降步 Θ 2 ← Θ 2 − α m ∑ i = 1 m ∂ F 2 ( x i , Θ 2 ) ∂ Θ 2 . \Theta _2\leftarrow\Theta _2-\frac{\alpha}{m} \sum\limits_{i=1}^m \frac{\partial F_2(\mathrm{x}_i,\Theta _2)}{\partial \Theta_2}. Θ2Θ2mαi=1mΘ2F2(xi,Θ2).(对于 batch size 为 m m m 和学习率为 α \alpha α)与具有输入 x \rm{x} x 的独立网络 F 2 F_2 F2 的一个梯度下降步完全等效。因此,使训练变得更有效的输入分布性质——例如在训练和测试数据之间具有相同的分布——也适用于子网络的训练。因此,随着时间的推移, x \rm{x} x 的分布保持固定是有利的。然后, Θ 2 \Theta_2 Θ2 不必重新调整以补偿 x \rm{x} x 分布的变化。

子网络输入的固定分布也会对子网络外的层产生积极影响。考虑具有 sigmoid 激活函数 z = g ( W u + b ) \rm{z}=\mathit{g}(\mathit{W}u+\rm{b}) zg(Wu+b) 的层,其中 u \rm{u} u 是层输入,权重矩阵 W \mathit{W} W 和偏置矢量 b \rm{b} b 是要学习的层参数, g ( x ) = 1 1 + e x p ( − x ) \mathit{g}(x)=\frac{1}{1+exp(-x)} g(x)=1+exp(x)1。随着 ∣ x ∣ |x| x 的增加, g ′ ( x ) \mathit{g}'(x) g(x)趋于零。这意味着,对于 x = W u + b \rm{x}=\mathit{W}u+\rm{b} x=Wu+b 的所有维度(绝对值较小的维度除外),传播到 u \rm{u} u 的梯度将消失,模型将训练缓慢。然而,由于 x \rm{x} x W \mathit{W} W b \rm{b} b 和下面所有层的参数的影响,在训练期间对这些参数的更改可能会使 x \rm{x} x 的许多维度进入非线性的饱和状态,并减慢收敛速度。随着网络深度的增加,这种影响会加剧。在实践中,饱和问题和由此产生的消失梯度通常通过使用 Rectified Linear Units(Nair&Hinton,2010) R e L U ( x ) = max ⁡ ( x , 0 ) ReLU(x)=\max(x,0) ReLU(x)=max(x0)、仔细初始化(Bengio&Glorot,2010;Saxe等人,2013)和小学习率来解决。然而,如果我们能够确保非线性输入的分布在网络训练时保持更稳定,那么优化器就不太可能陷入饱和状态,训练也会加快。

我们将训练过程中深层网络内部节点分布的变化称为 Internal Covariate Shift。消除它有助于加快训练速度。我们提出了一种新的机制,我们称之为 Batch Normalization,它朝着减少 internal covariate shift 的方向走,并在这一过程中显著地加速了深层神经网络的训练。它通过一个 normalization 步骤来完成这一过程,该步骤将确定层输入的平均值和方差。batch normalization 还可以通过减少梯度对参数规模或初始值的依赖性,对通过网络的梯度流产生有利影响。这使我们能够使用更高的学习率,而不存在 divergence 的风险。此外,batch normalization 使模型正则化,并减少 dropout 的需要(Srivastava等人,2014年)。最后,batch normalization 通过防止网络陷入饱和模式,使使用饱和非线性成为可能。

(注:divergence 应该是指高学习率与饱和问题和由此产生的消失梯度的矛盾。)

在第4.2节中,我们对性能最佳的 ImageNet 分类网络应用 batch normalization,并表明我们仅使用7%的训练步骤就可以匹配其性能,并且可以进一步超出其准确度相当大的幅度。使用经过 batch normalization 训练的此类网络的集成模型,我们达到了前五名的错误率,这在 ImageNet 分类的最著名结果的基础上有所提高。

2 Towards Reducing Internal Covariate Shift

我们将 Internal Covariate Shift 定义为训练期间网络参数变化引起的网络激活分布变化。为了改进训练,我们寻求减少 internal covariate shift。随着训练的进行,通过固定层输入 x \rm{x} x 的分布,我们期望提高训练速度。人们早就知道(LeCun等人,1998b;Wiesler&Ney,2011),如果网络训练的输入是白化的,即线性变换为零均值和单位方差,并且是不相关的,则网络训练收敛得更快。由于每一层观察下面各层产生的输入,因此实现每一层输入相同的白化将是有利的。通过对每一层的输入进行白化,我们将朝着实现固定的输入分布的方向走,从而消除 internal covariate shift 的不良影响。

我们可以考虑在每个训练步或在一定训练间隔内白化激活,或者通过直接修改网络或通过改变优化算法的参数来依赖于网络激活值(Wiesler等人,2014;Raiko等人,2012;Poviy等人,2014;德贾斯丁和KavukCuGuLU)。然而,如果这些修改与优化步骤交织在一起,那么梯度下降步骤可能会尝试以需要更新 normalization 的方式来更新参数,从而减少梯度步骤的影响。例如,考虑一个层具有输入 u \rm{u} u ,它加上习得的偏置 b b b,并通过减去训练数据上计算的激活的平均值来对结果进行 normalization: x ^ = x − E [ x ] \hat{x}=x-\text{E}[x] x^=xE[x],其中 x = u + b x=u+b x=u+b X = { x 1... N } \mathcal{X}=\{x_{1...N}\} X={x1...N}是训练集上 x x x 的值集, E [ x ] = 1 N ∑ i = 1 N x i \text{E}[x]=\frac{1}{N}\sum_{i=1}^Nx_i E[x]=N1i=1Nxi。如果梯度下降步骤忽视了 E [ x ] \text{E}[x] E[x] 其实对 b b b 是依赖的,然后它更新 b ← b + Δ b b\leftarrow b+\Delta b bb+Δb,其中 Δ b ∝ − ∂ ℓ / ∂ x ^ \Delta b \propto -\partial \ell /\partial \hat{x} Δb/x^。那么就会导致 u + ( b + Δ b ) − E [ u + ( b + Δ b ) ] = u + b + E [ u + b ] u+(b+\Delta b)-\text{E}[u+(b+\Delta b)]=u+b+\text{E}[u+b] u+(b+Δb)E[u+(b+Δb)]=u+b+E[u+b]。因此,对 b b b 的更新和随后的 normalization 变化的组合到一起将会导致层的输出不发生变化,导致损失也不会发生变化。随着训练的继续, b b b 将无限期地增长,而损失保持不变。如果 normalization 不仅集中激活,而且放缩激活,则此问题可能会变得更糟。我们在最初的实验中观察到了这一点,当在梯度下降步骤之外计算 normalization 参数时,模型爆炸。

上述方法的问题是梯度下降优化没有考虑到发生 normalization 的事实。为了解决这个问题,我们希望确保,对于任何参数值,网络总是产生具有所需分布的激活。这样做将允许关于模型参数的损失的梯度考虑 normalization 及其对模型参数 Θ \Theta Θ 的依赖。同样, x \rm x x 是一个层输入,作为向量, X \mathcal{X} X 是训练数据集上这些输入的集合。然后,可以将 normalization 写做变换 x ^ = N o r m ( x , X ) \rm\hat{x}= Norm(x, \mathcal{X}) x^=Norm(x,X)这不仅取决于给定的训练样例 x \rm x x,还取决于所有样例 X \mathcal{X} X ——它的每个样例都取决于 Θ \Theta Θ,如果 x \rm x x 是由另一层生成的。对于反向传播,我们需要计算雅可比矩阵 ∂ N o r m ( x , X ) ∂ x   a n d   ∂ N o r m ( x , X ) ∂ X ; \rm \frac{\partial Norm(x,\mathcal{X})}{\partial x}\,and\, \frac{\partial Norm(x,\mathcal{X})}{\partial \mathcal{X}}; xNorm(x,X)andXNorm(x,X);忽略后项将导致上述的爆炸。在此框架内,白化层输入是计算成本高的,因为它需要计算协方差矩阵 C o v [ x ] = E x ∈ X [ x x T ] − E [ x ] E [ x ] T \rm Cov[x]=E_{x\in \mathcal{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 ] ) \rm Cov[x]^{−1/2}(x− E[x]) Cov[x]1/2(xE[x]),以及这些反向传播变换的导数。这促使我们寻求一种替代方法,以可微的方式执行输入 normalization,并且不需要在每次参数更新后分析整个训练集。

以前的一些方法(例如(Lyu&Simoncelli,2008))使用在单个训练示例上计算的统计数据,或者在图像网络中,在给定位置使用的不同特征映射计算的统计数据。但是,放弃绝对的激活范围会改变网络的表示能力。我们希望通过 normalize 训练样例中相对于整个训练数据的统计的激活来保存网络中的信息。

3 Normalization via Mini-Batch Statistics

由于每一层输入的完全白化是计算成本高的,并且并非处处可微,因此我们进行了两个必要的简化。第一个简化,不是对层输入和输出中的多个特征进行共同白化,而是会独立地对每个标量特征进行 normalization,通过使每个标量特征的平均值为零,方差为1。对于具有 d d d 维的输入 x = ( x ( 1 ) . . . x ( d ) ) \mathrm x=(x^{(1)}...x^{(d)}) x=(x(1)...x(d)),我们将 normalize 每个维度 x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)}=\frac{x^{(k)}-\mathrm E[x^{(k)}]}{\sqrt {\mathrm{Var}[x^{(k)}]}} x^(k)=Var[x(k)] x(k)E[x(k)]其中,对训练数据集计算期望值和方差。如(LeCun等人,1998b)所示,即使特征不相关,这种 normalization 也会加快收敛速度。

(注:identity transform,恒等变换)

请注意,简单地 normalize 层的每个输入可能会更改层可以表示的内容。例如,对 sigmoid 的输入进行 normalization 将把它们限制在非线性的线性范围内。为了解决这个问题,我们确保插入到网络中的变换可以表示恒等变换。为了实现这一点,我们为每个激活 x ( k ) x^{(k)} x(k) 引入一对参数 γ ( k ) \gamma^{(k)} γ(k) β ( k ) \beta^{(k)} β(k),用于缩放和平移 normalized 值: y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) . y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)}. y(k)=γ(k)x^(k)+β(k).这些参数与原始模型参数一起学习,并恢复网络的表示能力。事实上,通过设置 γ ( k ) = V a r [ x ( k ) ] \gamma^{(k)}=\sqrt{\mathrm{Var}[x^{(k)}]} γ(k)=Var[x(k)] β ( k ) = E [ x ( k ) ] \beta^{(k)}=\mathrm{E}[x^{(k)}] β(k)=E[x(k)],我们可以恢复原始激活,如果这是最佳操作的话。

在 batch 处理设置中,每个训练步骤都基于整个训练集,我们将使用整个训练集来 normalize 激活。然而,当使用随机优化时,这是不切实际的。因此,我们进行第二个简化:由于我们在随机梯度训练中使用 mini-batch,每个 mini-batch 产生每个激活的平均值和方差估计值。这样,用于 normalization 的统计信息可以完全参与梯度反向传播。注意,mini-batch 的使用是通过计算每维方差而不是联合方差来实现的;在联合情况下,需要正则化,因为 mini-batch size 可能小于被白化的激活数量,从而导致奇异协方差矩阵。

考虑一个 size 为 m m m 的 mini-batch B \mathcal{B} B,因为 normalization 独立应用于每个激活,让我们专注于一个特定的激活 x ( k ) x^{(k)} x(k) 并且为了清楚说明将省略上标 k k k。我们在 mini-batch 中有 m m m 个激活值, B = { x 1... m } . \mathcal{B}=\{x_{1...m}\}. B={x1...m}.让 normalized 值为 x ^ 1... m \hat{x}_{1...m} x^1...m,它们的线性变换为 y 1... m y_{1...m} y1...m。我们将变换 B N γ , β : x 1... m → y 1... m \mathrm{BN}_{\gamma,\beta}:x_{1...m}\rightarrow y_{1...m} BNγ,β:x1...my1...m称为 Batch Normalizing 变换。我们在算法1中给出了 BN 变换。在该算法中,为了数值稳定性, ϵ \epsilon ϵ 是一个加在 mini-batch 方差上的常数。

Input: 一个 mini-batch 的 x x x 值: B = { x 1... m } \mathcal{B}=\{x_{1...m}\} B={x1...m};待学习参数: γ , β \gamma,\beta γ,β
Output: { y i = B N γ , β ( x i ) } \{y_i = \mathrm{BN}_{\gamma,\beta}(x_i)\} {yi=BNγ,β(xi)}
μ B ← 1 m ∑ i = 1 m x i / / mini-batch 均值 \mu_{\mathcal{B}} \leftarrow \frac{1}{m}\sum\limits_{i=1}^mx_i \quad\quad\quad\quad\quad// \text{mini-batch 均值} μBm1i=1mxi//mini-batch 均值 σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) 2 / / mini-batch 方差 \sigma_{\mathcal{B}}^2 \leftarrow \frac{1}{m}\sum\limits_{i=1}^m(x_i-\mu_{\mathcal{B}})^2 \quad\quad\quad\quad\quad// \text{mini-batch 方差} σB2m1i=1m(xiμB)2//mini-batch 方差 x ^ i ← x i − μ B σ B 2 + ϵ / / normalize \hat{x}_i \leftarrow \frac{x_i-\mu_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^2+\epsilon}} \quad\quad\quad\quad\quad// \text{normalize} x^iσB2+ϵ xiμB//normalize y i ← γ x ^ i + β ≡ B N γ , β ( x i ) / / 缩放和平移 y_{i} \leftarrow \gamma \hat{x}_i+\beta \equiv \mathrm{BN}_{\gamma,\beta}(x_i) \quad\quad\quad\quad\quad// \text{缩放和平移} yiγx^i+βBNγ,β(xi)//缩放和平移Algorithm 1:Batch Normalizing 变换, 应用于 mini-batch 的激活值 x x x

BN 变换可以添加到网络中以控制任何激活。在表达式 y = B N γ , β ( x ) y= \mathrm{BN}_{\gamma,\beta}(x) y=BNγ,β(x) 中,我们表示要学习的参数 γ \gamma γ β \beta β,但应注意,在每个训练样例中,BN 变换并不独立处理激活。相反, B N γ , β ( x ) \mathrm{BN}_{\gamma,\beta}(x) BNγ,β(x) 取决于训练样例和 mini-batch 中的其他样例。被缩放和平移的 y y y 将传递给其他网络层。normalized 激活 x ^ \hat{x} x^ 是在我们变换的内部,但它们的存在至关重要。只要每个 mini-batch 的元素从同一分布中取样,并且如果我们忽略 ϵ \epsilon ϵ,任何 x ^ \hat{x} x^ 的值分布的期望值为0,方差为1。这可以通过观察 ∑ i = 1 m x ^ i = 0 \sum_{i=1}^m \hat{x}_i=0 i=1mx^i=0 1 m ∑ i = 1 m x ^ i 2 = 1 \frac{1}{m} \sum_{i=1}^m \hat{x}_i^2=1 m1i=1mx^i2=1 和算期望看出。每个 normalized 激活 x ( k ) x^{(k)} x(k) 可被视为子网络的输入,该子网络由线性变换 y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)} y(k)=γ(k)x^(k)+β(k) 组成,然后由原始网络进行其他处理。这些子网络输入都有固定的均值和方差,虽然这些 normalized x ( k ) x^{(k)} x(k) 的联合分布在训练过程中可能会发生变化,但我们预计,引入 normalized 输入会加速子网络的训练,从而加速整个网络的训练。

在训练期间,我们需要通过该变换反向传播损失 ℓ \ell 的梯度 ,以及计算关于 BN 变换的参数的梯度。我们使用链规则,如下所示(简化前):
在这里插入图片描述
(注:affine transform,“仿射变换”就是:“线性变换”+“平移”,如何通俗地讲解「仿射变换」这个概念?

因此,BN 变换是一种可微变换,它将 normalized 激活引入网络。这确保了在模型训练时,层可以继续在展现较少 internal covariate shift 的输入分布上学习,从而加快训练。此外,应用于这些 normalized 激活的学习到的仿射变换允许 BN 变换表示恒等变换并保留网络的容量。

3.1 Training and Inference with Batch-Normalized Networks

(注:inference 基本指的就是 predicttion,预测,机器学习中Inference 和predict的区别是什么?

根据算法1,为了 batch-normalize 网络,我们指定了激活的子集,并为每个激活插入 BN 变换。以前接收 x x x 作为输入的任何层现在都接收 B N ( x ) \mathrm{BN}(x) BN(x)。采用 batch normalization 的模型可以使用 batch 梯度下降法或 size 为 m > 1 m>1 m>1 的 mini-batch 的随机梯度下降法或其任何变体(如Adagrad)进行训练(Duchi等人,2011)。依赖于 mini-batch 的激活的 normalization 允许有效的训练,但在 inference 过程中既不必要也不可取;我们希望输出确切地只依赖于输入。为此,一旦对网络进行了训练,我们就使用 normalization x ^ = x − E [ x ] V a r [ x ] + ϵ \hat{x}=\frac{x-\mathrm E[x]}{\sqrt {\mathrm{Var}[x]+\epsilon}} x^=Var[x]+ϵ xE[x]来使用总体的统计量,而不是 mini-batch 的统计量。忽略 ϵ \epsilon ϵ,这些 normalized 激活与训练期间具有相同的平均值 0 和方差 1。我们使用无偏方差估计 V a r [ x ] = m m − 1 ⋅ E [ σ B 2 ] \mathrm{Var}[x]=\frac{m}{m-1}\cdot \mathrm{E}[\sigma_{\mathcal{B}}^2] Var[x]=m1mE[σB2],其中期望值是基于训练时 size 为 m m m 的 多个mini-batch, σ B 2 \sigma_{\mathcal{B}}^2 σB2 是它们的样本方差。使用滑动平均法,我们可以在模型训练时追踪其准确性。由于平均值和方差在 inference 过程中是固定的,因此 normalization 只是一个简单应用于每个激活的线性变换。它还可以由放缩因子 γ \gamma γ 和平移量 β \beta β组成,以产生一个取代 B N ( x ) \mathrm{BN}(x) BN(x) 的线性变换。算法2总结了训练 batch-normalized 网络的过程。

Input:具有可训练参数 Θ \Theta Θ 的网络 N N N;激活的子集 { x ( k ) } k = 1 K \{x^{(k)}\}_{k=1}^K {x(k)}k=1K

Output:用于 inference 的 Batch-normalized 网络, N B N i n f N_{\mathrm{BN}}^{\mathrm{inf}} NBNinf
1: N B N t r / / 训练 BN 网络 N_{\mathrm{BN}}^{\mathrm{tr}}\quad\quad\quad\quad\quad// \text{训练 BN 网络} NBNtr//训练 BN 网络
2:for k = 1... K k=1...K k=1...K do
3: \quad y ( k ) = B N γ ( k ) , β ( k ) ( x ( k ) ) y^{(k)}= \mathrm{BN}_{\gamma^{(k)},\beta^{(k)}}(x^{(k)}) y(k)=BNγ(k),β(k)(x(k)) 变换加入到 N B N t r N_{\mathrm{BN}}^{\mathrm{tr}} NBNtr(算法1)
4: \quad 修改 N B N t r N_{\mathrm{BN}}^{\mathrm{tr}} NBNtr 中使用输入 x ( k ) x^{(k)} x(k) 的每一层,改为用 y ( k ) y^{(k)} y(k) 来代替
5:end for
6:训练 N B N t r N_{\mathrm{BN}}^{\mathrm{tr}} NBNtr 以优化参数 Θ ⋃ { γ ( k ) , β ( k ) } k = 1 K \Theta \bigcup \{\gamma^{(k)},\beta^{(k)}\}_{k=1}^K Θ{γ(k),β(k)}k=1K
7: N B N i n f ← N B N t r / / 带有不变的参数 BN 网络的 inference N_{\mathrm{BN}}^{\mathrm{inf}} \leftarrow N_{\mathrm{BN}}^{\mathrm{tr}} \quad\quad\quad\quad\quad// \text{带有不变的参数 BN 网络的 inference} NBNinfNBNtr//带有不变的参数 BN 网络的 inference
8:for k = 1... K k=1...K k=1...K do
9:     / / 为了简化, x ≡ x ( k ) , γ ≡ γ ( k ) , β ≡ β ( k ) , 等等 \quad\,\,\,// \text{为了简化,} x\equiv x^{(k)}, \gamma \equiv \gamma^{(k)}, \beta \equiv \beta^{(k)},\text{等等} //为了简化,xx(k),γγ(k),ββ(k),等等
10: \quad 处理多个训练 mini-batch B \mathcal{B} B,每个 size 为 m m m,并对其进行平均 E [ x ] ← E B [ μ B ] \mathrm{E}[x] \leftarrow \mathrm{E}_{\mathcal{B}}[\mu_{\mathcal{B}}] E[x]EB[μB] V a r [ x ] ← m m − 1 E B [ σ B 2 ] \mathrm{Var}[x] \leftarrow \frac{m}{m-1} \mathrm{E}_{\mathcal{B}}[\sigma_{\mathcal{B}}^2] Var[x]m1mEB[σB2]
11: \quad N B N i n f N_{\mathrm{BN}}^{\mathrm{inf}} NBNinf 中,用 y = γ V a r [ x ] + ϵ ⋅ x + ( β − γ E [ x ] V a r [ x ] + ϵ ) y=\frac{\gamma}{\sqrt {\mathrm{Var}[x]+\epsilon}}\cdot x+(\beta-\frac{\gamma \mathrm{E}[x]}{\sqrt {\mathrm{Var}[x]+\epsilon}}) y=Var[x]+ϵ γx+(βVar[x]+ϵ γE[x]) 代替变换 y = B N γ , β ( x ) y= \mathrm{BN}_{\gamma,\beta}(x) y=BNγ,β(x)
12:end for
Algorithm 2:训练 Batch-Normalized 网络

3.2 Batch-Normalized Convolutional Networks

Batch Normalization 可应用于网络中的任何激活集。在这里,我们重点关注由一个仿射变换和一个元素非线性组成的变换: z = g ( W u + b ) \mathrm{z} = g(W\mathrm{u} + \mathrm{b}) z=g(Wu+b)其中 W W W b \mathrm{b} b 是模型的学习参数, g ( ⋅ ) g(\cdot) g() 是非线性,如 sigmoid 或 ReLU。这个公式包括完全连接层和卷积层。我们通过 normalize x = W u + b \mathrm{x} = W\mathrm{u} + \mathrm{b} x=Wu+b 从而在非线性之前添加 BN 变换。我们也可以 normalize 层输入 u \mathrm{u} u,但由于 u \mathrm{u} u 可能是另一个非线性的输出,其分布的形状可能在训练期间发生变化,限制其第一和第二阶矩不会消除 covariate shift。相反, W u + b W\mathrm{u} + \mathrm{b} Wu+b 更可能具有对称的非稀疏分布,即“更高斯”(Hyv a ¨ \ddot{a} a¨rinen&Oja,2000); normalize 它可能会产生具有稳定分布的激活。

注意,由于我们 normalize W u + b W\mathrm{u} + \mathrm{b} Wu+b,偏置 b \mathrm{b} b 可以忽略,因为其影响将通过随后的均值减法消除(偏置的作用在算法1中被 β \beta β 所包含)。因此, z = g ( W u + b ) \mathrm{z} = g(W\mathrm{u} + \mathrm{b}) z=g(Wu+b) 被替换为 z = g ( B N ( W u ) ) \mathrm{z} = g(\mathrm{BN}(W\mathrm{u})) z=g(BN(Wu))其中,BN 变换独立应用于 x = W u \mathrm{x} = W\mathrm{u} x=Wu 的每个维度,每个维度有一对单独的学习参数 γ ( k ) \gamma^{(k)} γ(k) β ( k ) \beta^{(k)} β(k)

对于卷积层,我们还希望 normalization 遵循卷积的性质,以便以相同的方式 normalize 位于不同位置的同一特征映射的不同元素。为了实现这一点,我们在一个 mini-batch 中对所有位置的所有激活进行联合 normalize。在算法1中,我们假设 B \mathcal{B} B 是一个特征映射中关于一个 mini-batch 所有元素和所有空间位置的值的集合——因此,对于大小为 m m m 的 mini-batch 和大小为 p × q p\times q p×q 的多个特征映射,我们使用大小为 m ′ = ∣ B ∣ = m ⋅ p q m'=|\mathcal{B}|=m\cdot pq m=B=mpq 的有效 mini-batch。我们学习每个特征映射的一对参数 γ ( k ) \gamma^{(k)} γ(k) β ( k ) \beta^{(k)} β(k),而不是每个激活。算法2也进行了类似的修改,以便在推导过程中,BN 变换对给定特征映射中的每个激活应用相同的线性变换。

3.3 Batch Normalization enables higher learning rates

在传统的深度网络中,过高的学习率可能导致梯度爆炸或消失,并陷入较差的局部极小值。batch normalization 有助于解决这些问题。通过 normalize 整个网络中的激活,它可以防止参数的微小变化放大为梯度中激活的较大和次优变化;例如,它可以防止训练陷入非线性的饱和状态。

batch normalization 还使训练更能适应参数取值范围。通常,较大的学习率可能会扩大层参数的取值范围,从而在反向传播过程中放大梯度并导致模型爆炸。但是,通过 batch normalization,通过层的反向传播不受其参数取值范围的影响。事实上,对于标量 a a a B N ( W u ) = B N ( ( a W ) u ) \mathrm{BN}(W\mathrm{u}) = \mathrm{BN}((aW)\mathrm{u}) BN(Wu)=BN((aW)u)我们可以证明这一点 ∂ B N ( ( a W ) u ) ∂ u = ∂ B N ( W u ) ∂ u \frac{\partial \mathrm{BN}((aW)\mathrm{u})}{\partial \mathrm{u}} = \frac{\partial \mathrm{BN}(W\mathrm{u}) }{\partial \mathrm{u}} uBN((aW)u)=uBN(Wu) ∂ B N ( ( a W ) u ) ∂ a W = 1 a ⋅ ∂ B N ( W u ) ∂ W \frac{\partial \mathrm{BN}((aW)\mathrm{u})}{\partial aW} = \frac{1}{a} \cdot \frac{\partial \mathrm{BN}(W\mathrm{u}) }{\partial W} aWBN((aW)u)=a1WBN(Wu)比例不影响层的雅可比矩阵,因此也不影响梯度传播。此外,权重越大,梯度越小,batch normalization 将稳定参数增长。

我们进一步推测,batch normalization 可能导致层的雅可比矩阵的奇异值接近1,这对于训练是有益的(Saxe等人,2013)。考虑具有 normalized 输入的两个连续层,以及这些 normalized 向量之间的变换: z ^ = f ( x ^ ) \hat{\mathrm{z}}=f(\hat{\mathrm{x}}) z^=f(x^)。如果我们假设 x ^ \hat{\mathrm{x}} x^ z ^ \hat{\mathrm{z}} z^ 是高斯的且不相关,而 F ( x ^ ) ≈ J x ^ F(\hat{\mathrm{x}}) \approx J\hat{\mathrm{x}} F(x^)Jx^ 是给定模型参数的线性变换,那么 x ^ \hat{\mathrm{x}} x^ z ^ \hat{\mathrm{z}} z^ 都有单位协方差, I = C o v [ z ^ ] = J C o v [ x ^ ] J T = J J T I=\mathrm{Cov}[\hat{\mathrm{z}}]=J\mathrm{Cov}[\hat{\mathrm{x}}]J^T=JJ^T I=Cov[z^]=JCov[x^]JT=JJT。因此, J J T = I JJ^T=I JJT=I,因此 J J J 的所有奇异值都等于1,这在反向传播期间保留了梯度大小。实际上,变换不是线性的,并且 normalized 值不能保证是高斯的或独立的,但是我们仍然希望 batch normalization 有助于使梯度传播表现得更好。batch normalization 对梯度传播的精确影响仍然是进一步研究的领域。

3.4 Batch Normalization regularizes the model

当使用 batch normalization 进行训练时,训练样例与 mini-batch 中的其他示例一起出现,并且训练网络不再为给定训练样例生成确定性值。在我们的实验中,我们发现这种效应有利于网络的泛化。虽然 dropout(Srivastava等人,2014年)通常用于减少过度匹配,但在 batch-normalized 网络中,我们发现它可以被移除或强度降低。

相关视频

【 深度学习李宏毅 】 Batch Normalization (中文)

相关的笔记

模型优化之Batch Normalization
《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 Concariate Shift《》

相关代码

pytorch

tensorflow

keras

pytorch API:

Docs > torch.nn > BatchNorm1d

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)

如文章Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift所述,对2D或3D输入(具有可选附加通道尺寸的1D输入的 mini-batch)应用 Batch Normalization
在这里插入图片描述

平均值和标准偏差在 mini-batch 中按每一维度计算, γ \gamma γ β \beta β 是维度为 C 的可学习参数向量(其中 C 是输入的维度)。默认情况下, γ \gamma γ 的元素设置为1, β \beta β 的元素设置为0。标准偏差通过有偏估计计算,相当于 torch.var(input, unbiased=False)。

同样在默认情况下,在训练期间,该层保留对其计算的均值和方差的运行估计,然后在 evaluation 期间用于 normalization。使用默认为0.1的 momentum 来保留运行估计值。

如果 track_running_stats 设为 False,那么,该层不会保留运行估计值,而 batch 的统计量则会在 evaluation 期间使用。

注意:
这个 momentum 参数不同于优化器类中使用的 momentum 参数和 momentum 的传统概念。数学上,运行统计量的更新规则在这里是: x ^ n e w = ( 1 − m o n e n t u m ) × x ^ + m o n e n t u m × x t \hat{x}_{new} = (1- \mathrm{monentum}) \times \hat{x} + \mathrm{monentum} \times x_t x^new=(1monentum)×x^+monentum×xt,其中 x ^ \hat{x} x^ 是估计的统计量, x t x_t xt 是新的观测值。

因为 Batch Normalization 是在 C 维上完成的,计算(N,L)片上的统计信息,所以将这种 Temporal Batch Normalization 称为通用术语。


Parameters:
∙ \bullet \quad num_features —— 来自大小为(N,C,L)的预期输入的 C 或来自大小为(N,L)的输入的 L

∙ \bullet \quad eps —— 为数值稳定性增加分母的值。默认值:1e-5,公式中的 ϵ \epsilon ϵ

∙ \bullet \quad momentum —— 用于计算 running_mean 和 running_var 的值。对于累积移动平均值(即简单平均值),可设置为 None。默认值:0.1

∙ \bullet \quad affine —— 一个布尔值,设置为 True 时,此模块具有可学习的仿射参数。默认值:True

∙ \bullet \quad track_running_stats —— 一个布尔值,设置为 True 时,此模块跟踪运行均值和方差;设置为 False 时,此模块不跟踪此类统计量,并将 running_mean 和 running_var 的统计缓冲区初始化为 None。当这些缓冲区为 None 时,此模块始终使用 batch 的统计量。在训练和 eval 模式下。默认值:True


在这里插入图片描述

tensorflow API

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐