通俗易懂的RNN与梯度问题(梯度爆炸/梯度消失)

1. 简述语言模型

现在的语言模型使用很广泛。最常见的应用之一,就是各种输入法的预测输入。比如,当用户输入一段文字之后,输入法会自动的预测用户可能想要输入的内容。再比如,所搜引擎当我们输入前一两个词的时候,他可以推测出你可能想要输入什么,如下图所示:
在这里插入图片描述
语言模型试图找出输入句子之中,每一个词之间的依赖关系。换一句话来说,当模型看到了词A,它能够计算出在整个字典中的每一个词出现在下一个位置的概率。那么一个语言模型怎么用数学来表示?

在这里插入图片描述
上述公式中, x i x_i xi, i = i= i={1,2,3…n} 表示的是一句话中的n个词,可以看出,语言模型的数学解释可以表示成,一句话中所有词的联合概率分布。除此之外,我们也可以看出,每一个词语的出现的概率都和前面所出现的词的概率相关。意味着我们所创建的网络需要有能力处理一个时序输入。使用 t − 1 t-1 t1时刻的输出,作为 t t t时刻的输入。那么一般的神经网络能不能处理这种情况呢?前馈神经网络理论上是可以拟合所有的函数,自然也可以拟合上述的情况。具体的,我们可以将句子中的每一个词做一系列的编码(可以用一些embeding 技术,e.g. word2vector),将一句话变成一个向量 x。然后将这个向量输入到一个全连接网络中,与隐层的权重矩阵W相乘,得到一组向量x1,再将x1 与 另一个矩阵U相乘得到一个与字典长度一致的向量x2x2 中包含的是字典中所有的词出现在预测位置的概率。采取这样的方法也是可以进行预测的。但是问题在于如果我们要预测的文本特别长,会导致运算量特别大。所以通常我们不会依赖全文来对某一个位子的词进行预测,而是取预测位置之前的N个词。这个N个词就叫做fixed-window。整个过程叫做 fixed-window based neural Language model. 下图很清晰的阐述使用一般的神经网络怎么了做到词的预测。在这里插入图片描述
但是通过上述的方式来对文本进行预测,我们只能根据fixed-window所提供的信息来进行预测。比如图中所阐述的,我想要预测“看”后面的词,网络只会根据“张三”,“喜欢”,“看”,这三个词来进行预测。忽略了前面的词语所提供的信息。除此之外,如果我们加大fixed-window的尺寸,参数W的尺寸也会增大,换一句话说就是输入的长度会影响到整个模型的复杂度(参数越多,模型越复杂)。而且,由于window的大小是固定的,所以我们每一次只能处理固定长度的输入,而我们希望的是一个模型可以处理任意长度的输入。 RNN就可以用来解决这样的问题。

2. Vanilla-RNN 工作原理

下图展现的是 RNN的一个基本模型:
在这里插入图片描述
经过embeding之后, e t = E x 1 , t = e_t=Ex_1, t= et=Ex1,t={1,2,3}。图中 h 0 h_0 h0是指的一个初始化的hidden state,每一层所发生的事情就是将 e i e_i ei乘上一个权重矩阵We输入到对应时刻的hidden state中,然后再与上一个时刻的hidden state的输出相加再加上偏置,并经过一个激活函数 σ \sigma σ,就得到了是当前时刻的hidden state的输出,可以表示成 h t = σ ( W h h t − 1 + W e e t + b ) h_t =\sigma(W_hh_{t-1}+W_ee_t+b) ht=σ(Whht1+Weet+b)。 然后依次类推,直到最后一个hidden state,它输出的也是字典中所有词可能出现在当前位置的概率,如图中绿色圆圈所示。

我们应该怎么来理解这个模型?其实RNN模拟了一个人看书的过程,我们看完一本书,绝大多数的人是不可能记住书中的每一个字的,但是我们可以知道这一本书到底在讲些什么。同样我们可以把每个时刻的hidden state 理解成模型当前的记忆,然后通过 h t h_t ht的方式将以前的记忆和当前新读入的内容进行整合。那么最后一个时刻的Hidden state的输出我们就可以理解成是模型对整个文本的一个压缩理解。基于整片文章的理解来对某一个空进行预测的效果一定好于基于片面的几个词作出的预测效果要好。除此之外,我们可以发现在表达式中,权重矩阵 W h W_h Wh W e W_e We会被一直重复使用,这也是RNN可以处理任意长度输入的原因之一,因为输入的尺寸,不再会影响模型的复杂度了。

3. 递归神经网络存在的问题

虽然说RNN在处理时序数据的效果要好于一般的前馈神经网络(全连接网络也好,卷积网络也罢),但是它基本不会用于真实的工业生产中,为什么?它存在这什么致命的问题?这个问题的出现意味着什么?RNN的致命问题就是梯度的爆炸和消失。一个基于梯度来进行优化的网络,如果梯度出现了问题,可想而知,这个网络的学习能力和表现都会受到严重的影响,梯度决定了一个网络在学习的过程中参数改变。梯度爆炸所指的是一个网络的梯度无限大。梯度消失所指就是一个网络的梯度无限接近于0 。梯度爆炸和消失不是RNN的“专利”,在其他的前馈网络中也会出现,当网络的层数过大,或者选择了不恰当的激活函数都会导致梯度问题在前馈网络中的出现。但是在RNN中尤为的明显。

