Batch Normalization: Accelerating Deep Network Training by
Reducing Internal Covariate Shift原文链接
Batch Normalization阅读笔记
一、解决问题
内部协变量转移: 在神经网络的训练过程中,由于参数改变,而引起的神经网络激活值分布的改变。。
在训练过程中前面的层的参数会发生变化,导致每层输入的分布会发生变化,造成了训练深度神经网络的复杂性(每层的输入受到前面所有层的参数的影响,因此当网络变得更深时,网络参数的微小变化就会被放大)。在这样的条件下需要很谨慎的训练,也就意味着较低的学习率和仔细的参数初始化,从而造成了训练的减慢,并且使具有饱和非线性(sigmoid,tanh,在其饱和处梯度接近为0,造成梯度消失)的模型训练起来非常困难。
二、解决思路
稳定输入数据的分布。
之前缓解过早地陷入到饱和非线性处的问题和保持网络训练稳定(Loss稳定收敛)的方法是使用较低的学习率和仔细的参数初始化。而现在可以通过稳定输入到网络层的数据来消除内部协变量转移的现象,从而达到了同样的功能。因此可以让训练适当的大胆起来,使用较大的学习率和粗放地初始化参数,进而加快了训练。
并且可以让训练数据与测试数据的分布强制相同,也一定程度上提升了精度(个人理解,并不确定)。
三、具体方法
(一)公式原理
对网络每层的输入进行白化(将输入数据原始的分布线性变换为具有零均值和单位方差的新分布,并去相关)可以稳定分布。但是由于每一层输入的整个白化是代价昂贵的并且不是到处可微分的,因此做了两个必要的简化。
1.忽略去相关,只进行必要的零均值和单位方差转换操作。
对于具有d维输入
x
=
(
x
(
1
)
…
x
(
d
)
)
x=(x^{(1)}…x^{(d)})
x=(x(1)…x(d))的层,我们将标准化每一维.
考虑如果变换前的分布就是目标分布的情况,必须让变换可以实现恒等映射。对每一个激活值
x
(
k
)
\ x^{(k)}
x(k) 引入一对参数
γ
(
k
)
\ γ^{(k)}
γ(k) 和
β
(
k
)
\ β^{(k)}
β(k),这两个参数能够缩放和平移归一化后的输入:
当
γ
(
k
)
=
V
a
r
[
x
(
k
)
]
\ γ^{(k)}=Var[x^{(k)}]
γ(k)=Var[x(k)],
β
(
k
)
=
E
[
x
(
k
)
]
\ β^{(k)}=E[x^{(k)}]
β(k)=E[x(k)]就能够求得原来的激活值。这两个参数与模型原始的参数一起学习,具有了恢复模型的表征能力。
2.使用小批量
做简化计算,不使用全部训练集来求每个神经元的原始激活x的均值和方差,因为计算量太大。改用了一个batch_size的均值和方差,所以batch_size 不能为1.
计算流程如下图:
m为mini-batch的batch_size。
(二)推理(Inference)过程
进行Inference时通常是只有一个实例的情况,这就没办法求其在各个神经元上的均值和方差了。此时直接用全局统计量即可。那么接下来的问题是如何获得均值和方差的问题。很简单,因为每次做Mini-Batch训练时,都会有那个Mini-Batch里m个训练实例获得的均值和方差,现在要全局统计量,只要把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量。
四、效果(优点)
1.显著加快训练速度。
2.有效解决梯度消失问题。
3.可以起到正则化的效果。
参考
【AI数学】Batch-Normalization详细解析
Batch Normalization论文翻译——中英文对照