BN——批样本归一化减少内部协变量偏移以加速深度网络训练

摘要:由于在训练期间,每一层的输入分布随着前一层参数的改变而发生改变,故训练深度神经网络是复杂的。需求低的学习率与谨慎的参数初始化令训练速度变慢,并且训练饱和非线性模型十分困难。我们称这种现象为内部协变量偏移,并且使用归一化层解决这个问题。我们的方法将归一化作为模型架构的一部分,并对每个小批样本执行归一化,这是优势所在。批样本归一化允许我们使用更高的学习率,更宽泛的初始化。其表现也类似正则化,在一定程度上消除了随机失活的使用。应用于最高水准的图像分类模型,批样本达到了相同的准确度,而使用了仅1/14的训练轮数,远远超过了原来的模型。使用一个批样本归一化网络的集合,我们提高了ImageNet分类的最好的公开结果,以4.9%的校验错误(与4.8%的测试错误)达到了前五名,并超越了人类识别准确率。

一、介绍
  SGD(stochastic gradient descent)是训练深度网络的有效方法。小批样本尺寸为 m m m,估计损失函数的梯度 1 / m ∗ ∂ l ( x i , θ ) / ∂ θ 1/m * ∂l(\bm{x}_{i}, \bm{θ}) / ∂\bm{θ} 1/ml(xi,θ)/θ计算,有一定优点:小批样本的梯度损失是训练集的梯度损失的估计值,随着批样本尺寸的提升而改善估计质量;由于现代计算平台提供的并行性,在批样本上计算比m次单独计算更加有效。
  网络深层的输入受所有前层的影响,故微小的改变会在深层网络放大。因此超参数的初始化需要谨慎的调整。
学习系统的输入分布改变时,会发生协变量偏移,该问题可以用域自适应解决。然而,协变量偏移可以广义的拓宽。考虑 l = F 2 ( F 1 ( u , θ 1 ) , θ 2 ) l = F_{2}(F_{1}(\bm{u}, \bm{θ}_{1}), \bm{θ}_{2}) l=F2(F1(u,θ1),θ2)其中 F 1 F_{1} F1 F 2 F_{2} F2是任意变换,参数 θ 1 \bm{θ}_{1} θ1 θ 2 \bm{θ}_{2} θ2可以被学习以最小化损失 l l l。学习 θ 2 \bm{θ}_{2} θ2的过程可以看作 x = F 1 ( u , θ 1 ) x = F_1(\bm{u}, \bm{θ}_1) x=F1(u,θ1)并送入子网络,则 l = F 2 ( x , θ 2 ) l = F_2(\bm{x}, \bm{θ}_2) l=F2(x,θ2)例如一步梯度下降为 θ 2 ← θ 2 − a / m ∑ i = 1 m ∂ F 2 ( x i , θ 2 ) / ∂ θ 2 \bm{θ}_2 \leftarrow \bm{θ}_2 - a/m \sum_{i=1}^m{∂F_2(\bm{x}_i, \bm{θ}_2)/∂\bm{θ}_2} θ2θ2a/mi=1mF2(xi,θ2)/θ2其中 m m m为批尺寸, a a a为学习率。这与输入为 x x x的单独网络 F 2 F_2 F2相同的。因此,输入分布的属性决定了训练的效率,保持 x \bm{x} x的分布将十分有利, θ 2 \bm{\theta}_2 θ2也不必重新调整来弥补 x \bm{x} x在分布上的变化。
  保持输入到子网络的分布对于子网络外的层是有益的。考虑S【sigmoid】激活函数 z = g ( W u + b ) \bm{z} = g(\bm{Wu} + \bm{b}) z=g(Wu+b),其中 u \bm{u} u是层的输入,权重矩阵 W \bm{W} W与偏置向量 b \bm{b} b是层的学习参数,以及 g ( x ) = 1 / ( 1 + e x p { − x } ) g(x) = 1/(1 + exp\{-x\}) g(x)=1/(1+exp{x})。当 ∣ x ∣ |x| x增加时, g ′ ( x ) g'(x) g(x)趋于0,这意味着 x = W u + b \bm{x} = \bm{Wu} + \bm{b} x=Wu+b的所有维度,除了有较小的绝对值,否则 u \bm{u} u的梯度升降将会消失,模型训练缓慢。然而,由于 x \bm{x} x受到 W \bm{W} W b \bm{b} b以及之前所有层参数的影响,在训练时参数的改变很可能将 x \bm{x} x的很多维度移动到非线性的饱和区并减缓收敛。该问题随着层数加深而放大。实际上,饱和问题导致的梯度消失经常使用线性整流单元 R e L U ( x ) = m a x ( x , 0 ) ReLU(x) = max(x, 0) ReLU(x)=max(x,0),谨慎的初始化以及效地学习率解决。然而,如果能够在网络训练中确保非线性分布输入保持稳定,那么优化便更少的可能陷入饱和区,训练将会加快。
  内部协变量偏移【Internal Covariate Shift】指的是深度网络内部节点在训练过程中分布的改变,消除其可以更快的训练。故本文提出了新的原理,称为批样本归一化【Batch Normalization,BN】,使用一个步骤减少内部协变量偏移。其通过一个归一化,固定了层输入的均值与方差。BN也通过减少梯度对参数的规模与初始化的依赖,改善了网络的梯度流。这允许使用更大的学习率,而不必考虑发散的风险。此外,BN正则化了模型并减少了随机失活【Dropout】的必要性。最后,BN通过防止网络陷入饱和模式而使得使用饱和非线性特征成为可能。

