神经网络中的batch normalization
为什么要Batch Normalization
首先,我们做一个类比。在传统机器学习中,我们经常要使用标准化的方法来使输入数据保持在一定的范围(处在同一数量级),这样可以加快模型求解速度。
举例来说,假设我们要用回归的方法预测房价,自变量为房子面积和房间数,因变量为房价,目标函数为:
其中,
x
1
x_1
x1代表房间数,
x
2
x_2
x2代表房子面积,
θ
1
,
θ
2
\theta_1,\theta_2
θ1,θ2为系数。由于房间数和房子面积的量纲差距较大(如一户房子的房间数为4,房子面积为100平方米,4和100不在同一数量级),我们用梯度下降的方式求最优解,
未标准化的情况下,模型寻求最优解的过程如图一,
经过标准化之后,模型寻求最优解的过程如图二,
可以看出,未经标准化时,梯度下降的幅度大,方向曲折,收敛速度慢;而经过标准化后,梯度下降的幅度更小,步长更平缓,收敛的速度更快。所以,数据标准化对加快模型收敛速度有着很大的帮助。
同理,我们分析神经网络的计算过程,如图三所示
在神经网络迭代的过程中,每一层的参数会不断改变,导致每一层的输出分布也会随之改变,例如,以网络第三层为例,在第i次迭代之后,第三层的输出值的分布如图四所示
之后进行反向传播,更新各层参数,在经过第i+1次迭代之后输出的数据的分布如图5所示
可以看出输出数据的分布发生了变化,这种情况就叫做Internal Covariate Shift(ICS),这会导致参数更新缓慢,影响网络的收敛速度,甚至不收敛。
所以我们试图将每一层网络的输出进行标准化,类似于之前举例的传统机器学习的标准化方法,使每一层的输出规范在一个小范围内,这样可以加快参数的学习速度,从而使网络更快收敛。
Batch Normalization的具体做法
神经网络中的batch normalization通常是运用在mini-batch中。
先计算一个batch数据的均值和标准差,如下所示,其中,
μ
\mu
μ和
σ
\sigma
σ分别是这个batch数据的平均值和标准差,
z
i
z_i
zi是这个batch中的第i个数据,m是这个batch的数据量。
μ
=
1
m
Σ
z
i
\mu=\frac{1}{m}\Sigma z_i
μ=m1Σzi
σ
=
1
m
Σ
(
z
i
−
μ
)
2
\sigma=\frac{1}{m}\Sigma \left(z_i-\mu\right)^2
σ=m1Σ(zi−μ)2
之后对batch里的每个数据进行标准化,其中
z
i
n
z_i^n
zin是经过normalization之后的数据,
ϵ
\epsilon
ϵ是一个常数,为了防止
σ
\sigma
σ等于0的情况。
z
i
n
=
z
i
−
μ
σ
2
+
ϵ
z_i^n=\frac{z_i-\mu}{\sqrt {\sigma ^2+\epsilon}}
zin=σ2+ϵzi−μ
但是这样得到的每一批数据的平均值和标准差都固定为0和1,为了保证模型的表达能力不因为规范化而下降,我们应该让网络自己学习这两个值。所以最后的结果应该为
z
^
i
n
=
γ
z
i
n
+
β
\hat z_i^n=\gamma z_i^n+\beta
z^in=γzin+β
γ
\gamma
γ,
β
\beta
β是需要网络进行学习的参数,通过修改它们可以改变每一个batch数据的均值和标准差,当
γ
=
σ
2
+
ϵ
\gamma=\sqrt {\sigma ^2+\epsilon}
γ=σ2+ϵ,
β
=
μ
\beta=\mu
β=μ 时,
z
^
i
n
=
z
i
n
\hat z_i^n=z_i^n
z^in=zin.
参考文献:
[1] https://blog.csdn.net/program_developer/article/details/78637711
[2] http://www.ai-start.com/dl2017/html/lesson2-week3.html