1.8 【王小草深度学习笔记】RNN的梯度弥散 Vanishing gradients with RNNs

课程来源:吴恩达 深度学习课程 《序列模型》
笔记整理:王小草
时间:2018年4月10日


前面我们介绍了RNN的结构,前向传播与反向传播,RNN在命名实体、语言模型中的应用,这一节要讲述在构建RNN中会遇到的一个问题:梯度弥散问题。本节讲述什么是梯度弥散,后面几节会讲述如何解决这个问题。

1.什么是梯度弥散

首先来看传统的深层神经网络:
这里写图片描述
假设这个网络很深,有1000层甚至更多,那么经过前向传播得到输出层的y之后,很难再通过梯度下降法将y的梯度传播回去,即后面的梯度很难影响前面的权重。

对于RNN也是同样的道理,你已经很熟悉RNN的结构了:

假设有两个训练样本,句子的长度非常长:
The cat, with already ate…………, was full.
The cats, with already ate…………, where full.
第一个句子的was是依赖于cat, 第二个were是依赖于cats,但是这两个单词被隔得非常远,以至于后者的单词很难依赖于前者得到。

因为,与传统的深层神经网络类似,经过前向传播之后,反向传播中后面的y<t>误差很难通过梯度影响到前面层的计算,因此当RNN在计算后面的单词was还是were的时候,对前面出现过的cat或cats已经忘得差不多了。

也因此,其实每次的输出y<t>只能反向传播影响到前面附近的几层计算,也就是说,在训练时无论y<t>的预测是正确的还是错误的,或者说损失是大是小,都无法通过反向传播告诉很前面的层,并且对前面的层有效调整权重。

是基本的RNN算法的一个缺点,但是表担心,接下去的几节会详细讲述解决这个问题的方法。

2.梯度爆炸exploding gradients

除了梯度弥散的问题,RNN也会遇到梯度爆炸的问题,但这个问题比较好解决,因此在这里顺带讲述。

如何发现梯度爆炸?
梯度爆炸很好发现,因为指数极大的梯度,会让你的参数变得极其大,以至于你的网络参数奔溃,你会看到很多NaN或者不是数字的情况,这说明你的网络出现了数值溢出。

如何解决梯度爆炸?
当发现梯度爆炸时,一个解决方式就是梯度修剪。
观察你的梯度向量,一旦发现超过某个阀值,就缩放梯度向量,保证他不会太大。比如通过一些最大值来修剪的方法

猜你喜欢

转载自blog.csdn.net/sinat_33761963/article/details/80088957