乐趣区

关于自然语言处理:斯坦福NLP课程-第7讲-梯度消失问题与RNN变种

  • 作者:韩信子 @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 与深度学习的将来

退出移动版