深度学习:梯度消失和梯度爆炸
几种RNNs并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
问题
几种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:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)