二、减少内部协变量偏移
  定义内部协变量偏移为由于训练中网络参数改变带来的网络激活值分布的改变。已知如果输入是白的——例如线性变化为0均值与单位方差且不相关,那么网络训练收敛会加快。
  考虑通过直接修改网络或根据网络激活值改变优化算法的参数训练,在每个训练步骤中白化激活值。然而,这些修改分布在优化步骤中,梯度下降步骤更新参数的同时需要更新归一化,这减小了梯度的影响。例如,考虑输入为 u \bm{u} u的层加入了学习偏置 b \bm{b} b,通过在所有训练数据中计算减去激活值的均值归一化其结果,形如 x ^ = x − E [ x ] \hat{\bm{x}} = \bm{x} - E[\bm{x}] x^=xE[x],其中 x = u + b \bm{x} = \bm{u} + \bm{b} x=u+b X = { x N } X = \{\bm{x}_N\} X={xN}是训练集的所有 x \bm{x} x值的集合, E [ x ] = 1 / N ∑ x i E[\bm{x}] = 1/N \sum\bm{x}_i E[x]=1/Nxi,若梯度下降忽略 b \bm{b} b E [ x ] E[\bm{x}] E[x]的依赖,则更新形如 b ← b + Δ b \bm{b} \leftarrow \bm{b} + \Delta\bm{b} bb+Δb,其中 Δ b ∝ − ∂ l / ∂ x ^ \Delta\bm{b} \propto - ∂l/∂\hat{\bm{x}} Δbl/x^,故 u + b + Δ b − E [ u + b + Δ b ] = u + b − E [ u + b ] \bm{u} + \bm{b} + \Delta\bm{b} - E[\bm{u} + \bm{b} + \Delta\bm{b}] = \bm{u} + \bm{b} - E[\bm{u} + \bm{b}] u+b+ΔbE[u+b+Δb]=u+bE[u+b]。因此,将 b \bm{b} b的更新与归一化结合以来对层的输出以及损失都没有改变。
  上述方法的问题是梯度下降优化没有将归一化考虑在内。接下来确保对于任意参数值,网络总是能产生期望分布的激活值,这会让损失的梯度包含归一化,并依赖于模型的参数 θ \bm{\theta} θ。取层的输入 x \bm{x} x,以及训练集的输入集合 X X X,归一化可以看作变换 x ^ = N o r m ( x , X ) \hat\bm{x} = Norm(\bm{x}, X) x^=Norm(x,X)其不仅依赖于训练样本 x \bm{x} x,且依赖于所有的样本 X X X——如果 x \bm{x} x由其他层产生,则它们都还依赖于 θ \bm{\theta} θ。而反馈过程,需要计算雅可比矩阵 ∂ N o r m ( x , X ) / ∂ x ∂ N o r m ( x , X ) / ∂ X ∂Norm(\bm{x}, X)/∂\bm{x} \\ ∂Norm(\bm{x}, X)/∂X Norm(x,X)/xNorm(x,X)/X如果忽视后一项,则可能导致上述的爆炸。白化输入的代价是昂贵的,因为其需要计算协方差矩阵 C o v [ x ] = E x ∈ X [ x x T ] − E [ x ] E [ x ] T Cov[\bm{x}] = E_{\bm{x} \in X}[\bm{x}\bm{x}^T] - E[\bm{x}]E[\bm{x}]^T Cov[x]=ExX[xxT]E[x]E[x]T以及其平方根倒数,以产生白化激活 C o v [ x ] − 1 / 2 ( x − E [ x ] ) Cov[\bm{x}]^{-1/2}(\bm{x} - E[\bm{x}]) Cov[x]1/2(xE[x])。这使得需要寻找另一种不需要分析全部训练集的解决办法来归一化输入。
  本文希望通过归一化一个与整个训练数据的统计相关的训练样本的激活值保存网络的信息。

