NNDL 实验七 循环神经网络(2)梯度爆炸实验

6.2 梯度爆炸实验

造成简单循环网络较难建模长程依赖问题的原因有两个:梯度爆炸梯度消失

梯度爆炸问题:比较容易解决,一般通过权重衰减梯度截断可以较好地来避免;

梯度消失问题:更加有效的方式是改变模型,比如通过长短期记忆网络LSTM来进行缓解。


本节将首先进行复现简单循环网络中的梯度爆炸问题,然后尝试使用梯度截断的方式进行解决。

采用长度为20的数据集进行实验,

训练过程中将进行输出W,U,b的梯度向量的范数,以此来衡量梯度的变化情况。

6.2.1 梯度打印函数

在训练过程中打印梯度

分别定义W_listU_listb_list,用于分别存储训练过程中参数W,U和b的梯度范数

【思考】什么是范数,什么是L2范数,这里为什么要打印梯度范数?

6.2.2 复现梯度爆炸现象

为了更好地复现梯度爆炸问题,使用SGD优化器将批大小学习率调大,学习率为0.2,同时在计算交叉熵损失时,将reduction设置为sum,表示将损失进行累加。 

获取训练过程中关于W,U和b参数梯度L2范数,并将其绘制为图片以便展示。

因为Tanh为Sigmoid型函数,其饱和区的导数接近于0,

由于梯度的急剧变化,参数数值变的较大或较小,容易落入梯度饱和区,导致梯度为0,

模型很难继续训练.

在这里插入图片描述 

6.2.3 使用梯度截断解决梯度爆炸问题

梯度截断是一种可以有效解决梯度爆炸问题的启发式方法,

当梯度的模大于一定阈值时,就将它截断成为一个较小的数。

一般有两种截断方式:按值截断按模截断

本实验使用按模截断的方式解决梯度爆炸问题。

NNDL 实验七 循环神经网络(2)梯度爆炸实验_第1张图片

在飞桨中,可以使用paddle.nn.ClipGradByNorm进行按模截断.--- pytorch中用什么?

在代码实现时,将ClipGradByNorm传入优化器,优化器在反向迭代过程中,每次梯度更新时默认可以对所有梯度裁剪。 

引入梯度截断之后,将重新观察模型的训练情况。

【思考题】梯度截断解决梯度爆炸问题的原理是什么?

不要照抄课本,用自己的话解释一下。


 ref:

NNDL 实验6(上) - HBU_DAVID - 博客园 (cnblogs.com)

NNDL 实验6(下) - HBU_DAVID - 博客园 (cnblogs.com)

8. 循环神经网络 — 动手学深度学习 2.0.0-beta1 documentation (d2l.ai)

9. 现代循环神经网络 — 动手学深度学习 2.0.0-beta1 documentation (d2l.ai)

你可能感兴趣的:(DeepLearning,rnn,深度学习,人工智能)