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