有篇论文对于Batch Normalization(BN)如何加快网络的训练过程提出了新的看法,该论文为《How Does Batch Normalization Help Optimization?》
Internal Covariate Shift
首先说说BN提出来是针对什么问题的。BN那篇论文针对的问题是Internal Covariate shift (ICS),具体地说,在训练过程中,前面网络层参数的更新会改变当前网络层的优化问题。前面网络层参数变化前和变化后,当前网络层的参数的最优解会发生变化!即当前网络层的优化问题改变了。变化前当前网络层计算得到的梯度就不正确,这就会影响训练的效率。可能BN的作者研究时发现前面网络层参数改变之后,当前网络的输入数据同时发生改变,换句话说,输入数据的分布发生改变,于是,BN的作者就把ICS问题与输入数据的分布稳定性等同起来。为了保证输入数据的分布稳定,BN层就被提出来了。
BN的成功没有减轻ICS问题
论文《How Does Batch Normalization Help Optimization?》通过实验惊讶地发现,BN的有效性并不是因为解决了ICS问题。
先来看看论文做了什么实验。BN不是把输入数据的分布变得稳定吗?那好,我就把BN的输出数据加点噪声,使得输出的数据的分布有很大的变动。大家猜猜结果怎么样?结果肯定不是我们认为的训练效果变差,而是加了噪声的BN和BN训练效果一样,比不加BN的训练效果好很多。
右边表示加了噪声的BN的输出数据不稳定,左边表示加了噪声的BN和BN的训练效果几乎一样,都不不加BN的好。
所以BN的表现和ICS没有关系。
ICS的量化定义
为了研究ICS和BN的关系,论文量化了ICS的影响程度,给出如下定义:
令
L
\mathcal{L}
L为损失函数,
W
1
(
t
)
,
⋯
 
