2019年CS224N课程笔记-Lecture 7: Vanishing Gradients and Fancy RNNs

30 篇文章 8 订阅
28 篇文章 13 订阅

资源链接:https://www.bilibili.com/video/BV1r4411

本节课其实并没有介绍NMT/机器翻译,而是主要讲述了RNN的梯度爆炸/消失、LSTM、GRU、双向RNN、多层RNN等内容

正文

梯度消失/爆炸

根据链式法则,我们可以求出各个结点隐藏变量hi的梯度,可以发现,

  • 当这些梯度很小的时候,反向传播的越深入,梯度信号就会变得越来越小

距离最后结点越远的/i值越小的,其梯度是大量的相乘,这样如果之前的梯度都是很多大于1的,则相乘后会非常大/梯度爆炸;如果之前的梯度都小于1,则相乘后会非常小/梯度消失。

具体公式推导如下:

对于隐藏层变量hi来说:(ht就是hi的意思)

进行求导:

考虑第 i 步上的损失梯度 ,相对于第 j 步上的隐藏状态 

如果权重矩阵 Wh 很小,那么这一项也会随着 i 和 j 的距离越来越远而变得越来越小,也就是上述我们说的个消失问题

考虑矩阵的 L2 范数

这里的界限是1因为我们使用的非线性函数是 sigmoid,如果Wh的最大特征值大于1则会爆炸。

为什么梯度消失是大个问题?

来自远处的梯度信号会丢失,因为它比来自近处的梯度信号小得多。因此,模型权重往往根据近期效应而不是长期效应进行更新。另一种解释 :梯度可以被看作是过去对未来的影响的衡量标准。
如果梯度在较长一段距离内(从时间步 t 到 t+n )变得越来越小,那么我们就不能判断:

  • 在数据中,步骤 t 和 t+n 之间没有依赖关系
  • 我们用 错误的参数 来捕获 t 和 t+n 之间的真正依赖关系

消失梯度对RNN-LM(RNN的语言模型)的影响

以一个语言模型为例:为了从这个训练示例中学习,RNN-LM需要对第7步的“tickets”和最后的目标单词“tickets”之间的依赖关系建模。但是如果梯度很小,模型就不能学习这种依赖关系(这个情况的概率其实是很大的)。因此模型无法或者说很大概率不能在测试时预测类似的长距离依赖关系。

在语言模型中还存在一个问题,就是语法因因和顺序近因

语法因因:在这种情况下,会根据writer预测is

顺序近因:在这种情况下,会根据books预测are

由于RNN存储的梯度消失问题,或者理解为,就近的词的影响更大,RNN-LMs更善于从顺序近因学习而不是语法近因,所以他们犯这种错误的频率比我们希望的要高。

为什么梯度爆炸也是一个问题?

刚刚一直说梯度消失问题,其实在模型考虑中一般主要考虑梯度消失问题,为什么梯度爆炸说的少?因为很容易解决,下面就具体说说梯度爆炸这个问题。

如果发生梯度爆炸,则SGD更新步骤会非常大~

这可能导致 错误的更新 :我们更新的太多,导致错误的参数配置(损失很大)
在最坏的情况下,这将导致网络中的 Inf 或NaN (然后您必须从较早的检查点重新启动训练)

这里可能有很多人不理解,用动手学习深度学习中的一个图来说明下。

上图就是一个简单的梯度下降的例子,注意哟,是从下往上走的,也就是距离低谷越来越远,也就是越来越错误。

解决方法:梯度裁剪

如果梯度的范数大于某个阈值,在应用SGD更新之前将其缩小。说白了就是如果梯度大于某个值,就让他变小,变小可以选择变成一个定植~或者其他变小的方法都可以。

上述方法,可以是方向保持相同,但是数值会变小,也就是下降过程中迈步子会小一点,如下图:

如何解决梯度消失问题?

刚刚介绍了一大堆梯度消失问题和一丢丢梯度爆炸问题,并且把爆炸问题解决了(剪裁),那么如何解决梯度消失问题呢?

普通RNN模型最大的问题其实就是因为求导过程远的结点的梯度容易消失(因为远的结点求导会对近的导数进行相乘,又因为非线性化导致小于1),针对普通RNN我们可能没有什么好方法,但是~我们可以重写隐藏层公式,创造一个具有独立记忆的RNN单元(也就是利用RNN的变种-LSTM和GRU,来解决梯度消失问题)(这里解释一下独立记忆,因为普通RNN正向传播过程是相互影响的,导致反向求导,离预测词远的结点是逐步求过来的,也就是相乘的形式)

