- 作者:韩信子 @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 更新步骤过大
- 这可能导致 谬误的更新:咱们更新的太多,导致谬误的参数配置(损失很大)
- 在最坏的状况下,这将导致网络中的 Inf 或 NaN(而后你必须从较早的检查点重新启动训练)
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 与深度学习的将来