三、通过小批样本统计归一化
  因为难以完全白化所有层的输入且并非处处可微,本文做了两个必要的简化。第一,并非共同白化输入与输出的特征,而独立的归一化每一标量特征。对于每层d维输入 x = ( x 1 , . . . x d ) \bm{x} = (x_1, ... x_d) x=(x1,...xd),初始化每个维度 x ^ k = x k − E [ x k ] / ( V a r [ x k ] ) 1 / 2 \hat{x}_k = x_k - E[x_k]/(Var[x_k])^{1/2} x^k=xkE[xk]/(Var[xk])1/2其中期望与方差在整个训练集计算。
  注意到简化的归一化每层的输入会改变层的表征。归一化s函数的输入会驱使其到达非线性特征的线性区。为了解决这个问题,要确保网络嵌入的变换代表着统一变换。对于每个激活值 x k x_k xk,参数 γ 、 β \gamma、\beta γβ用于缩放、偏移归一化值 y k = γ k x ^ k + β k y_k = \gamma_k\hat{x}_k + \beta_k yk=γkx^k+βk这些参数使用原始的模型参数单独的学习,并恢复了网络的表征强度。事实上,设定 γ k = V a r [ x k ] 1 / 2 \gamma_k = Var[x_k]^{1/2} γk=Var[xk]1/2 β = E [ x k ] \beta = E[x_k] β=E[xk]能够复原原始的激活值。
  在批样本中设置基于整个训练集的每个训练步骤,可以使用整个集合归一化激活值。然而,使用随机优化是不显示的。因此,做出第二个假设:因为使用小批样本随机梯度训练,每个小批样本产生每个激活值的均值与方差估计值。统计用于归一化可以参与梯度反馈。注意到使用小批样本时,计算了每个维度的方差而不是协方差矩阵。在联合情况下,因为小批样本的尺寸小于白化的激活值数量造成了奇异协方差矩阵,便需要正则化。
  考虑m尺寸的小批样本 B B B,因为归一化独立的应用到每一个激活值,考虑特定的激活值 x x x,在一个小批样本中,拥有m个值,形如 B = { x 1 , . . . , x m } B = \{x_1, ..., x_m\} B={x1,...,xm}另其归一化值为 x ^ \hat{x} x^,线性变换为 y y y,则定义变换 B N γ , β : x → y BN_{\gamma, \beta} : x \rightarrow y BNγ,β:xy为批样本归一化变换。描述形如算法1。在算法中, ϵ \epsilon ϵ是被加入小批样本方差的常数以保证数值的有效性。

B = [x_1, ..., x_m]
gamma = 0
beta = 0
# gamma, beta is trainable paramrters
# B is a mini-batch

def BN(x_i, gamma, beta):
	mu_B = 1/m * sum(x_i)
	# mini_batch mean
	sigma2_B = 1/m * sum((x_i - mu_B) ** 2)
	# mini-batch variance
	hat_x_i = (x_i - mu_B) / (var_B + epsilon) ** (1/2)
	# normalize
	y_i = gamma * hat_x_i + beta
	# scale and shift
	return y_i

