问题

几种RNNs并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。

梯度消失

主要是因为网络层数太多,太深,导致梯度无法传播。本质应该是激活函数的饱和性。

梯度爆炸

梯度爆炸的时候,我们的程序会收到NaN错误。即DNN结果出现nan值?梯度爆炸,导致结果不收敛。

如在tf中运行到self.train_op = layers.optimize_loss(self.loss, tf.train.get_global_step(), optimizer=self.optimizer, learning_rate=self.learning_rate, clip_gradients=self.clip_norm)时出错:Found Inf or NaN global norm. : Tensor had NaN values

出错可能:

1 输入数据存在nan,需要run部分数据,或者通过tf.Print输出进入模型的features看看。

2 可能就是batch_size/学习率过大

[深度学习:学习率及如何调整]

[神经网络中的激活函数 ]

原因

前馈神经网络的梯度消失和爆炸

前馈神经网络(包括全连接层、卷积层等)可以表示为 ,那么网络输出对 W1 求偏导 ,这里 是相互独立的,一般不会有数值问题,主要问题在于激活函数的导数 f'在饱和区接近于零,导致梯度消失。

[神经网络训练中的梯度消失与梯度爆炸 - 知乎]

RNN网络中的梯度消失和爆炸

RNN的统一定义为    ht=f(xt,ht−1;θ)            (1)
其中ht是每一步的输出,它由当前输入xt和前一时刻输出ht−1共同决定,而θ则是可训练参数。在做最基本的分析时,我们可以假设ht,xt,θ都是一维的,这可以让我们获得最直观的理解,并且其结果对高维情形仍有参考价值。之所以要考虑梯度,是因为我们目前主流的优化器还是梯度下降及其变种,因此要求我们定义的模型有一个比较合理的梯度。我们可以求得:

 所以步数多了,梯度消失或爆炸几乎都是不可避免的,我们只能对于有限的步数去缓解这个问题。

RNN中梯度消失的含义:距离当前时间步越长,那么其反馈的梯度信号越不显著,最后可能完全没有起作用,这就意味着RNN对长距离语义的捕捉能力失效了。

[也来谈谈RNN的梯度消失/爆炸问题 - 科学空间|Scientific Spaces

[偏导的链式法则]

[零基础入门深度学习(5) - 循环神经网络][2.1 剃度弥散及梯度爆炸问题]

Lstm的梯度消失和爆炸

如果我们的任务比较依赖于历史信息,那么“遗忘门”ft就会接近于1,这时候历史的梯度信息也正好不容易消失;如果ft很接近于0,那么就说明我们的任务不依赖于历史信息,这时候就算梯度消失也无妨了。

Gru的梯度消失和爆炸

ref 推导和理论[也来谈谈RNN的梯度消失/爆炸问题]

解决方案

共同方案

        bn [Batch-normalized 应该放在非线性激活层的前面还是后面?]。

梯度消失

1、改进模型。使用RNNs时,使用比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU)。残差网络。

2、合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。

3、使用relu代替sigmoid和tanh作为激活函数。[Batch-normalized 应该放在非线性激活层的前面还是后面?]

梯度爆炸解决

1、权重衰减。减小学习率、减小batch size;可以通过减小学习率(梯度变化直接变小)、减小batch size(累积梯度更小)、 features规格化(避免突然来一个大的输入)。
2、加入gradient clipping;设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
3、数据归一化(减均值,除方差,或者加入normalization,例如BN、L2 norm等)。
4、更换参数初始化方法(对于CNN,一般用xavier或者msra的初始化方法)。

[梯度裁剪及其作用 | 吴良超的学习笔记]
5、RNN用tanh而不是relu的主要目的就是缓解梯度爆炸风险。当然,这个缓解是相对的,用了tanh依然有爆炸的可能性。

[训练深度学习网络时候,出现Nan是什么原因,怎么才能避免? - 知乎]

from: 深度学习:梯度消失和梯度爆炸_-柚子皮-的博客-CSDN博客

ref:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