LSTM模型

Hochreiter和Schmidhuber在1997年提出了一种RNN,用于解决梯度消失问题。
在第 t 步,有一个隐藏状态ht和一个单元状态 ct,这两个状态都是长度为 n 的向量,单元c用于存储长期信息
LSTM可以从单元中删除、写入和读取信息
删除、写入和读取信息的选择由三个对应的门控制,这三个门也是长度为 n 的向量,在每个时间步长上,门的每个元素可以打开(1)、关闭(0)或介于两者之间,门是动态的:它们的值是基于当前上下文计算的

我们有一个输入序列 xt ,我们将计算一个隐藏状态 ht 和单元状态 ct 的序列。在时间步 t 时

  • 遗忘门:控制上一个单元状态的保存与遗忘
  • 输入门:控制写入单元格的新单元内容的哪些部分
  • 输出门:控制单元的哪些内容输出到隐藏状态
  • 新单元内容:这是要写入单元的新内容
  • 单元状态:删除(“忘记”)上次单元状态中的一些内容,并写入(“输入”)一些新的单元内容
  • 隐藏状态:从单元中读取(“output”)一些内容
  • Sigmoid函数:所有的门的值都在0到1之间
  • 通过逐元素的乘积来应用门

上述这些都是长度相同的向量

上面说的很抽象,结合下面的LSTM单元结构图捋一捋·~

(关于门结构,其实都是认为定义的,我们很难想象一个公式是和遗忘等有关系的,如果暂时不理解这个地方可以记住~)

LSTM如何解决的梯度消失问题?

LSTM比普通RNN更容易保存许多时间步上的信息 

  • 如果忘记门设置为记得每一时间步上的所有信息,那么单元中的信息被无限地保存
  • 相比之下,普通RNN更难学习重复使用并且在隐藏状态中保存信息的矩阵 Wh

LSTM并不保证没有消失/爆炸梯度,但它确实为模型提供了一种更容易的方法来学习远程依赖关系,这句话最重要~其实LSTM只是缓解了梯度消失和爆炸,并没有解决梯度消失问题~

LSTM的成果

  • 2013-2015年,LSTM开始实现最先进的结果
    • 成功的任务包括:手写识别、语音识别、机器翻译、解析、图像字幕
    • LSTM成为主导方法
  • 现在(2019年),其他方法(如Transformers)在某些任务上变得更加主导。
    • 例如在WMT (机器翻译的 conference + competition)中
    • 在2016年WMT中,总结报告包含“RNN”44次
    • 在2018年WMT中,总结报告包含“RNN”9次,“Transformers” 63次

GRU模型

Cho等人在2014年提出了LSTM的一个更简单的替代方案
在每个时间步 t 上,我们都有输入xt和隐藏状态ht(没有单元状态ct)

  • 更新门:控制隐藏状态的哪些部分被更新,哪些部分被保留
  • 重置门:控制之前隐藏状态的哪些部分被用于计算新内容
  • 新的隐藏状态内容:重置门选择之前隐藏状态的有用部分。使用这一部分和当前输入来计算新的隐藏状态内容
  • 隐藏状态:更新门同时控制从以前的隐藏状态保留的内容,以及更新到新的隐藏状态内容的内容

然后GRU的过程可以结合LSTM的过程以及LSTM的单元图去看~

GRU如何解决消失梯度?

与LSTM类似,GRU使长期保存信息变得更容易(例如,将update gate设置为0)

LSTM和GRU的比较

研究人员提出了许多门控RNN变体,其中LSTM和GRU的应用最为广泛,最大的区别是GRU计算速度更快,参数更少;LSTM更复杂,训练时间更长。目前没有确凿的证据表明其中一个总是比另一个表现得更好,LSTM是一个很好的默认选择(特别是当您的数据具有非常长的依赖关系,或者您有大量训练数据时)
经验法则:从LSTM开始,但是如果你想要更有效率,就切换到GRU

总结一下就行:LSTM更复杂,GRU更简单,如果想要快就GRU,然后两者并没有谁更好,但是往往默认情况下先选择LSTM,如果计算速度扛不住了,就换成GRU(我这里就疑惑了~你GRU和LSTM没有说LSTM效果更好,反而更浪费时间,还先选LSTM...很疑惑)

梯度消失和梯度爆炸只是RNN模型中的问题吗?