y = BN(x_i, gamma, beta)

  算法1:批归一化变换,应用于整个小批样本的激活值 x x x
  BN变换可以添加到网络用于操作激活值。注意到BN变换不独立于每个训练样本的激活过程,BN还依赖于训练样本与小批样本中的其他样本。缩放偏移值 y y y传递到其他层,归一化激活值 x ^ \hat{x} x^在变换的内部,但其存在是至关重要的。只要每个小批样本从相同的分布抽样,并忽视 ϵ \epsilon ϵ,任何 x ^ \hat{x} x^拥有0期望与1方差。
  在训练中,需要反馈通过该变换的损失 l l l的梯度,使用链式法则,形如 ∂ l / ∂ x i ^ = ∂ l / ∂ y i ⋅ γ ∂ l / ∂ σ B 2 = ∑ i = 1 m ∂ l / ∂ x i ^ ⋅ ( x i − μ B ) ⋅ − ( σ B 2 + ϵ ) − 3 / 2 / 2 ∂ l / ∂ μ B = ( ∑ i = 1 m ∂ l / ∂ x ^ i ⋅ − 1 / ( σ B 2 + ϵ ) 1 / 2 ) + ∂ l / ∂ σ B 2 ⋅ ∑ i = 1 m − 2 ( x i − μ B ) / m ∂ l / ∂ x i = ∂ l / ∂ x i ^ ⋅ 1 / ( σ B 2 + ϵ ) 1 / 2 + ∂ l / ∂ σ B 2 ⋅ 2 ( x i − μ B ) / m + ∂ l / ∂ μ B ⋅ 1 / m ∂ l / ∂ γ = ∑ i = 1 m ∂ l / ∂ y i ⋅ x i ^ ∂ l / ∂ β = ∑ i = 1 m ∂ l / ∂ y i ∂l/∂\hat{x_i} = ∂l/∂y_i ·\gamma \\ ∂l/∂\sigma_B^2 = \sum_{i=1}^m ∂l/∂\hat{x_i}·(x_i - \mu_B)·-(\sigma^2_B + \epsilon)^{-3/2}/2 \\ ∂l/∂\mu_B = (\sum_{i=1}^m ∂l/∂\hat{x}_i·-1/(\sigma^2_B + \epsilon)^{1/2} ) + ∂l/∂\sigma_B^2·\sum_{i=1}^m-2(x_i - \mu_B)/m \\ ∂l/∂x_i = ∂l/∂\hat{x_i}·1/(\sigma^2_B + \epsilon)^{1/2} + ∂l/∂\sigma_B^2 · 2(x_i - \mu_B)/m + ∂l/∂\mu_B · 1/m \\ ∂l/∂\gamma = \sum_{i=1}^m ∂l/∂y_i · \hat{x_i} \\ ∂l/∂\beta = \sum_{i=1}^m ∂l/∂y_i l/xi^=l/yiγl/σB2=i=1ml/xi^(xiμB)(σB2+ϵ)3/2/2l/μB=(i=1ml/x^i1/(σB2+ϵ)1/2)+l/σB2i=1m2(xiμB)/ml/xi=l/xi^1/(σB2+ϵ)1/2+l/σB22(xiμB)/m+l/μB1/ml/γ=i=1ml/yixi^l/β=i=1ml/yi因此,BN变换可微并将归一化响应引入了网络。

3.1 使用批样本归一化网络训练与预测
  为了批样本归一化网络,指定一个激活值的子集并将BN变换插入其中,如算法1。之前,层的输入为 x \bm{x} x,而现在为 B N ( x ) BN(\bm{x}) BN(x)。使用BN的网络可以使用批梯度下降或随机梯度下降,并使用批样本尺寸 m > 1 m > 1 m>1,或其他优化方法。依赖于批样本的激活值归一化可以有效的训练,但在预测中并非需要的。一般的希望输出仅依赖于网络。为了达到该目的,网络训练完成后,对比小批样本更大的统计群体使用归一化 x ^ = ( x − E [ x ] ) / ( V a r [ x + ϵ ] ) 1 / 2 \hat\bm{x} = (\bm{x} - E[\bm{x}])/(Var[\bm{x} + \epsilon])^{1/2} x^=(xE[x])/(Var[x+ϵ])1/2忽略 ϵ \epsilon ϵ,归一化激活在训练时有着0均值与1方差。使用无偏方差估计 V a r [ x ] = m / ( m − 1 ) ⋅ E B [ σ B 2 ] Var[\bm{x}] = m/(m - 1)·E_B[\sigma^2_B] Var[x]=m/(m1)EB[σB2],其中期望为m大小尺寸的训练批样本, σ B 2 \sigma^2_B σB2是其方差。使用滑动平均,可以追踪模型训练时的准确率。在预测时,均值与方差固定,归一化只是简单的 γ , β \gamma, \beta γ,β组成的线性变换。算法2总结了训练批样本归一化网络的步骤。

N = Net(theta)
x = [x_0, ... x_K][k]
# N is the network with trainable paramrters theta
# x is the subset of activations [x_k], k = 1:K