,
W
k
(
t
)
W_1^{(t)}, \cdots, W_k^{(t)}
W1(t),⋯,Wk(t)是k层网络层的每一层参数,
(
x
(
t
)
,
y
(
t
)
)
(x^{(t)}, y^{(t)})
(x(t),y(t))是第t次迭代的输入。定义激活值i的ICS再第t次迭代的值为
∥
G
t
,
i
−
G
t
,
i
′
∥
2
\lVert G_{t,i} - G'_{t,i} \rVert_2
∥Gt,i−Gt,i′∥2,其中
G
t
,
i
=
∇
W
i
(
t
)
L
(
W
1
(
t
)
,
⋯
 
,
W
k
(
t
)
;
x
(
t
)
,
y
(
t
)
)
G
t
,
i
′
=
∇
W
i
(
t
)
L
(
W
1
(
t
+
1
)
,
⋯
 
,
W
i
−
1
(
t
+
1
)
,
W
i
(
t
)
,
W
i
+
1
(
t
)
,
⋯
 
,
W
k
(
t
)
;
x
(
t
)
,
y
(
t
)
)
\begin{aligned} G_{t,i} &= \nabla_{W_i^{(t)}} \mathcal{L}(W_1^{(t)}, \cdots, W_k^{(t)};x^{(t)}, y^{(t)}) \\ G'_{t,i} &= \nabla_{W_i^{(t)}} \mathcal{L}(W_1^{(t+1)}, \cdots, W_{i-1}^{(t+1)}, W_i^{(t)},W_{i+1}^{(t)}, \cdots, W_k^{(t)};x^{(t)}, y^{(t)}) \end{aligned}
Gt,iGt,i′=∇Wi(t)L(W1(t),⋯,Wk(t);x(t),y(t))=∇Wi(t)L(W1(t+1),⋯,Wi−1(t+1),Wi(t),Wi+1(t),⋯,Wk(t);x(t),y(t))
G
t
,
i
G_{t,i}
Gt,i表示第i层网络层前面的网络层更新参数前第i层网络层的梯度,
G
t
,
i
′
G'_{t,i}
Gt,i′表示第i层网络层前面的网络层更新参数后第i层网络层的梯度。
G
t
,
i
G_{t,i}
Gt,i和
G
t
,
i
′
G'_{t,i}
Gt,i′的不同反映了第i层网络层输入的改变导致第i层网络层的优化问题的改变(如果优化函数是单变量函数,想想损失曲线,损失曲线会发生改变;如果优化函数是2变量函数,想想损失曲面,损失曲面会发生改变),优化问题的改变导致最优解的改变。
如果第i层网络层的优化问题没有太大的改变,那么前面网络层更新参数前和更新参数后,第i层网络层使用同样的参数计算出来的梯度不会有太大的不同, G t , i G_{t,i} Gt,i和 G t , i ′ G'_{t,i} Gt,i′的相关性应该高。
假设前面网络层更新参数前,第i层网络层参数(假设是一维的)和损失
L
\mathcal{L}
L的函数曲线是
前面网络层更新参数后,如果第i层网络层的优化问题没有太大的改变,即没有受到ICS的影响,那么第i层网络层计算得到的新梯度和原来的没有太大的变化
但是,当网络层受到ICS的影响,它的参数-损失曲线会发生变化,进而梯度发生很大的变动,如下图所示
这种网络层本身的优化问题的改变,导致最优解的改变,从而使得之前得到的梯度都不能指向全局的最优解,所以网络在梯度下降过程中训练得很慢。
我们希望提高
G
t
,
i
G_{t,i}
Gt,i和
G
t
,
i
′
G'_{t,i}
Gt,i′的相关性,那么BN能不能提高呢?论文进行了实验,结果如下
论文比较网络加了BN和不加BN的
G
t
,
i
G_{t,i}
Gt,i和
G
t
,
i
′
G'_{t,i}
Gt,i′的不同,论文使用
G
t
,
i
G_{t,i}
Gt,i和
G
t
,
i
′
G'_{t,i}
Gt,i′的cosine夹角和l2不同(l2距离)进行比较。右边小图的上半部分是l2不同,下半部分是cosine夹角。上图说明BN不仅不能减轻ICS,反而增加了ICS。
BN的平滑影响
既然BN没有解决ICS问题,那么BN为什么训练效果那么好呢?论文给出的答案是BN的平滑影响。BN在优化问题下的重新参数化(reparametrization)使得优化函数的变得更平滑了。平滑的定义是损失函数满足利普希茨连续(Lipschitz continuity)(详情请查看百度、维基百科等),简单地说就是函数的变化幅度不会太大。这就是说,损失以更小的速率改变,梯度的变化幅度也更小。也就是BN的重新参数化使得梯度变化得更平滑。
平滑性影响在影响训练表现的所有因素中占主要位置。论文解释说,想想一个标准的神经网络,它的损失函数不是凸函数,而且损失函数有许多平缓的区域、损失值剧变的区域,很多局部最小值区域。这些区域使得基于梯度的训练算法不稳定,常常导致梯度消失和梯度爆炸,所以对学习率和参数初始化很敏感。
BN的重新参数化使得梯度更加可靠和更容易预测。梯度的利普希茨连续性给了我们很大的信心使得我们在计算得到的梯度方向上移动一大步,移动之后,梯度的方向仍然接近实际的梯度方向,保证了参数往最优解的方向靠近。这就允许我们的梯度下降算法使用更大的学习率,使得训练过程变快,算法对超参数的选择不敏感。
如何证明BN的平滑性呢?论文使用两种方法,一种是实验查看梯度的变化情况,另一种是数学公式推导(我看不懂-_-!)。
怎么观察BN的平滑性影响呢。论文是这样做的,在参数一个梯度方向上移动,同时记录损失值的变化和参数梯度变化(l2不同)情况,还有“effective”
β
\beta
β-smoothness,它是指把参数在梯度方向上移动一定距离,每个位置上都得到新梯度,这些梯度的最大的不同。实验结果如下
可以看到,加了BN的网络损失值和梯度的变化比没加BN的网络要低,说明BN的平滑性影响使得梯度变化的更平稳,更平滑。