On the difficulty of training Recurrent Neural Networks

来源:互联网 发布:淘宝手工丝网印刷油漆 编辑:程序博客网 时间:2024/05/23 19:22

1 摘要

关于正确训练循环神经网络有两个常见的问题,梯度消失和梯度爆炸。 在本文中,我们试图通过从分析,几何和动态系统的角度探索这些问题来提高对潜在问题的理解。 我们的分析被用来证明一个简单而有效的解决方案。 我们提出梯度范数裁剪策略来处理爆炸梯度和消失梯度问题的软约束。 我们验证了我们的假设,并在实验部分提出了解决方案。

2.前言

RNN网络的结构与标准多层感知器的结构类似,区别在于我们允许隐藏单元之间的连接与时间延迟相关联。 通过这些连接,模型可以保留关于过去输入的信息,使其能够发现在数据中可能彼此远离的事件之间的时间相关性(对于正确学习时间序列来说关键性的属性)。尽管循环神经网络是一个简单而且强大的模型,实际上,他很难被正确的训练出来。主要原因就是梯度消失和梯度爆炸。

2.1训练循环神经网络

公式(1)给出一个通用的递归神经网络,输入为u(t)和时间步长t的状态x(t)。 在本文的理论部分,我们有时会利用公式(2)给出的具体参数来提供关于平常使用情况的更精确的条件和直觉。


模型的参数由递归权重矩阵Wrec,偏差b和输入权重矩阵Win给出,一般情况下用θ收集。 x0由用户提供,设置为零或学习,σ是一个element-wise 函数(通常是tanh或sigmoid)。 成本E衡量网络对某个给定任务的性能,可以分解为每一步的单独成本。

BPTT是一个可以用来计算梯度的方法,其中递归模型被表示成深层多层模型(具有无限数量的层数),并且在展开模型上用反向传播。


为了更好的突出梯度爆炸问题,我们改变传统的BPTT方程,重写梯度公式。这些方程是通过积和方式写入梯度获得的。


公式说明(公式不好打)



解释:

方程(3)中相加的每个项具有相同的形式,这些单项的行为决定了总和的行为。 今后,我们将把重点放在这个单项上,并把它称之为梯度(在没有混淆的情况下)。

方程(4)使用链式法则,引入方程(2),文章中解释链式最后一项中,由于x(k-1)对cita是常数,所以用x(k)对cita的导数代替整体的。

方程(5)引入jscobian矩阵


公式(3)任何梯度分量也都是一个和,其术语我们称之为时间贡献或时间分量。公式(4)展示了每个时间分量测量了在第k步的cita是怎样影响t大于k步的损失的。公式(5)把第t步时的错误及时传回了第k步。

2 梯度消失和梯度爆炸

梯度消失指的是在训练的时候,梯度的范数出现很大的增加,这些事件是由于长期构成要素的爆炸式增长而引起的。梯度消失则相反,当长期构成要素快速到0,使得模型学不到时间长的信息。

2.1原理

如果我们考虑模型的线性版本(即将σ设置为方程(2)中的恒等函数),我们可以使用功率迭代法对雅可比矩阵乘积进行形式化分析,并获得当梯度爆炸或消失时的紧密条件 请参阅补充材料以详细推导这些条件)。对于长期分量消失(t趋于无穷),递归权重矩阵的最大特征值λ1小于1是足够的,并且对于梯度要爆炸而言它是大于1是必要的。



雅克比矩阵中的2范数(你可以认为是绝对值)上限是1。tanh(或者sigmoid)激活函数将所有的值映射到-1到1这个区间,导数的范围在0到1这个区间(sigmoid是0到 14 这个区间),如下图所示:


你可以看到tanh和sigmoid函数在两端导数均为0。它们逐渐成为一条直线,当这个现象发生时,我们就说相应的神经元已经饱和了。它们的梯度为0,驱动前一层的其它梯度也趋向于0。因此,矩阵中有小值,并且经过矩阵相乘(t - k次),梯度值快速的以指数形式收缩,最终在几个时刻之后完全消失。较远的时刻贡献的梯度变为0,这些时刻的状态不会对你的学习有所贡献:你最终以无法学习到长期依赖而结束。梯度消失不仅仅出现在循环神经网络中。它们也出现深度前馈神经网络中。它仅仅是循环神经网络趋向于很深(在我们这个例子中,深度与句子长度一样),这将会导致很多问题。

依赖于我们的激活函数和网络参数,如果雅克比矩阵的值非常大,我们没有出现梯度消失,但是却可能出现梯度爆炸。这就是梯度爆炸问题。梯度消失问题比梯度爆炸问题受到更多的关注,主要有两个原因:1)梯度爆炸很明显,你的梯度将会变成Nan(不是一个数字),你的程序将会挂掉;2)在预定义阈值处将梯度截断是一种简单有效的方法去解决梯度爆炸问题。梯度消失问题更加复杂是因为它不明显,如论是当它们发生或者如何处理它们时。

幸运的是,目前已经有了一些缓解梯度消失问题的方法。对矩阵 W 合理的初始化可以减少梯度消失的影响。也可以加入正则化项。一个更好的方案是使用 ReLU而不是tanh或者sigmoid激活函数。ReLU函数的导数是个常量,要么是0,要么是1,所以它不太可能出现梯度消失。更加流行的方法是使用长短时记忆(LSTM)或者门控循环单元(GRU)架构。LSTM是在 1997年提出,在NLP领域可能是目前最为流行的模型。GRU是在2014年提出,是LSTM的简化版。这些循环神经网络的设计都是为了处理梯度消失和有效学习长期依赖。我们将会在后面的博文中介绍。





阅读全文
0 0