Batch Normalization
在上一节,我们观察了各层的激活值分布,并从中了解到如果设定了合
适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利地进
行学习。那么,为了使各层拥有适当的广度,“强制性”地调整激活值的分布
会怎样呢?实际上,Batch Normalization[11]方法就是基于这个想法而产生的。
Batch Normalization 的算法
Batch Normalization(下文简称Batch Norm)是2015 年提出的方法。
Batch Norm虽然是一个问世不久的新方法,但已经被很多研究人员和技术
人员广泛使用。实际上,看一下机器学习竞赛的结果,就会发现很多通过使
用这个方法而获得优异结果的例子。
为什么Batch Norm这么惹人注目呢?因为Batch Norm有以下优点。
- 可以使学习快速进行(可以增大学习率)。
- 不那么依赖初始值(对于初始值不用那么神经质)。
- 抑制过拟合(降低Dropout等的必要性)。
考虑到深度学习要花费很多时间,第一个优点令人非常开心。另外,后
两点也可以帮我们消除深度学习的学习中的很多烦恼。
如前所述,Batch Norm的思路是调整各层的激活值分布使其拥有适当
的广度。为此,要向神经网络中插入对数据分布进行正规化的层,即Batch
Normalization 层(下文简称Batch Norm层),如图6-16 所示。
Batch Norm,顾名思义,以进行学习时的mini-batch 为单位,按minibatch
进行正规化。具体而言,就是进行使数据分布的均值为0、方差为1 的
正规化。用数学式表示的话,如下所示。
μ B ← 1 m ∑ i = 1 m x i \mu_B \leftarrow \frac{1}{m} \sum_{i=1}^m x_iμB←m1i=1∑mxi
σ B 2 ← 1 m ∑ i = 1 m ( x i − μ B ) 2 \sigma_B^2 \leftarrow \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2σB2←m1i=1∑m(xi−μB)2
x ^ i ← x i − μ B σ B 2 + ϵ \hat{x}_i \leftarrow \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}x^i←σB2+ϵxi−μB
这里对mini-batch 的m个输入数据的集合B = x 1 , x 2 , . . . , x m B = {x_1, x_2, . . . , x_m}B=x1,x2,...,xm求均值
μB 和方差$\sigma_B^2 \leftarrow \frac{1}{m} $。然后,对输入数据进行均值为0、方差为1(合适的分布)的
正规化。式(6.7)中的ε 是一个微小值(比如,10e-7等),它是为了防止出现
除以0 的情况。
式(6.7)所做的是将mini-batch 的输入数据x 1 , x 2 , . . . , x m {x_1, x_2, . . . , x_m}x1,x2,...,xm变换为均值为0、方差为1 的数据,非常简单。通过将这个处理插入到
激活函数的前面(或者后面)A,可以减小数据分布的偏向。
接着,Batch Norm层会对正规化后的数据进行缩放和平移的变换,用
数学式可以如下表示。
y i ← γ x ^ i + β y_i \leftarrow \gamma \hat{x}_i + \betayi←γx^i+β
这里,γ 和β 是参数。一开始γ = 1,β = 0,然后再通过学习调整到合
适的值。
上面就是Batch Norm的算法。这个算法是神经网络上的正向传播。如
果使用第5 章介绍的计算图,Batch Norm可以表示为图6-17。
Batch Norm的反向传播的推导有些复杂,这里我们不进行介绍。不过
如果使用图6-17的计算图来思考的话,Batch Norm的反向传播或许也能比较
轻松地推导出来。Frederik Kratzert 的博客“Understanding the backward
pass through Batch Normalization Layer”[13] 里有详细说明,感兴趣的读者
可以参考一下。
Batch Normalization的评估
现在我们使用Batch Norm 层进行实验。首先,使用MNIST数据集,观察使用Batch Norm层和不使用Batch Norm层时学习的过程会如何变化(源
代码在ch06/batch_norm_test.py中),结果如图6-18 所示。
从图6-18 的结果可知,使用Batch Norm后,学习进行得更快了。接着,
给予不同的初始值尺度,观察学习的过程如何变化。图6-19 是权重初始值的
标准差为各种不同的值时的学习过程图。
我们发现,几乎所有的情况下都是使用Batch Norm时学习进行得更快。
同时也可以发现,实际上,在不使用Batch Norm的情况下,如果不赋予一
个尺度好的初始值,学习将完全无法进行。
综上,通过使用Batch Norm,可以推动学习的进行。并且,对权重初
始值变得健壮(“对初始值健壮”表示不那么依赖初始值)。Batch Norm具备
了如此优良的性质,一定能应用在更多场合中。