这对于所有的神经结构(包括前馈和卷积)都是一个问题,尤其是对于深度结构,链式法则/选择非线性函数,反向传播时梯度可以变得很小很小,所以,较低层/距离输出层较远的层的学习非常缓慢/难以训练,因为梯度很小或者说近似消失,每次梯度下降非常慢~

这里我需要解释一个问题,就是刚刚我们说的是一层RNN中,各个结点求导,距离预测位置越远的梯度越小。而对于深层网络来说,每一层的关系类似于RNN一层中结点的关系,也是一层层嵌套的,所以距离输出层越远的层的梯度会特别容易发生梯度爆炸/消失(因为每层梯度也是有上层梯度相乘得来的),也就是如果多层RNN模型,在模型层次方向上会发生梯度消失/爆炸,在一层中,也会发生梯度消失/爆炸,而CNN或者BP神经网络等模型中,只是会发生模型层次方向上的梯度爆炸/消失

解决方案:大量新的深层前馈 / 卷积架构,添加更多的直接连接,从而使梯度可以跨层流动,例如:

Residual connections 残差连接又名“ResNet”,也称为跳转连接。默认情况下,标识连接保存信息这使得深层网络更容易训练,如下图所示:

再例如:
Dense connections 密集连接又名“DenseNet”,直接将所有内容连接到所有内容,如下图所示:

再例如:
Highway connections 高速公路连接,又称“高速公路网”类似于剩余连接,但标识连接与转换层由动态门控制,灵感来自LSTMs,但适用于深度前馈/卷积网络(无图·~)

结论 :虽然消失/爆炸梯度是一个普遍的问题,但由于重复乘以相同的权矩阵(我的理解就是,因为重复乘以相同的权重矩阵,所以同一层,根据链式求导法则,导致同一层也发生了梯度消失/爆炸问题),RNN尤其不稳定

双向RNNs神经网络

(图片内容我就不解释了,我就说一下我的理解:就是以RNN为例,因为正向传播,其实某一个词依赖于该词前面的词,实际我们说一句话,任意选择某一个词,可能有后面内容决定该词的含义或者情感,例如‘我今天太快乐了,所有的麻烦事都堆到今天了’,如果分析情感,这个快乐,根据后面的含义,应该是个自嘲~而RNN分析快乐是做不到的练习后面词的,包括LSTM和GRU,所以如果提取后面词对前面词的影响呢?这就是双向RNNs的由来)

看图和公式,我们可以发现,反方向传播一遍(过程其实和正向传播一样的),然后将正向向量和反向向量拼接,这样拼接后的向量就具有前面词的依赖和后面词的依赖了,注意这里为什么说是RNNs的双向传播,因为可以应用到普通RNN、LSTM、GRU等RNN模型上~

往往用双向箭头表示,如下图:

双向箭头表示双向性,所描述的隐藏状态是正向+反向状态的拼接
注意:双向RNNs只适用于访问整个输入序列的情况
原因:它们不适用于语言建模,因为在LM中,您只有可用的上文,而没有反向传播需要的下文(因为下文是需要生成的)
如果你有完整的输入序列(例如任何一种编码),双向性是强大的(默认情况下你应该使用它)
例如,BERT(来自transformer的双向编码器表示)是一个基于双向性的强大的预训练的上下文表示系统;例如情感分析,或者其他有全部文本的都可以使用双向的RNNs~


多层RNN神经网络

RNNs在一个维度上已经是“深的”(它们展开到许多时间步长),我们还可以通过应用多个RNNs使它们“深入”到另一个维度——这是一个多层RNN 。
较低的RNNs往往获得较低级别的特性,而较高的RNNs可以获得更高级别的特征 。
多层RNNs也称为堆叠RNNs

这里这个层次和CNN其实差不多,第一层生成的yi就是下一层的输入(对下一层来说就是xi),这里不难理解,就不过多解释了

深/多层RNN的应用

高性能的RNNs通常是多层的(这句话可以理解为:多层神经网络(包括BP、CNN、RNN等),往往比浅层的要好一点,但没有卷积或前馈网络那么深)
在2017年的一篇论文,Britz et al 发现在神经机器翻译中,2到4层RNN编码器和4层RNN解码器是最好的
Transformer-based 的网络(如BERT)可以多达24层。他们有很多skipping-like的连接

为什么RNN计算机如此复杂?

  • 深层需要大量求导+同一层也需要大量计算求导等 
  • RNN无法并行化,计算代价过大,所以不会过深

以上就是本节课内容~

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值