• 作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI
  • 教程地址:http://www.showmeai.tech/tutorials/36
  • 本文地址:http://www.showmeai.tech/article-detail/241
  • 申明:版权所有,转载请分割平台与作者并注明出处
  • 珍藏ShowMeAI查看更多精彩内容


ShowMeAI为斯坦福CS224n《自然语言解决与深度学习(Natural Language Processing with Deep Learning)》课程的全副课件,做了中文翻译和正文,并制作成了GIF动图!


本讲内容的深度总结教程能够在这里 查看。视频和课件等材料的获取形式见文末


引言

(梯度隐没和梯度爆炸局部内容也能够参考ShowMeAI的对吴恩达老师课程的总结文章深度学习教程 | 深度学习的实用层面

概述

上节课咱们学了

  • 递归神经网络(RNNs)以及为什么它们对于语言建模(LM)很有用

明天咱们将学习

  • RNNs的问题以及如何修复它们
  • 更简单的RNN变体

下一节课咱们将学习

  • 如何应用基于RNN-based的体系结构,即sequence-to-sequence with attention来实现
  • 神经机器翻译(NMT)

今日课程要点

  • 梯度隐没问题
  • 两种新类型RNN:LSTM和GRU
  • 其余梯度隐没(爆炸)的解决方案

    • 梯度裁剪
    • 跳接
  • 更多RNN变体

    • 双向RNN
    • 多层RNN

1.梯度隐没

1.1 梯度隐没问题

  • 梯度隐没问题:当这些梯度很小的时候,反向流传的越深刻,梯度信号就会变得越来越小

1.2 梯度隐没证实简述

Source: “On the difficulty of training recurrent neural networks”, Pascanu et al, 2013. http://proceedings.mlr.press/...

$$\boldsymbol{h}^{(t)}=\sigma\left(\boldsymbol{W}_{h} \boldsymbol{h}^{(t-1)}+\boldsymbol{W}_{x} \boldsymbol{x}^{(t)}+\boldsymbol{b}_{1}\right)$$

  • 因而通过链式法则失去:

$$\frac{\partial \boldsymbol{h}^{(t)}}{\partial \boldsymbol{h}^{(t-1)}}=\operatorname{diag}\left(\sigma^{\prime}\left(\boldsymbol{W}_{h} \boldsymbol{h}^{(t-1)}+\boldsymbol{W}_{x} \boldsymbol{x}^{(t)}+\boldsymbol{b}_{1}\right)\right) \boldsymbol{W}_{h}$$

  • 思考第 \(i\) 步上的损失梯度 \(J^{(i)}()\),绝对于第 \(j\) 步上的暗藏状态 \(h^{(j)}\)


  • 如果权重矩阵 \(W_h\) 很小,那么这一项也会随着 \(i\) 和 \(j\) 的间隔越来越远而变得越来越小

1.3 梯度隐没证实简述

  • 思考矩阵的 L2 范数

$$\left\|\frac{\partial J^{(i)}(\theta)}{\partial \boldsymbol{h}^{(j)}}\right\| \leq\left\|\frac{\partial J^{(i)}(\theta)}{\partial \boldsymbol{h}^{(i)}}\right\|\left\|\boldsymbol{W}_{h}\right\|^{(i-j)} \prod_{j<t \leq i}\left\|\operatorname{diag}\left(\sigma^{\prime}\left(\boldsymbol{W}_{h} \boldsymbol{h}^{(t-1)}+\boldsymbol{W}_{x} \boldsymbol{x}^{(t)}+\boldsymbol{b}_{1}\right)\right)\right\|$$


  • Pascanu et al 表明,如果 \(W_h\) 的最大特征值<1,梯度 \(|\frac{\partial J^{(i)}(\theta)}{\partial \boldsymbol{h}^{(j)}}|\) 将呈指数衰减

    • 这里的界线是\(1\)因为咱们应用的非线性函数是sigmoid


  • 有一个相似的证实将一个最大的特征值 > 1与梯度爆炸分割起来

1.4 为什么梯度隐没是个问题?

  • 来自远处的梯度信号会失落,因为它比来自近处的梯度信号小得多。
  • 因而,模型权重只会依据近期效应而不是长期效应进行更新。

1.5 为什么梯度隐没是个问题?

  • 另一种解释:梯度能够被看作是过来对将来的影响的衡量标准


  • 如果梯度在较长一段距离内(从工夫步 \(t\) 到 \(t+n\))变得越来越小,那么咱们就不能判断:

    • 在数据中,步骤 \(t\) 和 \(t+n\) 之间没有依赖关系
    • 咱们用谬误的参数来捕捉 \(t\) 和 \(t+n\) 之间的真正依赖关系

1.6 梯度隐没对RNN语言模型的影响

  • 为了从这个训练示例中学习,RNN-LM须要对第7步的 tickets 和最初的指标单词 tickets 之间的依赖关系建模


  • 然而如果梯度很小,模型就不能学习这种依赖关系

    • 因而模型无奈在测试时预测相似的长距离依赖关系

1.7 梯度隐没对RNN语言模型的影响

“Assessing the Ability of LSTMs to Learn Syntax-Sensitive Dependencies”, Linzen et al, 2016. https://arxiv.org/pdf/1611.01...

  • Correct answer:

    • The writer of the books is planning a sequel
  • 语法远因
  • 程序远因


  • 因为梯度的隐没,RNN-LMs更长于从程序远因学习而不是语法远因,所以他们犯这种谬误的频率比咱们心愿的要高[Linzen et al . 2016]

2.梯度爆炸

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

  • 如果梯度过大,则SGD更新步骤过大


  • 这可能导致谬误的更新:咱们更新的太多,导致谬误的参数配置(损失很大)
  • 在最坏的状况下,这将导致网络中的 InfNaN(而后你必须从较早的检查点重新启动训练)

2.2 梯度剪裁:梯度爆炸的解决方案

Source: “On the difficulty of training recurrent neural networks”, Pascanu et al, 2013. http://proceedings.mlr.press/...

  • 梯度裁剪:如果梯度的范数大于某个阈值,在利用SGD更新之前将其放大
  • 直觉:朝着同样的方向迈出一步,但要小一点

2.3 梯度剪裁:梯度爆炸的解决方案

Source: “Deep Learning”, Goodfellow, Bengio and Courville, 2016. Chapter 10.11.1. https://www.deeplearningbook....

  • 这显示了一个简略RNN的损失面(暗藏层状态是一个标量不是一个向量)


  • 在右边,因为陡坡,梯度降落有两个十分大的步骤,导致攀登悬崖而后向右射击(都是坏的更新)
  • 在左边,梯度剪裁缩小了这些步骤的大小,所以参数调整不会有激烈的稳定

2.4 如何解决梯度隐没问题?

  • 次要问题是RNN很难学习在多个工夫步长的状况下保存信息
  • 在一般的RNN中,暗藏状态一直被重写

$$\boldsymbol{h}^{(t)}=\sigma\left(\boldsymbol{W}_{h} \boldsymbol{h}^{(t-1)}+\boldsymbol{W}_{x} \boldsymbol{x}^{(t)}+\boldsymbol{b}\right)$$


  • 有没有更好构造的RNN

3.长短时记忆网络(LSTM)

3.1 长短时记忆(LSTM)

“Long short-term memory”, Hochreiter and Schmidhuber, 1997. https://www.bioinf.jku.at/pub...

  • Hochreiter和Schmidhuber在1997年提出了一种RNN,用于解决梯度隐没问题。


  • 在第 \(t\) 步,有一个暗藏状态 \(h^{(t)}\) 和一个单元状态 \(c^{(t)}\)

    • 都是长度为 \(n\) 的向量
    • 单元存储长期信息
    • LSTM能够从单元中擦除写入读取信息


  • 信息被 擦除 / 写入 / 读取 的抉择由三个对应的门管制

    • 门也是长度为 \(n\) 的向量
    • 在每个工夫步长上,门的每个元素能够关上(1)、敞开(0)或介于两者之间
    • 门是动静的:它们的值是基于以后上下文计算的

3.2 长短时记忆(LSTM)

咱们有一个输出序列 \(x^{(t)}\),咱们将计算一个暗藏状态 \(h^{(t)}\) 和单元状态 \(c^{(t)}\) 的序列。在工夫步 \(t\) 时


  • 忘记门:管制上一个单元状态的保留与忘记
  • 输出门:管制写入单元格的新单元内容的哪些局部
  • 输入门:管制单元的哪些内容输入到暗藏状态


  • 新单元内容:这是要写入单元的新内容
  • 单元状态:删除(“遗记”)上次单元状态中的一些内容,并写入(“输出”)一些新的单元内容
  • 暗藏状态:从单元中读取(“output”)一些内容


  • Sigmoid函数:所有的门的值都在0到1之间
  • 通过逐元素的乘积来利用门
  • 这些是长度雷同(\(n\))的向量

3.3 长短时记忆(LSTM)

Source: http://colah.github.io/posts/...

3.4 长短时记忆(LSTM)

Source: http://colah.github.io/posts/...

3.5 LSTM如何解决梯度隐没

  • RNN的LSTM架构更容易保留许多工夫步上的信息

    • 如果遗记门设置为记得每一时间步上的所有信息,那么单元中的信息被有限地保留
    • 相比之下,一般RNN更难学习重复使用并且在暗藏状态中保存信息的矩阵 \(W_h\)


  • LSTM并不保障没有梯度隐没/爆炸,但它的确为模型提供了一种更容易的办法来学习近程依赖关系

3.6 LSTMs:事实世界的胜利

Source: "Findings of the 2016 Conference on Machine Translation (WMT16)", Bojar et al. 2016, http://www.statmt.org/wmt16/p... Source: "Findings of the 2018

Conference on Machine Translation (WMT18)", Bojar et al. 2018, http://www.statmt.org/wmt18/p...

  • 2013-2015年,LSTM开始实现最先进的后果

    • 胜利的工作包含:手写辨认、语音辨认、机器翻译、解析、图像字幕
    • LSTM成为主导办法


  • 当初(2019年),其余办法(如Transformers)在某些工作上变得更加主导

    • 例如在WMT(a MT conference + competition)中
    • 在2016年WMT中,总结报告蕴含“RNN”44次
    • 在2018年WMT中,总结报告蕴含“RNN”9次,“Transformers” 63次

4.GRU网络

4.1 Gated Recurrent Units(GRU)

"Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation", Cho et al. 2014, https://arxiv.org/pdf/1406.10...

  • Cho等人在2014年提出了LSTM的一个更简略的代替计划
  • 在每个工夫步 \(t\) 上,咱们都有输出 \(x^{(t)}\) 和暗藏状态 \(h^{(t)}\) (没有单元状态)


  • 更新门:管制暗藏状态的哪些局部被更新,或者被保留
  • 重置门:管制之前暗藏状态的哪些局部被用于计算新内容


  • 新的暗藏状态内容:重置门抉择之前暗藏状态的有用局部。应用这一部分和以后输出来计算新的暗藏状态内容
  • 暗藏状态:更新门同时管制从以前的暗藏状态保留的内容,以及更新到新的暗藏状态内容的内容


  • 这如何解决隐没梯度?

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

4.2 LSTM vs GRU

  • 钻研人员提出了许多门控RNN变体,其中LSTM和GRU的利用最为宽泛


  • 最大的区别是GRU计算速度更快,参数更少
  • 没有确凿的证据表明其中一个总是比另一个体现得更好
  • LSTM 是一个很好的默认抉择(特地是当你的数据具备十分长的依赖关系,或者你有很多训练数据时)


  • 教训法令:从LSTM开始,然而如果你想要更有效率,就切换到GRU

4.3 梯度隐没/爆炸只是RNN问题吗?

"Deep Residual Learning for Image Recognition", He et al, 2015. https://arxiv.org/pdf/1512.03...

"Densely Connected Convolutional Networks", Huang et al, 2017. https://arxiv.org/pdf/1608.06...

"Highway Networks", Srivastava et al, 2015. https://arxiv.org/pdf/1505.00...

"Learning Long-Term Dependencies with Gradient Descent is Difficult", Bengio et al. 1994, http://ai.dinfo.unifi.it/paol...

梯度隐没/爆炸只是RNN问题吗


  • 并不是,这对于所有的神经构造(包含前馈卷积网络)都是一个问题,尤其是对于深度构造

    • 因为链式法则/抉择非线性函数,反向流传时梯度能够变得很小很小
    • 因而,较低层次的学习十分迟缓(难以训练)
    • 解决方案:大量新的深层前馈 / 卷积架构,增加更多的间接连贯(从而使梯度能够流动)


例如:

  • 残差连贯又名“ResNet”,也称为跳转连贯
  • 默认状况下,标识连贯保存信息
  • 这使得深层网络更容易训练


例如:

  • 密集连贯又名“DenseNet”
  • 间接将所有内容连贯到所有内容


例如:

  • Highway连贯又称“高速网络”
  • 相似于残差连贯,但标识连贯与转换层由动静门管制
  • 灵感来自LSTMs,但实用于深度前馈/卷积网络

论断:尽管梯度隐没/爆炸是一个广泛的问题,但因为反复乘以雷同的权矩阵,RNN尤其不稳固[Bengio et al, 1994]

4.4 要点回顾

4.5 双向RNN:动机

  • 咱们能够把这种暗藏状态看作是这个句子中单词“terribly”的一种示意。咱们称之为上下文示意。


  • 这些上下文示意只蕴含对于左上下文的信息(例如“the movie was”)。
  • 那么正确的上下文呢?

    • 在这个例子中,“exciting”在右上下文中,它润饰了“terribly”的意思(从否定变为必定)

4.6 双向RNN

  • “terribly”的上下文示意同时具备左上下文和右上下文

4.7 双向RNN

  • 这是一个示意“计算RNN的一个向前步骤”的通用符号——它能够是一般的、LSTM或GRU计算
  • 咱们认为这是一个双向RNN的“暗藏状态”。这就是咱们传递给网络下一部分的货色
  • 一般来说,这两个RNNs有各自的权重

4.8 双向RNN:简图

  • 双向箭头示意双向性,所形容的暗藏状态是正向+反向状态的连贯

4.9 双向RNN

  • 留神:双向RNNs只实用于拜访整个输出序列的状况

    • 它们不适用于语言建模,因为在LM中,你只有左侧的上下文可用


  • 如果你有残缺的输出序列(例如任何一种编码),双向性是弱小的(默认状况下你应该应用它)
  • 例如,BERT(来自transformer的双向编码器示意)是一个基于双向性的弱小的预训练的上下文示意零碎

    • 你会在课程的前面学到更多对于BERT的常识!

4.10 深层RNN

  • RNNs在一个维度上曾经是“deep”(它们开展到许多工夫步长)
  • 咱们还能够通过利用多个RNN使它们“深刻”到另一个维度:这是一个多层RNN
  • 较低的RNN应该计算较低级别的个性,而较高的RNN应该计算较高级别的个性
  • 多层RNN也称为重叠RNN

4.11 深层RNN

  • RNN层 \(i\) 的暗藏状态是RNN层 \(i+1\) 的输出

4.12 深层RNN在实践中的利用

“Massive Exploration of Neural Machine Translation Architecutres”, Britz et al, 2017. https://arxiv.org/pdf/1703.03...

  • 高性能的RNNs通常是多层的(但没有卷积或前馈网络那么深)


  • 例如:在2017年的一篇论文,Britz et al 发现在神经机器翻译中,2到4层RNN编码器是最好的,和4层RNN解码器

    • 然而,skip-connections / dense-connections 须要训练更深RNNs(例如8层)
    • RNN无奈并行化,计算代价过大,所以不会过深


  • Transformer-based 的网络(如BERT)能够多达24层

    • BERT 有很多skipping-like的连贯

4.13 总结

  • LSTM功能强大,但GRU速度更快
  • 剪裁你的梯度
  • 尽可能应用双向性
  • 多层RNN功能强大,但如果很深可能须要跳接/密集连贯

5.视频教程

能够点击 B站 查看视频的【双语字幕】版本

https://www.bilibili.com/vide...

6.参考资料

  • 本讲带学的在线阅翻页本
  • 《斯坦福CS224n深度学习与自然语言解决》课程学习指南
  • 《斯坦福CS224n深度学习与自然语言解决》课程大作业解析
  • 双语字幕视频】斯坦福CS224n | 深度学习与自然语言解决(2019·全20讲)
  • Stanford官网 | CS224n: Natural Language Processing with Deep Learning

ShowMeAI 系列教程举荐

  • 大厂技术实现 | 举荐与广告计算解决方案
  • 大厂技术实现 | 计算机视觉解决方案
  • 大厂技术实现 | 自然语言解决行业解决方案
  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
  • 自然语言解决教程 | 斯坦福CS224n课程 · 课程带学与全套笔记解读

自然语言解决 (NLP) 教程

  • NLP教程(1)- 词向量、SVD合成与Word2vec
  • NLP教程(2)- GloVe及词向量的训练与评估
  • NLP教程(3)- 神经网络与反向流传
  • NLP教程(4)- 句法分析与依存解析
  • NLP教程(5)- 语言模型、RNN、GRU与LSTM
  • NLP教程(6)- 神经机器翻译、seq2seq与注意力机制
  • NLP教程(7)- 问答零碎
  • NLP教程(8)- NLP中的卷积神经网络
  • NLP教程(9)- 句法分析与树形递归神经网络

斯坦福 CS224n 课程带学详解

  • 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步
  • 斯坦福NLP课程 | 第2讲 - 词向量进阶
  • 斯坦福NLP课程 | 第3讲 - 神经网络常识回顾
  • 斯坦福NLP课程 | 第4讲 - 神经网络反向流传与计算图
  • 斯坦福NLP课程 | 第5讲 - 句法分析与依存解析
  • 斯坦福NLP课程 | 第6讲 - 循环神经网络与语言模型
  • 斯坦福NLP课程 | 第7讲 - 梯度隐没问题与RNN变种
  • 斯坦福NLP课程 | 第8讲 - 机器翻译、seq2seq与注意力机制
  • 斯坦福NLP课程 | 第9讲 - cs224n课程大我的项目实用技巧与教训
  • 斯坦福NLP课程 | 第10讲 - NLP中的问答零碎
  • 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络
  • 斯坦福NLP课程 | 第12讲 - 子词模型
  • 斯坦福NLP课程 | 第13讲 - 基于上下文的表征与NLP预训练模型
  • 斯坦福NLP课程 | 第14讲 - Transformers自注意力与生成模型
  • 斯坦福NLP课程 | 第15讲 - NLP文本生成工作
  • 斯坦福NLP课程 | 第16讲 - 指代消解问题与神经网络办法
  • 斯坦福NLP课程 | 第17讲 - 多任务学习(以问答零碎为例)
  • 斯坦福NLP课程 | 第18讲 - 句法分析与树形递归神经网络
  • 斯坦福NLP课程 | 第19讲 - AI平安偏见与偏心
  • 斯坦福NLP课程 | 第20讲 - NLP与深度学习的将来