为什么要Batch Normalization

首先,我们做一个类比。在传统机器学习中,我们经常要使用标准化的方法来使输入数据保持在一定的范围(处在同一数量级),这样可以加快模型求解速度。
举例来说,假设我们要用回归的方法预测房价,自变量为房子面积和房间数,因变量为房价,目标函数为:
神经网络中的Batch Normalization其中,x1x_1代表房间数,x2x_2代表房子面积,θ1θ2\theta_1,\theta_2为系数。由于房间数和房子面积的量纲差距较大(如一户房子的房间数为4,房子面积为100平方米,4和100不在同一数量级),我们用梯度下降的方式求最优解,
未标准化的情况下,模型寻求最优解的过程如图一,
神经网络中的Batch Normalization
经过标准化之后,模型寻求最优解的过程如图二,
神经网络中的Batch Normalization可以看出,未经标准化时,梯度下降的幅度大,方向曲折,收敛速度慢;而经过标准化后,梯度下降的幅度更小,步长更平缓,收敛的速度更快。所以,数据标准化对加快模型收敛速度有着很大的帮助。
同理,我们分析神经网络的计算过程,如图三所示
神经网络中的Batch Normalization在神经网络迭代的过程中,每一层的参数会不断改变,导致每一层的输出分布也会随之改变,例如,以网络第三层为例,在第i次迭代之后,第三层的输出值的分布如图四所示
神经网络中的Batch Normalization之后进行反向传播,更新各层参数,在经过第i+1次迭代之后输出的数据的分布如图5所示
神经网络中的Batch Normalization可以看出输出数据的分布发生了变化,这种情况就叫做Internal Covariate Shift(ICS),这会导致参数更新缓慢,影响网络的收敛速度,甚至不收敛。
所以我们试图将每一层网络的输出进行标准化,类似于之前举例的传统机器学习的标准化方法,使每一层的输出规范在一个小范围内,这样可以加快参数的学习速度,从而使网络更快收敛。

Batch Normalization的具体做法

神经网络中的batch normalization通常是运用在mini-batch中。
先计算一个batch数据的均值和标准差,如下所示,其中,μ\muσ\sigma分别是这个batch数据的平均值和标准差,ziz_i是这个batch中的第i个数据,m是这个batch的数据量。
μ=1mΣzi\mu=\frac{1}{m}\Sigma z_i
σ=1mΣ(ziμ)2\sigma=\frac{1}{m}\Sigma \left(z_i-\mu\right)^2
之后对batch里的每个数据进行标准化,其中zinz_i^n是经过normalization之后的数据, ϵ\epsilon是一个常数,为了防止σ\sigma等于0的情况。
zin=ziμσ2+ϵz_i^n=\frac{z_i-\mu}{\sqrt {\sigma ^2+\epsilon}}
但是这样得到的每一批数据的平均值都为0,标准差都为1,而有时候我们想使数据拥有其他的平均值和标准差,而不仅仅是固定为0,1。所以最后的结果应该为
z^in=γzin+β \hat z_i^n=\gamma z_i^n+\beta
γ\gamma,β\beta是需要网络进行学习的参数,通过修改它们可以改变每一个batch数据的均值和标准差,当γ=σ2+ϵ\gamma=\sqrt {\sigma ^2+\epsilon}, β=μ\beta=\mu 时,z^in=zin\hat z_i^n=z_i^n.

参考文献:
[1] https://blog.csdn.net/program_developer/article/details/78637711
[2] http://www.ai-start.com/dl2017/html/lesson2-week3.html

相关文章:

  • 2022-12-23
  • 2021-05-15
  • 2022-12-23
  • 2021-07-08
  • 2021-12-19
  • 2021-05-13
  • 2021-05-25
  • 2021-04-15
猜你喜欢
  • 2022-01-01
  • 2022-01-07
  • 2022-12-23
  • 2021-08-07
  • 2021-09-01
  • 2022-12-23
  • 2021-07-03
相关资源
相似解决方案