Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
五次面试有三次会问到BN层,这个点一定要从前世今生都吃透啊!
论文超链接:https://arxiv.org/pdf/1502.03167v3.pdf
Abstract
通过要求较低的学习率和仔细的参数初始化减慢了训练,并且使具有饱和非线性的模型训练起来非常困难。
我们将这种现象称为内部协变量转移(internal covariate shift),并通过标准化层输入来解决这个问题。
我们的方法力图使标准化成为模型架构的一部分,并为每个训练小批量数据执行标准化。批标准化使我们能够使用更高的学习率,并且不用太注意初始化。它也作为一个正则化项,在某些情况下不需要Dropout。将批量标准化应用到最先进的图像分类模型上,批标准化在取得相同的精度的情况下,减少了14倍的训练步骤,并以显著的差距击败了原始模型。
1 引言
SGD很有效。且有2013年基于动量, 2011年Adagrad等改进。
SGD优化参数θ来最小化loss
Xi是训练集,使用m个batch的小批量来更新参数,而不是一次一个样本。
- 小批量数据的梯度损失是训练集上的估计,其质量随批量增加而改善
- 提供了计算的并行性,计算m个比单个计算m次要高效
虽然随机梯度是简单有效的,但它需要仔细调整模型的超参数,特别是优化中使用的学习速率以及模型参数的初始值。
训练的复杂性在于每层的输入受到前面所有层的参数的影响——因此当网络变得更深时,网络参数的微小变化就会被放大。
层输入的分布变化是一个问题,因为这些层需要不断适应新的分布。当学习系统的输入分布发生变化时,据说会经历协变量转移( covariate shift)(Shimodaira,2000)。
这通常是通过域适应(Jiang,2008)来处理的。然而,协变量漂移的概念可以扩展到整个学习系统之外,应用到学习系统的一部分,例如子网络或一层。
考虑到:
是任意变换,学习θ1 ,θ2来最小化损失,
学习θ2可以看做
x
=
F
1
(
u
,
Θ
1
)
x=F_1(u,\Theta_1)
x=F1(u,Θ1)送入到子网络
ℓ
=
F
2
(
x
,
Θ
2
)
\ell = F_2(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_{i=1}^m \frac {\partial F_2(x_i,\Theta_2)} {\partial \Theta_2}
Θ2←Θ2−mαi=1∑m∂Θ2∂F2(xi,Θ2)
(对于批大小
m
m
m和学习率
α
\alpha
α)与输入为
x
x
x的单独网络
F
2
F_2
F2完全等价。因此,输入分布特性使训练更有效——例如训练数据和测试数据之间有相同的分布——也适用于训练子网络。因此
x
x
x的分布在时间上保持固定是有利的。然后,
Θ
2
\Theta_2
Θ2不必重新调整来补偿
x
x
x分布的变化。
子网络输入的固定分布对于子网络外的层也有积极的影响。考虑一个激活函数为 g ( x ) = 1 1 + exp ( − x ) g(x) = \frac{1}{1+\exp(-x)} g(x)=1+exp(−x)1的层, u u u是层输入,权重矩阵 W W W和偏置向量 b b b是要学习的层参数, g ( x ) = 1 1 + exp ( − x ) g(x) = \frac{1}{1+\exp(-x)} g(x)=1+exp(−x)1。随着 ∣ x ∣ |x| ∣x∣的增加, g ′ ( x ) g'(x) g′(x)趋向于0。这意味着对于 x = W u + b x=Wu+b x=Wu+b的所有维度,除了那些具有小的绝对值之外,流向 u u u的梯度将会消失,模型将缓慢的进行训练。然而,由于 x x x受 W , b W,b W,b和下面所有层的参数的影响,训练期间那些参数的改变可能会将 x x x的许多维度移动到非线性的饱和状态并减慢收敛。这个影响随着网络深度的增加而放大。在实践中,饱和问题和由此产生的梯度消失通常通过使用修正线性单元(Nair & Hinton, 2010) R e L U ( x ) = max ( x , 0 ) ReLU(x)=\max(x,0) ReLU(x)=max(x,0),仔细的初始化(Bengio & Glorot, 2010; Saxe et al., 2013)和小的学习率来解决。然而,如果我们能保证非线性输入的分布在网络训练时保持更稳定,那么优化器将不太可能陷入饱和状态,训练将加速。
小结:
改变梯度消失方法: 1 更仔细的初始化 2 更小的学习率 3 BN层
我们把训练过程中深度网络内部结点的分布变化称为内部协变量转移。消除它可以保证更快的训练。我们提出了一种新的机制,我们称为为批标准化(Batch Normalization),它是减少内部协变量转移的一个步骤,这样做可以显著加速深度神经网络的训练。它通过标准化步骤来实现,标准化步骤修正了层输入的均值和方差。批标准化减少了梯度对参数或它们的初始值尺度上的依赖,对通过网络的梯度流动有有益的影响。这允许我们使用更高的学习率而没有发散的风险。此外,批标准化使模型正则化并减少了对Dropout(Srivastava et al., 2014)的需求。最后,批标准化通过阻止网络陷入饱和模式让使用饱和非线性成为可能。
小节:BN允许更高的学习率,减少了对Dropout的需求,阻止了网络陷入饱和模式
2. 减少内部协变量转变(Internal Covariate Shift)
通过白化每一层的输入,我们将采取措施实现输入的固定分布,消除内部协变量转移的不良影响。(即输入线性变换为具有零均值和单位方差,并去相关)
我们考虑在每个训练步骤或在某些间隔来白化激活值,通过直接修改网络或根据网络激活值来更改优化方法的参数
例如,考虑一个层,其输入
u
u
u加上学习到的偏置
b
b
b,通过减去在训练集上计算的激活值的均值对结果进行归一化:
x
^
=
x
−
E
[
x
]
\hat x=x - E[x]
x^=x−E[x],
x
=
u
+
b
x = u+b
x=u+b,
X
=
x
1
…
N
X={x_{1\ldots N}}
X=x1…N是训练集上
x
x
x值的集合,
E
[
x
]
=
1
N
∑
i
=
1
N
x
i
E[x] = \frac{1}{N}\sum_{i=1}^N x_i
E[x]=N1∑i=1Nxi。
如果梯度下降步骤忽略了
E
[
x
]
E[x]
E[x]对
b
b
b的依赖,那它将更新
b
←
b
+
Δ
b
b\leftarrow b+\Delta b
b←b+Δ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) -E[u+(b+\Delta b)] = u+b-E[u+b]
u+(b+Δb)−E[u+(b+Δb)]=u+b−E[u+b]。因此,结合
b
b
b的更新和接下来标准化中的改变会导致层的输出没有变化,从而导致损失没有变化。
随着训练的继续,
b
b
b将无限增长而损失保持不变
如果标准化不仅中心化而且缩放了激活值,问题会变得更糟糕。我们在最初的实验中已经观察到了这一点, 当标准化参数在梯度下降步骤之外计算时,模型会爆炸。
上述方法的问题是梯度下降优化没有考虑到标准化中发生的事实。为了解决这个问题,我们希望确保对于任何参数值,网络总是产生具有所需分布的激活值。这样做将允许关于模型参数损失的梯度来解释标准化,以及它对模型参数
Θ
\Theta
Θ的依赖。设
x
x
x为层的输入,将其看作向量。标准化可以写为变换
它不仅依赖于给定的训练样本
x
x
x而且依赖于所有样本——它们中的每一个都依赖于
Θ
\Theta
Θ,如果
x
x
x是由另一层生成的。
对于反向传播,我们将需要计算雅可比行列式
忽略后一项会导致上面描述的爆炸。在这个框架中,白化层输入是昂贵的,因为它要求计算协方差矩阵
和它的平方根倒数,从而生成白化的激活
C
o
v
[
x
]
−
1
/
2
(
x
−
E
[
x
]
)
Cov[x]{-1/2}(x-E[x])
Cov[x]−1/2(x−E[x])和这些变换进行反向传播的偏导数。这促使我们寻求一种替代方案,以可微分的方式执行输入标准化,并且在每次参数更新后不需要对整个训练集进行分析。
3. Normalization via Mini-Batch Statistics
由于每一层输入的整个白化是代价昂贵的并且不是到处可微分的,因此我们做了两个必要的简化。
首先是我们将单独标准化每个标量特征,从而代替在层输入输出对特征进行共同白化,使其具有零均值和单位方差。
对于具有
d
d
d维输入
x
=
(
x
(
1
)
…
x
(
d
)
)
x = (x^{(1)}\ldots x^{(d)})
x=(x(1)…x(d))的层,我们将标准化每一维
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)=Var[x(k)]x(k)−E[x(k)]其中期望和方差在整个训练数据集上计算。如(LeCun et al., 1998b)中所示,这种标准化加速了收敛,即使特征没有去相关。
注意简单标准化层的每一个输入可能会改变层可以表示什么。例如,标准化sigmoid的输入会将它们约束到非线性的线性状态。为了解决这个问题,我们要确保插入到网络中的变换可以表示恒等变换。为了实现这个,对于每一个激活值 x ( k ) x{(k)} x(k),我们引入成对的参数 γ ( k ) , β ( k ) \gamma{(k)},\beta{(k)} γ(k),β(k),它们会归一化和移动标准化值: 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{Var[x{(k)}]} γ(k)=Var[x(k)]和 β ( k ) = E [ x ( k ) ] \beta{(k)} = E[x^{(k)}] β(k)=E[x(k)],我们可以重新获得原始的激活值,如果这是要做的最优的事。
每个训练步骤的批处理设置是基于整个训练集的,我们将使用整个训练集来标准化激活值。然而,当使用随机优化时,这是不切实际的。
因此,我们做了第二个简化:由于我们在随机梯度训练中使用小批量,每个小批量产生每次激活平均值和方差的估计。这样,用于标准化的统计信息可以完全参与梯度反向传播。 注意,通过计算每一维的方差而不是联合协方差,可以实现小批量的使用 ;在联合情况下,将需要正则化,因为小批量大小可能小于白化的激活值的数量,从而导致单个协方差矩阵。
考虑一个大小为
m
m
m的小批量数据
B
B
B。由于标准化被单独地应用于每一个激活,所以让我们集中在一个特定的激活
x
(
k
)
x^{(k)}
x(k),为了清晰忽略
k
k
k。在小批量数据里我们有这个激活的
m
m
m个值,
B
=
{
x
1
…
m
}
.
B=\lbrace x_{1\ldots m} \rbrace.
B={x1…m}.设标准化值为
x
^
1
…
m
\hat x_{1\ldots m}
x^1…m,它们的线性变换为
y
1
…
m
y_{1\ldots m}
y1…m。我们把变换
B
N
γ
,
β
:
x
1
…
m
→
y
1
…
m
BN_{\gamma,\beta}: x_{1\ldots m}\rightarrow y_{1\ldots m}
BNγ,β:x1…m→y1…m看作批标准化变换。我们在算法1中提出了BN变换。在算法中,为了数值稳定,
ϵ
\epsilon
ϵ是一个加到小批量数据方差上的常量。
BN变换可以添加到网络上来操纵任何激活。在公式
y
=
B
N
γ
,
β
(
x
)
y = BN_{\gamma,\beta}(x)
y=BNγ,β(x)中,我们指出参数
γ
\gamma
γ和
β
\beta
β需要进行学习,但应该注意到在每一个训练样本中BN变换不单独处理激活。相反,
B
N
γ
,
β
(
x
)
BN_{\gamma,\beta}(x)
BNγ,β(x)取决于训练样本和小批量数据中的其它样本。缩放和移动的值
y
y
y传递到其它的网络层。标准化的激活值
x
^
\hat x
x^在我们的变换内部,但它们的存在至关重要。只要每个小批量的元素从相同的分布中进行采样,如果我们忽略
ϵ
\epsilon
ϵ,那么任何
x
^
\hat x
x^值的分布都具有期望为
0
0
0,方差为
1
1
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
m1∑i=1mx^i2=1看到,并取得预期。
每一个标准化的激活值
x
^
(
k
)
\hat 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)组成的子网络的输入,接下来是原始网络的其它处理。所有的这些子网络输入都有固定的均值和方差,尽管这些标准化的
x
^
(
k
)
\hat x^{(k)}
x^(k)的联合分布可能在训练过程中改变,但我们预计标准化输入的引入会加速子网络的训练,从而加速整个网络的训练。
在训练过程中我们需要通过这个变换反向传播损失 ℓ \ell ℓ的梯度,以及计算关于BN变换参数的梯度。我们使用的链式法则如下(简化之前):
因此,BN变换是将标准化激活引入到网络中的可微变换。这确保了在模型训练时,层可以继续学习输入分布,表现出更少的内部协变量转移,从而加快训练。
此外,应用于这些标准化的激活上的学习到的仿射变换允许BN变换表示恒等变换并保留网络的能力.
3.1. Training and Inference with Batch-Normalized Networks
3.1 批标准化网络的训练和推断
为了批标准化一个网络,根据算法1,我们指定一个激活的子集,然后在每一个激活中插入BN变换。任何以前接收
x
x
x作为输入的层现在接收
B
N
(
x
)
BN(x)
BN(x)作为输入。采用批标准化的模型可以使用批梯度下降,或者用小批量数据大小为
m
>
1
m>1
m>1的随机梯度下降,或使用它的任何变种例如Adagrad (Duchi et al., 2011)进行训练。依赖小批量数据的激活值的标准化可以有效地训练,但在推断过程中是不必要的也是不需要的;我们希望输出只确定性地取决于输入。
为此,一旦网络训练完成,我们使用总体统计来进行标准化
x
^
=
x
−
E
[
x
]
V
a
r
[
x
]
+
ϵ
\hat x=\frac {x - E[x]} {\sqrt{Var[x] + \epsilon}}
x^=Var[x]+ϵx−E[x],而不是小批量数据统计。跟训练过程中一样,如果忽略
ϵ
\epsilon
ϵ,这些标准化的激活具有相同的均值0和方差1。
我们使用无偏方差估计,
其中期望是在大小为
m
m
m的小批量训练数据上得到的,
σ
B
2
\sigma_B^2
σB2
是其样本方差。使用这些值移动平均,我们在训练过程中可以跟踪模型的准确性。由于均值和方差在推断时是固定的,因此标准化是应用到每一个激活上的简单线性变换。它可以进一步由缩放
γ
\gamma
γ和转移
β
\beta
β组成,以产生代替
B
N
(
x
)
BN(x)
BN(x)的单线性变换。算法2总结了训练批标准化网络的过程。
3.2. 批标准化卷积网络Batch-Normalized Convolutional Networks
批标准化可以应用于网络的任何激活集合。这里我们专注于仿射变换和元素级非线性组成的变换: z = g ( W u + b ) z = g(Wu+b) z=g(Wu+b) 其中 W W W和 b b b是模型学习的参数, g ( ⋅ ) g(\cdot) g(⋅)是非线性例如sigmoid或ReLU。这个公式涵盖了全连接层和卷积层。我们在非线性之前通过标准化 x = W u + b x=Wu+b x=Wu+b加入BN变换。 我们也可以标准化层输入 u u u,但由于 u u u可能是另一个非线性的输出,它的分布形状可能在训练过程中改变,并且限制其第一矩或第二矩不能去除协变量转移。相比之下, W u + b Wu+b Wu+b更可能具有对称,非稀疏分布,即“更高斯”(2000);对其标准化可能产生具有稳定分布的激活。
注意,由于我们对 W u + b Wu+b Wu+b进行标准化,偏置 b b b可以忽略,因为它的效应将会被后面的中心化取消(偏置的作用会归入到算法1的 β \beta β)。因此, z = g ( W u + b ) z = g(Wu+b) z=g(Wu+b)被 z = g ( B N ( W u ) ) z = g(BN(Wu)) z=g(BN(Wu))替代,其中BN变换独立地应用到 x = W u x=Wu x=Wu的每一维,每一维具有单独的成对学习参数 γ ( k ) \gamma{(k)} γ(k), β ( k ) \beta{(k)} β(k)。
另外,对于卷积层我们希望标准化遵循卷积特性——为的是同一特征映射的不同元素,在不同的位置,以相同的方式进行标准化。为了实现这个,我们在所有位置联合标准化了小批量数据中的所有激活。在算法1中,我们让 B B B是跨越小批量数据的所有元素和空间位置的特征图中所有值的集合——因此对于大小为 m m m的小批量数据和大小为 p × q p\times q p×q的特征映射,我们使用有效的大小为 m ′ = ∣ B ∣ = m ⋅ p , q m'=|B| = m\cdot p, q m′=∣B∣=m⋅p,q的小批量数据。我们每个特征映射学习一对参数 γ ( k ) \gamma{(k)} γ(k)和 β ( k ) \beta{(k)} β(k),而不是每个激活。算法2进行类似的修改,以便推断期间BN变换对在给定的特征映射上的每一个激活应用同样的线性变换。
3.3. 批标准化可以提高学习率
在传统的深度网络中,学习率过高可能会导致梯度爆炸或梯度消失,以及陷入差的局部最小值。批标准化有助于解决这些问题。通过标准化整个网络的激活值,在数据通过深度网络传播时,它可以防止层参数的微小变化被放大。例如,这使sigmoid非线性更容易保持在它们的非饱和状态,这对训练深度sigmoid网络至关重要,但在传统上很难实现。
批标准化也使训练对参数的缩放更有弹性。通常,大的学习率可能会增加层参数的缩放,这会在反向传播中放大梯度并导致模型爆炸。然而,通过批标准化,通过层的反向传播不受其参数缩放的影响。实际上,对于标量 a a a, B N ( W u ) = B N ( ( a W ) u ) BN(Wu) = BN((aW)u) BN(Wu)=BN((aW)u)因此 ∂ B N ( ( a W ) u ) ∂ u = ∂ B N ( W u ) ∂ u \frac {\partial BN((aW)u)} {\partial u}= \frac {\partial BN(Wu)} {\partial u} ∂u∂BN((aW)u)=∂u∂BN(Wu),因此标量不影响层的雅可比行列式,从而不影响梯度传播。此外, ∂ B N ( ( a W ) u ) ∂ ( a W ) = 1 a ⋅ ∂ B N ( W u ) ∂ W \frac {\partial BN((aW)u)} {\partial (aW)}=\frac {1} {a} \cdot \frac {\partial BN(Wu)} {\partial W} ∂(aW)∂BN((aW)u)=a1⋅∂W∂BN(Wu),因此更大的权重会导致更小的梯度,并且批标准化会稳定参数的增长。
实验
mnist实验对比图,我们在网络的每一个隐藏层后添加批标准化
图1(a)显示了随着训练进行,两个网络在提供的测试数据上正确预测的分数。批标准化网络具有更高的测试准确率。为了调查原因,我们在训练过程中研究了原始网络
N
N
N和批标准化网络
N
B
N
t
r
N_{BN}^{tr}
NBNtr(Alg. 2)中的sigmoid输入。在图1(b,c)中,我们显示,对于来自每个网络的最后一个隐藏层的一个典型的激活,其分布如何演变。原始网络中的分布随着时间的推移而发生显著变化,无论是平均值还是方差,都会使后面的层的训练复杂化。相比之下,随着训练的进行,批标准化网络中的分布更加稳定,这有助于训练。
4.2.1加速BN网络
提高学习率。在批标准化模型中,我们已经能够从高学习率中实现训练加速,没有不良的副作用
更彻底地搅乱训练样本。我们启用了分布内部搅乱训练数据,这样可以防止同一个例子一起出现在小批量数据中。这导致验证准确率提高了约1%,这与批标准化作为正则化项的观点是一致的:它每次被看到时都会影响一个样本,在我们的方法中内在的随机化应该是最有益的。
减少L2权重正则化。虽然在Inception中模型参数的L2损失会控制过拟合,但在修改的BN-Inception中,损失的权重减少了5倍。我们发现这提高了在提供的验证数据上的准确性。
加速学习率衰减。在训练Inception时,学习率呈指数衰减。因为我们的网络训练速度比Inception更快,所以我们将学习速度降低加快6倍。
删除局部响应归一化。虽然Inception和其它网络(Srivastava等人,2014)从中受益,但是我们发现使用批标准化它是不必要的。
减少光照扭曲。因为批标准化网络训练更快,并且观察每个训练样本更少的次数,所以通过更少地扭曲它们,我们让训练器关注更多的“真实”图像。
单网络分类:
通过仅使用批标准化(BN-Baseline),我们在不到Inception一半的训练步骤数量内将准确度与其相匹配。通过应用4.2.1小节中的修改,我们显著提高了网络的训练速度。BN-x5需要比Inception少14倍的步骤就达到了72.2%的准确率。有趣的是,进一步提高学习率(BN-x30)使得该模型最初训练有点慢,但可以使其达到更高的最终准确率。这种现象是违反直觉的,应进一步调查。在
6
⋅
1
0
6
6 \cdot 10^6
6⋅106步骤之后,BN-x30达到74.8%的准确率,即比Inception达到72.2%的准确率所需的步骤减少了5倍。
5. 结论
我们提出了一个新的机制,大大加快了深度网络的训练。它是基于前提协变量转移的,已知其会使机器学习系统的训练复杂化,也适用于子网络和层,并且从网络的内部激活中去除它可能有助于训练。我们提出的方法从其标准化激活中获取其功能,并将这种标准化合并到网络架构本身。这确保了标准化可以被用来训练网络的任何优化方法进行恰当的处理。为了让深度网络训练中常用的随机优化方法可用,我们对每个小批量数据执行标准化,并通过标准化参数来反向传播梯度。批标准化每个激活只增加了两个额外的参数,这样做可以保持网络的表示能力。我们提出了一个用于构建,训练和执行推断的批标准化网络算法。所得到的网络可以用饱和非线性进行训练,能更容忍增加的训练率,并且通常不需要丢弃来进行正则化
仅仅将批标准化添加到了最新的图像分类模型中便在训练中取得了实质的加速。通过进一步提高学习率,删除丢弃和应用批标准化所提供的其它修改,我们只用了少部分的训练步骤就达到了以前的技术水平——然后在单网络图像分类中击败了最先进的技术。此外,通过组合多个使用批标准化训练的模型,我们在ImageNet上的表现显著优于最好的已知系统。
引用:
https://www.jianshu.com/p/2bc6dab16cfe