深度学习视频理解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2.2 梯度爆炸与梯度消失

虽然理论上 RNN 可以捕获长距离依赖,但实际应用中,RNN 将会面临两个挑战:梯度爆炸(Gradient Explosion)和梯度消失(Vanishing Gradient),这使得 RNN 实际学习长距离依赖很难(Bengio et al.,1994)。

我们考虑一种简单情况,即激活函数是恒等(Identity)变换,此时

img

(2.17)

在进行误差反向传播(Error Backpropagation)时,当我们已知损失函数imgimg时刻隐状态向量img的偏导数img时,利用链式法则,我们计算损失函数img对初始时刻隐状态向量img的偏导数:

img

(2.18)

我们可以利用RNN的依赖关系,沿时间维度展开,来计算img

img

(2.19)

其中,img表示矩阵img次幂,注意不是矩阵的转置。从式(2.19)可以看出,在误差反向传播时,我们需要反复乘以参数矩阵img

由于矩阵img通常是由随机初始化训练得到的,所以img的特征向量(Eigenvector)通常是独立的。因此,可以对矩阵img进行对角化:

img

(2.20)

其中

img

(2.21)

img表示对角矩阵,令

img

(2.22)

因此,

img

(2.23)

那么最后要计算的目标为

img

(2.24)

img很大时,该偏导数取决于矩阵img对应的对角矩阵的最大值img是大于1 还是小于1,要么结果太大,要么结果太小:

(1)梯度爆炸。当img时,img,那么

img

(2.25)

此时偏导数img将会变得非常大,在实际训练时将会遇到NaN错误,会影响训练的收敛,甚至导致网络不收敛。这好比要把本国的产品卖到别的国家,结果被层层加了关税,等到了别国市场的时候,价格已经变得非常高,老百姓根本买不起。在RNN中,梯度(偏导数)就是价格,随着向前推移,梯度越来越大。这种现象称为梯度爆炸。

梯度爆炸相对比较好处理,可以用梯度裁剪(Gradient Clipping)(Goodfellow et al.,2016)来解决。当梯度的范数(Norm)大于某个阈值时,我们人为地给梯度乘以一个缩放系数,使得梯度的范数在我们希望的阈值内。这好比是不管前面的关税怎么加,设置一个最高市场价格,通过这个最高市场价格保证老百姓是买得起的。在RNN中,不管梯度回传的时候梯度范数大到什么程度,设置一个梯度的范数的阈值,梯度的范数最多是这么大。

(2)梯度消失。当img时,img,那么

img

(2.26)

此时偏导数img将会变得十分接近 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的关键是会选择性地忽略其中一些词,不让其参与到隐层状态向量的更新中,最后只保留相关的信息进行预测。