??2015年 Google 技术团队发表论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,在文中正式提出了批标准化(Batch Normalization, BN)。
Internal Covariate Shift
??对神经网络的参数初始化有了解的读者可能知道神经网络有一个重要的假设——每层的各个输入之间相互独立且服从正态分布。网络在训练的过程中,可训练参数在不断发生着变化,某神经元的可训练参数发生变化后,其输出值的概率分布很可能发生变化(数学期望和方差发生变化)。这也就意味着,经过一次训练后,该神经元的输出值的概率分布与本次训练之前的不服从同一分布。以上这种现象被论文的作者称为 “Internal Covariate Shift”。 ??这种现象会导致以该神经元的输出作为输入的神经元需要调整权重以适应概率分布的变化。显然,这无疑会降低网络的收敛速度。再进一步说,为了降低两次训练之间的分布变化的程度,以让相关神经元及时适应这种变化,我们就需要设置一个较小的学习率。小的学习率也就意味着慢的收敛速度。
Batch Normalization
??为了缓解上述现象,论文作者提出了 BN 方法。我们知道在训练网络时,每次送入网络的不是一个样本,而是由多个样本组成的 batch。假设一个 batch 中有
h
h
h 个样本,那么神经元的一个输入端每次就会得到
h
h
h 个输入值(如果不理解此处,可以参考神经网络的基本原理一文中正向传播的矩阵公式)。如果我们将对这
h
h
h 个输入值进行统一调整,使调整后的这
h
h
h 个输入值的均值为
0
0
0、方差为
1
1
1。虽然是在
h
h
h 个输入值上进行的调整,并不是在整个训练集上,但这已经有了一定的近似了。那么,经过这样的调整,我们就可以近似的认为在训练的过程中输入值的概率分布始终稳定在数学期望为
0
0
0、方差为
1
1
1 的同一分布,这也就解决了 Internal Covariate Shift。这种将
h
h
h 个值的均值和方差分别调整为
0
0
0 和
1
1
1 的过程被作者称为白化(whitening)。 ??我们对每个神经元内输入激活函数的激活值进行白化与上文中提到的对每个输入端的输入值进行白化所达到的效果是相同的。因为通过概率论的知识,我们知道两个独立的服从同一分布的随机变量,经过同一个函数变换后,仍然服从同一分布。如果每次训练中的激活值都服从同一分布,因为它们每次经过的都是同一个激活函数的变换,所以激活函数的输出值即神经元的输出值必然也服从同一分布。本层神经元的输出值就是下一层神经元的输入值,本层输出服从同一分布即下一层输入服从同一分布。 ??事实上,BN 就是对激活值进行了白化,而没有对输入值进行白化。一方面,根据上一段,我们知道激活值和输入值的白化效果相同。另一方面,对激活值进行白化,会使白化后的激活值大部分分布到
0
0
0 附近,这可以缓解 Sigmoid、tanh 的梯度消失现象,也可以减少 ReLU 发生神经元死亡的可能性。(如果此处不理解,可以参考神经网络的激活函数一文) ??设 batch 中有
h
h
h 个样本,batch 中第
k
k
k 个样本使某神经元产生的激活值记作
s
{
k
}
s^{\{k\}}
s{k},白化后的记作
s
~
{
k
}
\tilde{s}^{\{k\}}
s~{k}。设激活值的均值为
μ
\mu
μ,方差为
σ
\sigma
σ。则对激活值的白化公式如下:
μ
=
1
h
∑
k
=
1
h
s
{
k
}
\mu = \frac{1}{h}\sum_{k=1}^h{s^{\{k\}}}
μ=h1?k=1∑h?s{k}
σ
=
1
h
∑
k
=
1
h
(
s
{
k
}
?
μ
)
2
\sigma = \sqrt{\frac{1}{h}\sum_{k=1}^h{\left( s^{\{k\}}-\mu \right)^2}}
σ=h1?k=1∑h?(s{k}?μ)2
?
s
~
{
k
}
=
s
{
k
}
?
μ
σ
\tilde{s}^{\{k\}} = \frac{s^{\{k\}} - \mu}{\sigma}
s~{k}=σs{k}?μ???经过如上处理
s
~
{
1
}
,
?
s
~
{
2
}
,
?
?
?
,
?
s
~
{
h
}
\tilde{s}^{\{1\}}, \, \tilde{s}^{\{2\}}, \, \cdots, \, \tilde{s}^{\{h\}}
s~{1},s~{2},?,s~{h} 的均值为
0
0
0,方差为
1
1
1。论文作者认为,白化后的激活值虽然解决了 Internal Covariate Shift,但却大都集中在
0
0
0 附近,这可能会降低一些神经元的表达能力。所以,作者又为每个神经元配置两个新的可训练参数
γ
\gamma
γ 和
β
\beta
β,对白化后的激活值再进行一次线性变换。又经过线性变换后的激活值记作
s
~
~
{
k
}
\tilde{\tilde{s}}^{\{k\}}
s~~{k},则公式如下:
s
~
~
{
k
}
=
γ
?
s
~
{
k
}
+
β
\tilde{\tilde{s}}^{\{k\}} = \gamma \cdot \tilde{s}^{\{k\}} + \beta
s~~{k}=γ?s~{k}+β??当
γ
=
σ
\gamma = \sigma
γ=σ 且
β
=
μ
\beta = \mu
β=μ 时,最终的激活值也就相当于没有做白化。作者并未论述加入这两个新的可训练参数的理论依据。可能是想做一种调和吧,不把事情做的太绝? ??作者的实验结果表明:
- BN 可以提高收敛速度。
- 使用 BN 时,可以达到 Dropout 的缓解过拟合效果,因此可以不使用 Dropout。
- 使用 BN 时,可以使用较大的学习率,对于权重的初始化可以不再十分严格。
|