Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
论文链接: https://arxiv.org/abs/1502.03167
一、 Problem Statement
在训练的时候,输入分布的变化要求较低的学习率和较为严谨的参数初始化,使得训练模型困难。此外,各层输入分布的变化带来了一个问题,因为各层需要不断地适应新的分布,把这个问题称为内部协变量偏移(internal covariate shift)。
二、 Direction
对每一个training mini-batch使用了normalization。使得训练网络的时候可以使用更大的学习率和较少的关注参数初始化。同时,它也充当了正则化项, 在某些情况可以取消使用Dropout。
三、 Method
SGD最优化权重参数
w
w
w:
w
=
arg min
w
1
N
∑
i
=
1
N
l
(
x
i
,
w
)
w = \argmin_{w} \frac{1}{N}\sum_{i=1}^Nl(x_i,w)
w=wargminN1i=1∑Nl(xi,w)
mini-batch使用是:
1
m
∂
l
(
x
i
,
w
)
∂
w
\frac{1}{m}\frac{\partial l(x_i, w)}{\partial w}
m1∂w∂l(xi,w)
使用mini-batch的好处:
- 小批量损失梯度是对训练集上梯度的估计,随着batch的增大,其质量也随之提高。
- 用batch取计算比计算m次单个样本更加有效。
但SGD需要对超参数比较敏感,随着网络加深,小的变化也会被放大。此外还有内部协变量偏移的问题。
比如下面有一个网络计算:
l
=
F
2
(
F
1
(
x
,
w
1
)
,
w
2
)
l=F_2(F_1(x,w_1),w_2)
l=F2(F1(x,w1),w2)
学习
F
2
F_2
F2的时候,会把
F
1
(
x
,
w
1
)
F_1(x,w_1)
F1(x,w1)当作输入,这样的梯度就是:
w
2
←
w
2
−
α
m
∑
i
=
1
m
∂
F
2
(
x
i
,
w
2
)
∂
w
2
w_2 \leftarrow w_2 - \frac{\alpha}{m}\sum_{i=1}^m\frac{\partial F_2(x_i,w_2)}{\partial w_2}
w2←w2−mαi=1∑m∂w2∂F2(xi,w2)
因此,各层输入x的分布随时间保持固定是有利的。
- w 2 w_2 w2就不需要重新调整来补偿输入 x x x分布的变化。
- 对于激活函数等也有积极的影响。
比如,假设
F
F
F是sigmoid activate function
z
=
f
(
W
x
+
b
)
,
f
=
1
1
+
e
x
p
(
−
x
)
z=f(Wx+b), \quad f=\frac{1}{1+exp(-x)}
z=f(Wx+b),f=1+exp(−x)1。随着
∣
x
∣
|x|
∣x∣增大,
f
′
(
x
)
f'(x)
f′(x)趋向于0,这意味着,梯度会消失,导致训练困难。
同时,由于
x
x
x受到
w
,
b
w,b
w,b和下面所有层的参数的影响,这些参数在训练过程中的变化可能会使
x
x
x的许多维数进入非线性的饱和状态,从而减慢收敛速度,随着网络加深,影响扩大。这个问题通常可以由ReLU解决
R
e
L
U
(
x
)
=
m
a
x
(
x
,
0
)
ReLU(x)=max(x,0)
ReLU(x)=max(x,0),小心的初始化。如果我们能确保非线性输入的分布随着网络的训练保持稳定,优化器就不太可能陷入饱和状态,加速训练。
1. Towards Reducing Internal Covariate Shift
作者一开始提出了:
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)]
这里的期望和协方差是基于整个训练集的。这样的normalization可能会改变每一层所表示的东西。为了解决这个问题,作者引入了两个变量
γ
(
k
)
\gamma^{(k)}
γ(k)和
β
(
k
)
\beta^{(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
)
]
,
β
(
k
)
=
E
[
x
(
k
)
]
\gamma^{(k)} = \sqrt{Var[x^{(k)}]}, \quad \beta^{(k)} = E[x^{(k)}]
γ(k)=Var[x(k)],β(k)=E[x(k)]
但基于整个训练集计算均值和协方差是不实际的。 因此作者做了第二个简化: 只计算每一个mini-batch里面的均值和协方差,具体如下:
其中,又引入了一个常量参数
ϵ
\epsilon
ϵ,用来作数值稳定。这样的话,任何
x
^
\hat{x}
x^的值的分布都有0期望,协方差为1的性质。
下面是Batch Normalization的导数形式:
∂
l
∂
x
^
i
=
∂
l
∂
y
i
⋅
γ
∂
l
∂
σ
B
2
=
∑
i
=
1
m
∂
l
∂
x
^
i
⋅
(
x
i
−
μ
B
)
⋅
−
1
2
(
σ
B
2
+
ϵ
)
−
3
/
2
∂
l
∂
μ
B
=
(
∑
i
=
1
m
∂
l
∂
x
^
i
⋅
−
1
σ
B
2
+
ϵ
)
+
∂
l
∂
σ
B
2
⋅
∑
i
=
1
m
−
2
(
x
i
−
μ
B
)
m
∂
l
∂
x
i
=
∂
l
∂
x
^
i
⋅
1
σ
B
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
\begin{aligned} &\frac{\partial l}{\partial \hat{x}_i} = \frac{\partial l}{\partial y _i} \cdot \gamma \\ &\frac{\partial l}{\partial \sigma^2_{\Beta}} = \sum_{i=1}^m \frac{\partial l}{\partial \hat{x}_i} \cdot (x_i - \mu_{\Beta}) \cdot \frac{-1}{2}(\sigma_{\Beta}^2+\epsilon)^{-3/2} \\ &\frac{\partial l}{\partial \mu_{\Beta}} = (\sum_{i=1}^m \frac{\partial l}{\partial \hat{x}_i}\cdot \frac{-1}{\sqrt{\sigma_{\Beta}^2+\epsilon}})+\frac{\partial l}{\partial \sigma_{\Beta}^2}\cdot \frac{\sum_{i=1}^m-2(x_i-\mu_{\Beta})}{m}\\ &\frac{\partial l}{\partial x_i} = \frac{\partial l}{\partial \hat{x}_i}\cdot \frac{1}{\sqrt{\sigma^2_{\Beta}+\epsilon}}+\frac{\partial l}{\partial \sigma^2_{\Beta}} \cdot \frac{2(x_i - \mu_{\Beta})}{m}+\frac{\partial l}{\partial \mu_{\Beta}}\cdot \frac{1}{m} \\ &\frac{\partial l}{\partial \gamma} = \sum_{i=1}^m \frac{\partial l}{\partial y_i}\cdot \hat{x}_i \\ &\frac{\partial l}{\partial \beta} = \sum_{i=1}^m \frac{\partial l}{\partial y_i} \end{aligned}
∂x^i∂l=∂yi∂l⋅γ∂σB2∂l=i=1∑m∂x^i∂l⋅(xi−μB)⋅2−1(σB2+ϵ)−3/2∂μB∂l=(i=1∑m∂x^i∂l⋅σB2+ϵ−1)+∂σB2∂l⋅m∑i=1m−2(xi−μB)∂xi∂l=∂x^i∂l⋅σB2+ϵ1+∂σB2∂l⋅m2(xi−μB)+∂μB∂l⋅m1∂γ∂l=i=1∑m∂yi∂l⋅x^i∂β∂l=i=1∑m∂yi∂l
2. Training and Inference with Batch Normalized Networks。
从上面可以知道,训练的时候,均值和协方差是通过mini-batch的样本计算的。但是在推理的时候,我们想要输出只与输入有关系。所以一旦模型训练好了,使用
x
^
=
x
−
E
[
x
]
V
a
r
[
x
]
+
ϵ
\hat{x} = \frac{x-E[x]}{\sqrt{Var[x] + \epsilon}}
x^=Var[x]+ϵx−E[x]
这里的
V
a
r
[
x
]
=
m
m
−
1
E
B
[
σ
B
2
]
Var[x]=\frac{m}{m-1}E_{\Beta}[\sigma_{\Beta}^2]
Var[x]=m−1mEB[σB2],这里的
m
m
m是训练时候batch size的值,
σ
B
2
\sigma^2_{\Beta}
σB2是训练时候的样本协方差。
具体的算法如下:
3. Batch Normalized Convolutional Networks
在卷积的时候,把 B \Beta B设置为 m ′ = ∣ B ∣ = m ⋅ p q m'=|\Beta|=m\cdot pq m′=∣B∣=m⋅pq,其中, m m m为batch size, p和q为feature map的大小。学习每一个feature map的 γ ( k ) \gamma^{(k)} γ(k)和 β ( k ) \beta^{(k)} β(k)。
4. Batch Normalization enables higher learning rates
在传统的深度网络中,太高的学习率或者太低的学习率会导致梯度消失或者爆炸,也有可能进入局部最低。Batch Normlization有助于解决这个问题。批处理规范化还使训练对参数规模更具弹性。通常情况下,较大的学习速率会增加层参数的规模,从而在反向传播过程中放大梯度,导致模型爆炸。
然而,使用了Batch Normalization, 通过一个网络层的时候,反向梯度不会受到learning rate的影响:
B
N
(
W
x
)
=
B
N
(
(
α
W
)
x
)
BN(Wx) = BN((\alpha W)x)
BN(Wx)=BN((αW)x)
相对应的梯度为:
∂
BN
(
α
W
)
x
∂
x
=
∂
BN
(
W
x
)
∂
x
\frac{\partial \text{BN}(\alpha W)x}{\partial x} = \frac{\partial \text{BN}(Wx)}{\partial x} \\
∂x∂BN(αW)x=∂x∂BN(Wx)
∂
BN
(
α
W
)
x
∂
W
=
1
α
⋅
∂
BN
(
W
x
)
∂
W
\frac{\partial \text{BN}(\alpha W)x}{\partial W} = \frac{1}{\alpha} \cdot \frac{\partial \text{BN}(Wx)}{\partial W}
∂W∂BN(αW)x=α1⋅∂W∂BN(Wx)
可以看到,大的学习率会导致更小的梯度。
5. Batch Normalization regularizes the model
Batch Normalization起到正则化的作用,避免了overfitting。
四、 Conclusion
- 所提出的Batch Normalization 可以固定网络层输入的均值和协方差,
- 且通过减少梯度对参数的大小和初始值的依赖,有助于网络中梯度的传递。
- Batch Normalization也有正则化的作用,减少了Dropout的使用。
- Batch Normalization通过防止网络陷入饱和模式,使得使用饱和非线性成为可能。
简单的在神经网络中使用BN,并没有完全利用好这篇文章的方法,作者还提出:
- 增大学习率,加速网络训练
- 删除Dropout,加速训练,也能避免过拟合。
- 减少 L 2 L_2 L2 权重正则化。在Inception网络中,使用了 L 2 L_2 L2 loss来控制过拟合,通过控制这个Loss的权重提升精度。
- 加速学习率的衰减。
- 移除local response normalization。
- 彻底打乱数据样本。
- 减少photometric distortions。因为标网络训练更快,观察每个训练示例的次数更少,所以我们让培训师通过较少的扭曲来关注更“真实”的图像。
那Batch-normalized 应该放在非线性激活层的前面还是后面?
在BN的原始论文中,BN是放在非线性激活层前面的。
We add the BN transform immediately before the nonlinearity
五、 Reference
- https://www.zhihu.com/question/283715823/answer/438882036