本节课内容概述:
- 本节课主要解释了梯度消失和梯度爆炸问题以及其他类型的RNN
- 上节课将的是RNN以及为什么RNN适用于语言模型。
- 因为它可以记住前面的信息。
- 梯度消失问题导致了新RNN的出现:LSTM和GRU
- 其他修复梯度消失或者梯度爆炸的方法:
- 梯度剪裁
- 跳过连接
- 其他更有趣的RNN:
- 双向RNN
- 多层RNN
首先是梯度消失问题:
应用RNN的时候,如果要求h1的梯度,则会应用链式法则求导,有可能会存在导数越求越小的情况,也就是梯度消失问题。
回忆一下RNN及求梯度的公式:
当求第j步中的梯度时,如果Wh很小,那么求Wh的(i-j)次幂则会更小,导致梯度很小。
如果Wh<1,会有梯度消失问题,Wh>1会有梯度爆炸问题。
为什么梯度消失会成为一个问题?
蓝色箭头的梯度会丢失,因为黄色箭头的梯度更大。
所以h1处的权重更新就会根据黄色箭头的梯度来更新,那么RNN的意义就没有了。因为RNN比起n-gram的优势就是可以利用远处的信息。
举个例子:
我们都知道横线处应该填的是ticket。用RNN进行预测得出来的也应该是ticket,这是根据第一句话的信息得出来的。但是如果RNN存在梯度消失问题,那么它就不能利用第一句话提供的信息,因为对它来说太远了。导致RNN不能利用较长距离的信息进行预测,只能利用较近距离的信息导致答案不准确。
为什么梯度爆炸是个问题?
梯度更新的公式如下:
模型参数是通过求梯度进行更新的,如果梯度太多,会导致θ更新幅度过大,从而轻易的到达INF或者NAN。
如下图所示。当到达一个梯度最大的时候,也就是在陡坡处,正确的参数位置应该是在坡低,但是由于梯度很大,参数更新就会一下子沿着左图的直线方向前进,远远超过了最佳梯度位置。
解决办法:梯度剪裁
如果求得的梯度大于某个阈值,在引用SGD训练优化之前先把梯度减小。方法如下:
RNN的主要问题是:难于保留过长信息。
隐藏状态被不断的重写
如果让RNN有单独的记忆呢?
LSTM:Long Short-Term Memory 长短期记忆
在步骤t,有一个隐藏层ht和一个细胞状态ct,两者的向量长度都为n
细胞c存储长期信息
LSTM从细胞中可以擦除,写和读信息
擦除,写和读的操作可以被三个相应的门控制:
门也是长度为n的向量
在每个步骤中,门可以关闭或者打开
门是动态的,基于当前环境进行改变
有一个输入序列xt,能计算出一个隐藏层状态序列ht,细胞状态ct。在步骤t,各个门和计算公式和解释如下:
- 遗忘门:控制是否忘记之前的细胞状态
- 输入门:控制新细胞的内容
- 输出们:控制细胞输出到隐藏层的内容
- 新细胞内容:根据输入xt产生的细胞的内容
- 细胞状态:使用遗忘门f控制是否忘记之前的细胞状态,使用输入门控制是否使用新产生的细胞内容
- 隐藏状态:从输出门中获得细胞内容
以下的图展示的LSTM的工作过程:
LSTM是如何解决梯度消失问题呢?
LSTM可以保存很多步以前的信息:
如果遗忘门f一直设置为1,那么信息就不会丢失。
虽然LSTM也不能保证没有梯度消失和梯度爆炸问题,但是它提供了一个简单的方式来学习长期依赖。
GRU :Gated Recurrent Units
作为LSTM的一个更简单的替代方案。
在每个时间步,有输入xt和隐藏状态ht,没有细胞状态。
- 更新门:控制隐层状态被更新还是保留上一个隐层状态。
- 重置门:控制之前的隐藏层状态是否被用于计算新的内容
- 新的隐层内容:重置门决定上一步的隐层是否被保留用以计算新的隐层以及使用当前输入内容计算新的隐层内容
- 隐层状态:更新门实时控制上一步的隐层状态是否被保留以及新的隐层状态内容是否应用于当前隐层状态。
LSTM和GRU的比较:
研究者们提出了许多RNN的不同版本,但是只有LSTM和GRU被广泛使用
GUR和LSTM的最大不同是,GRU计算速度更快而且参数更少
没有一定的结论说GRU和LSTM哪个更快
一般来说,LSTM是一个默认的选择,特别是如果数据有很长的依赖,或者有很多训练数据。
经验法则:如果想要更高效的计算,可以换成GRU
梯度消失或者梯度爆炸问题仅仅是RNN的问题吗?
不!它是所有神经架构的问题,包括前馈网络和卷积网络。特别是深度比较深的网络。
由于链式法则和非线性函数的使用,随着传播过程,梯度会消失
这样底层就会很难训练。
解决方案:许多新的前馈网络和卷积网络加了直接的连接
1、比如残差连接,也叫做ResNet,跳跃连接。
有一条线直接跳过了内部的层作为后面的层的输入,如上图所示,F(x)+x
2、比如说密集连接,也叫做DenseNet
将任意层的输出作为之后任意层的输入。
3、比如说高速公路连接,也叫做HightwayNet
和残差连接类似,但是连接的定义和转换的层被动态门控制
源于LSTM产生的,但是被应用于深度的卷积网络
结论:
RNN是不稳定的因为重复使用了相同的权重W
双向RNN
在下面的情感分类任务中,我们把隐层状态视为单词terribly的表示。成为上下文表示。但是这个上下文表示只包含左边部分的信息,不包含右边部分的信息。右边部分信息中的exciting能把terribly这个单词的感情色彩从消极的变成积极的。因为terribly有多个意思:”非常”、“可怕地”,如果不看右边的信息,就会可能把它理解为可怕地,而它真正的意思应该是”非常“
如下图所示,如果采用双向的RNN,那么terribly对应的上下文表示就可以获得左边和右边的信息
双向RNN的公式如下所示:
注意:
双向RNN仅适用于当有办法知道整个输入序列的时候,当只知道左边部分的信息的时候没有办法适用双向RNN,比如不适用与语言模型。但是如果知道完整信息,双向RNN就会很有用,比如bert模型。
多层RNN
RNN在一个维度上是很深的,也可以让它在另一个维度上也很深,这就是多层RNN。
这个将会让网络计算更复杂的表示。
低层次的RNN计算低层次的特征,高层次的RNN计算高层次的特征。
多层RNN也叫做堆叠RNN
- 高性能的RNN通常是多层的,但是没有前馈网络和卷积网络一样深。
- 2-4层的深度对于作为编码器的RNN来说是合适的,4层的深度对于解码器的RNN来说是合适的。
- 之前提到的跳跃连接和密集连接对于训练更深层次的RNN来说是必要的。
- 基于Transformer的网络能达到24层(bert模型)