出现这样的梯度问题,对于RNN或者其他的前馈神经网络而言意味着什么呢??我们知道梯度的传播是从最后输出层开始向着输入进行传递的。假设梯度在第N层的时候消失,意味着第N层之前的网络就失去了学习的能力,因为他们的梯度已经是0了。即便这个网络一共有很多层,但是也只有最后的N层有学习的能力。相反的,梯度爆炸带来的问题是在第N层时的梯度无穷大,模型是永远无法收敛的。

3.1 梯度爆炸与梯度消失是怎么样产生的

只有找到问题发生的原因才可能针对性的处理。那么RNN中的梯度爆炸和消失是如何产生的呢?下面将给出数学推导。

首先我们先假设一个4层的RNN,也就是说误差是从第四层开始朝前传播的,既然误差从最后一层开始向前传播,那么我们可以通过链式法则,写出总损失对于RNN第1层的梯度:

在这里插入图片描述
那么我们可以根据上面这个例子,推导出一个更加有一般性的表达式:

在这里插入图片描述
上面的式子表示的是,第i层的损失对于第j层的偏导。 h t h_t ht代表着第t时刻的hidden state,同理 h t − 1 h_{t-1} ht1代表的是第 t − 1 t-1 t1个时刻的hidden state。那么根据我们RNN的前向传播的定义,我们可以写出 h t h_t ht h t − 1 h_{t-1} ht1之间的关系

在这里插入图片描述
其中的 σ \sigma σ是一个激活函数。我们可以看出来 ∏ i < t < j ∂ h t ∂ h t − 1 \prod_{i<t<j}\frac{\partial h_t}{\partial h_{t-1}} i<t<jht1ht他可以就是很多个偏导数的乘积,我们如果用雅可比矩阵来表示,可以得到:
在这里插入图片描述
h t h_t ht的表达式代入到上述式中,我们可以得到:

在这里插入图片描述

这个时候我们可以发现整个梯度完全取决于雅可比矩阵的值,严谨一点来说就是取决于雅可比矩阵的最大特征值。只要这个最大特征值大于1,哪怕是1.01,他都会随着传播层数的增多,呈指数增长,出现所谓的梯度爆炸的现象。相反若这个最大特征值小于1,就会呈指数减小,随着误差传播得越来越远,梯度无限趋近于0,从而出现梯度消失的现象。

以上就是在RNN中,梯度爆炸和梯度消失的主要原因。

3.2 针对梯度的数值问题有什么解决方案

对于梯度爆炸而言,我们可以通过将网络的梯度控制在一个合理的范围内来解决这个问题。Gradient clipping(梯度裁剪)就是其中一种用来控制梯度爆炸的方式。他的主要思想就是给网络的梯度一个阈值,一旦这个梯度超过这个阈值就将梯度等比例的减小,从而达到一个控制梯度的目的。所以这种方法的思想是很容易理解的。Gradient clipping 可以用数学表达成:

在这里插入图片描述

然而对于梯度消失而言,相对不太好解决。梯度消失的问题可以通过修改模型或者残差训练的方式来进行改善。但是我们看到在最经典的vanilla-RNN中,我们发现 h t − 1 h_{t-1} ht1会被不停的覆盖,也就是说,模型的记忆会被一直改写。 如果我将模型的记忆分开,会不会减小发生梯度消失的概率呢。这样的思路就是LSTM。

4. LSTM

LSTM也是RNN的一种,但是这种模型可以比较好的避免RNN的梯度数值问题的出现。但是LSTM不能保证梯度消失的情况不出现!

LSTM 也是基于 t − 1 t-1 t1时刻的hidden state 来计算 t t t 时刻的 hidden state。但是在LSTM中,引入了各种(gate)门和cell(记忆单元)的概念,来合理的组合 “旧记忆” 和 “新记忆”。也就是说,这些所谓的门决定了哪些信息网络可以忘掉(被擦除),哪些可以留下(传到下一个hidden state中)。

在LSTM中,t时刻的hidden state 的输入取决于 c ( t − 1 ) c^{(t-1)} c(t1)(t-1 时刻的cell),所谓的cell(记忆单元)就是旧记忆和新记忆的组合。那么 t t t时刻的记忆单元可以表示成:

在这里插入图片描述
其中 f ( t ) f^{(t)} f(t)叫做forget gate (遗忘门),它主要用来决定有多少旧的信息要被遗忘, c ~ ( t ) \widetilde{c}^{(t)} c (t)则指的新记忆单元(New cell content),也就是新的输入中有哪些信息。 i ( t ) i^{(t)} i(t) (input gate) 则是用来决定当前新输入中有多少信息需要被记住。 ⊙ \odot 指的是element-wise product。他们的表达式如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们可以发现以上三个表达式都是大同小异,只是参数和激活函数发生了变化。在组合了新旧记忆之后。我们将组合之后的记忆输入到tanh激活函数中,并将输出中的重要信息提取出来,作为 t 时刻hidden state 的输出。所以 h ( t ) h^{(t)} h(t)可以表示成:

在这里插入图片描述

LSTM 通过这样的设计,可以让网络学习到更久远的记忆,也就是说,当序列与序列的距离很大时,它有能力学习到这种长期依赖关系。说的通俗一点,它有能力理解上下文。

5.总结

RNN对于序列数据的处理表现理论上要好于一般的前馈网络,但是它存在着致命的梯度问题。梯度问题的出现直接限制了网络的学习能力。通过加深网络深度来增大网络学习能力的方法自然会因为梯度消失的出现而失效。使用LSTM理论上可以大概率的避免RNN梯度问题的出现,但是他无法保证可以杜绝这种现象的发生。

  • 15
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值