N_BN_train = N
# Training the BN net
for k in range(K):
	N_BN_train[l] = BN(x_k)
	# Add the y_k = BN(x_k, gamma, beta) to N_BN_train
	N_BN_train[l][x_k] = y_k
	# Modify each layer in N_Bn_train with x_k to take y_k instead

theta = optimize(theta)
[gamma_0, ..., gamma_k] = optimize([gamma_0, ..., gamma_k])
[beta_0, ... beta_k] = optimize([beta_0, ... beta_k])
# Train N_BN_train to optimize the parameters

N_BN_infer = N_BN_train
# Inference BN network with frozen parameters

for i in range(K):
	B = mini_batches
	# The size of B is m
	E(x_k) = E(mu_B)
	Var(x_k) = m/(m - 1) * E(sigma_B^2)
	N_BN_[l][y_k = BN(x_k)] = [y_k = gamma / (Var(x_k) + epsilon) ** (1 / 2) * x_k + 
								(beta - gamma * E(x_k) / (Var(x_k) + epsilon) ** (1 / 2))]
	# Replace the transform BN to linear

  算法2:训练批样本归一化网络

3.2 批样本归一化卷积网络
  批样本归一化可以应用于任何网络的激活值集合。考虑元素级的非线性仿射变换 z = g ( W u + b ) z = g(Wu + b) z=g(Wu+b)其中 W , b W, b W,b是模型学习的参数, g ( ⋅ ) g(·) g()是非线性函数。使用 z = g ( B N ( W u ) ) z = g(BN(Wu)) z=g(BN(Wu))来代替,其中 b b b由于计算均值而被忽视。
  对于卷积层,额外的考虑了卷积属性的归一化——使得相同特征图在不同的位置的元素以相同的方法归一化,在一个小批样本所有位置的所有激活值联合归一。在算法1中,令 B B B是特征图所有值的集合,因此对于m尺寸的小批样本与pxq尺寸的特征图,使用尺寸为mxpxq的小批样本。每一个特征图都将学习到参数 γ ( k ) , β ( k ) \gamma^{(k)}, \beta^{(k)} γ(k),β(k),而不是每个激活值。算法2也做相似的修改。

3.3 批样本归一化使用高学习率
  传统的深度网络在太高的学习率下会发生梯度弥散或消失,或陷入局部最小值。通过归一化激活值,使得参数的变化不会放大到过大,防止了次优化。对于实例,其放置了非线性过饱和。
  BN也使得参数的尺度更有弹性。一般来说,大的学习率增加了参数的规模,会在反向传播时放大梯度,导致模型的爆炸。然而,BN使得反向传播不受参数尺度的影响,例如对于缩放因子 a a a,有 B N ( W u ) = B N ( a ( W u ) ) BN(Wu) = BN(a(Wu)) BN(Wu)=BN(a(Wu)) ∂ B N ( a ( W u ) ) / ∂ u = ∂ B N ( W u ) / ∂ u ∂ B N ( a ( W u ) ) / ∂ ( a W ) = 1 / a ⋅ ∂ B N ( W u ) / ∂ W ∂BN(a(Wu)) / ∂u = ∂BN(Wu) / ∂u \\ ∂BN(a(Wu)) / ∂(aW) = 1/a · ∂BN(Wu) / ∂W BN(a(Wu))/u=BN(Wu)/uBN(a(Wu))/(aW)=1/aBN(Wu)/W缩放并没有影响该层的雅可比矩阵已经相应的梯度传播。此外,更大的权重导致了小梯度,而BN会保证参数的稳定。

3.4 批样本归一化正则化模型
  使用BN层训练时,一个训练样本在小批样本中与其他样本联结,而训练网络不再为给出的单独的训练样本产生确定的值。在实验中,可以发现这种影响对于网络的泛化有益。鉴于随机失活【Dropout】典型的应用于防止过拟合,但在BN网络中发现其可以被移除,或减小比例。


四、实验


五、结论
  本文提出了一种机制,显著的加速了深度网络的训练。其基于协变量偏移,通过从网络的激活值中移除其以帮助训练。仅仅在高水准的的图像分类模型中加入批样本归一化,就可以显著提高训练的速度。此外,增加学习率并移除随机失活以及其他变动,便打败了之前单独图像分类网络的水准。通过BN训练的多种模型比ImageNet中的知名系统都有显著性提高。

你可能感兴趣的:(深度学习,人工智能,神经网络)