2.2.2 梯度爆炸与梯度消失
虽然理论上 RNN 可以捕获长距离依赖,但实际应用中,RNN 将会面临两个挑战:梯度爆炸(Gradient Explosion)和梯度消失(Vanishing Gradient),这使得 RNN 实际学习长距离依赖很难(Bengio et al.,1994)。
我们考虑一种简单情况,即激活函数是恒等(Identity)变换,此时
(2.17)
在进行误差反向传播(Error Backpropagation)时,当我们已知损失函数对时刻隐状态向量的偏导数时,利用链式法则,我们计算损失函数对初始时刻隐状态向量的偏导数:
(2.18)
我们可以利用RNN的依赖关系,沿时间维度展开,来计算:
(2.19)
其中,表示矩阵次幂,注意不是矩阵的转置。从式(2.19)可以看出,在误差反向传播时,我们需要反复乘以参数矩阵。
由于矩阵通常是由随机初始化训练得到的,所以的特征向量(Eigenvector)通常是独立的。因此,可以对矩阵进行对角化:
(2.20)
其中
(2.21)
表示对角矩阵,令
(2.22)
因此,
(2.23)
那么最后要计算的目标为
(2.24)
当很大时,该偏导数取决于矩阵对应的对角矩阵的最大值是大于1 还是小于1,要么结果太大,要么结果太小:
(1)梯度爆炸。当时,,那么
(2.25)
此时偏导数将会变得非常大,在实际训练时将会遇到NaN错误,会影响训练的收敛,甚至导致网络不收敛。这好比要把本国的产品卖到别的国家,结果被层层加了关税,等到了别国市场的时候,价格已经变得非常高,老百姓根本买不起。在RNN中,梯度(偏导数)就是价格,随着向前推移,梯度越来越大。这种现象称为梯度爆炸。
梯度爆炸相对比较好处理,可以用梯度裁剪(Gradient Clipping)(Goodfellow et al.,2016)来解决。当梯度的范数(Norm)大于某个阈值时,我们人为地给梯度乘以一个缩放系数,使得梯度的范数在我们希望的阈值内。这好比是不管前面的关税怎么加,设置一个最高市场价格,通过这个最高市场价格保证老百姓是买得起的。在RNN中,不管梯度回传的时候梯度范数大到什么程度,设置一个梯度的范数的阈值,梯度的范数最多是这么大。
(2)梯度消失。当时,,那么
(2.26)
此时偏导数将会变得十分接近 0,从而使得参数在梯度更新前后没有什么区别,这会使得网络捕获长距离依赖的能力下降。这好比打仗的时候往前线送粮食,送粮食的队伍自己也得吃粮食。当补给点离前线太远时,还没等送到,粮食在半路上就已经被吃完了。在RNN中,梯度(偏导数)就是粮食,随着向前推移,梯度逐渐被消耗殆尽。这种现象称为梯度消失。
梯度消失现象解决起来要比梯度爆炸困难很多,如何缓解梯度消失是RNN 及几乎其他所有深度学习方法研究的关键所在。LSTM和GRU通过门控(Gate)机制控制 RNN中的信息流动,用来缓解梯度消失问题。其核心思想是有选择性地处理输入。比如我们看到一个商品的评论:
Amazing!This box of cereal gave me a perfectly balanced breakfast,as all things should be.In only ate half of it but will definitely be buying again!
我们会重点关注其中的一些词,对它们进行处理:
Amazing!This box of cereal gave me a perfectly balanced breakfast,as all things should be.In only ate half of it but will definitely be buying again!
LSTM和GRU的关键是会选择性地忽略其中一些词,不让其参与到隐层状态向量的更新中,最后只保留相关的信息进行预测。