《深度学习进阶 自然语言处理》第六章:LSTM介绍
文章目录
- 6.1 RNN的问题
- 6.1.1 RNN的复习
- 6.1.2 梯度消失和梯度爆炸
- 6.1.4 梯度爆炸的对策
- 6.2 梯度消失和LSTM
- 6.2.1 LSTM的接口
- 6.2.2 LSTM层的结构
- 6.2.3 输出门
- 6.2.4 遗忘门
- 6.2.5 新的记忆单元
- 6.2.6 输入门
- 6.2.7 LSTM的梯度的流动
- 6.3 使用LSTM的语言模型
- 6.3.1 LSTM层的多层化
- 6.3.2 基于Dropout抑制过拟合
- 6.3.3 权重共享
- 6.4 总结
之前文章链接:
开篇介绍:《深度学习进阶 自然语言处理》书籍介绍
第一章:《深度学习进阶 自然语言处理》第一章:神经网络的复习
第二章:《深度学习进阶 自然语言处理》第二章:自然语言和单词的分布式表示
第三章:《深度学习进阶 自然语言处理》第三章:word2vec
第四章:《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍
第五章:《深度学习进阶 自然语言处理》第五章:RNN通俗介绍
上一章我们介绍了结构比较简单的RNN,存在环路的RNN可以记忆过去的信息,只是效果不好,因为很多情况下它都无法很好地学习到时序数据的长期依赖关系。为了学习到时序数据的长期依赖关系,我们增加了一种名为“门”的结构,具有代表性的有LSTM和GRU等“Gated RNN”。本章将指出上一章的RNN问题,重点介绍LSTM的结构,并揭示它实现“长期记忆”的机制。
6.1 RNN的问题
上一章的RNN不擅长学习时序数据的长期依赖关系,是因为BPTT会发生梯消失和梯度爆炸的问题。本节先回顾一下上一章介绍的RNN层,并通过实例来说明为什么不擅长长期记忆。
6.1.1 RNN的复习
RNN层存在环路,展开来看它是一个在水平方向上延伸的网络,如下图
xtx_{t}xt是输入的时序数据,hth_{t}ht是输出的隐藏状态,记录过去信息。RNN正是使用了上一刻的隐藏状态所以才可以继承过去的信息。RNN层的处理用计算图来表示的话,如下图:
如上图所示,RNN层的正向传播进行的计算包含矩阵乘积、矩阵加法和基于激活函数tanh的变换。这是我们上一章介绍的RNN层,下面我们看一下这其中存在的问题,主要是关于长期记忆的问题。
6.1.2 梯度消失和梯度爆炸
语言模型的任务是根据已经出现的单词预测下一个将要出现的单词。RNN层通过向过去传递“有意义的梯度”,理论上是能够学习时间方向上的依赖关系。但是随着时间的回溯,这个梯度在中途不可避免的变小(梯度消失)或者变大(梯度爆炸),权重参数不能正常更新,RNN层也就无法学习长期的依赖关系。
根据上一节的第二张图展示的RNN层正向传播的计算,可知反向传播的梯度依次流经tanh、矩阵加和(“+”)和MatMul(矩阵乘积)运算。"+"的反向传播梯度值不变。当y = tanh(x)时,它的导数是dydx=1−y2\frac{dy}{dx} = 1- y^{2}dxdy=1−y2,分别画在图上如下图:
图中的虚线可以看出,tanh(x)导数的值小于1.0,随着x远离0,它的值变小。这意味着,反向传播的梯度经过tanh节点时,它的值会越来越小。
接着我们看一下MatMul(矩阵乘积)节点,简单起见,我忽略tanh节点,这样RNN层的反向传播的梯度仅取决于矩阵乘积运算。通过下面代码来观察梯度大小的变化。
import numpy as np
import matplotlib.pyplot as pltN = 2 # mini-batch的大小
H = 3 # 隐藏状态向量的维数
T = 20 # 时序数据的长度dh = np.ones((N, H))
# np.random.seed(6) # 为了复现,固定随机数种子
Wh = np.random.randn(H, H)norm_list = []
for t in range(T):dh = np.dot(dh, Wh.T)norm = np.sqrt(np.sum(dh**2)) / Nnorm_list.append(norm)
print(norm_list)
多运行几次上面的代码可以发现,梯度的大小(norm值)随时间步长呈指数级增加/减小。为什么会出现这样的指数级变化呢?因为矩阵Wh被反复乘了T次。如果Wh是标量,当Wh大于1或小于1时,梯度呈指数级变化。但是Wh是矩阵,此时矩阵的奇异值作为指标。如果奇异值的最大值大于1,梯度可能呈指数级增加(必要非充分条件),最大值小于1,可以判断梯度会呈指数级减小。
6.1.4 梯度爆炸的对策
解决梯度爆炸有既定的方法,称为梯度裁剪(gradients clipping)。伪代码如下:
if∣∣g^∣∣≥threshold:g^=threshold∣∣g^∣∣g^if \quad ||\hat{g}|| \geq threshold:\\ \hat{g} = \frac{threshold}{||\hat{g}||}\hat{g} if∣∣g^∣∣≥threshold:g^=∣∣g^∣∣thresholdg^
这里假设将神经网络用到的所有参数的梯度整合成一个,并用符号g^\hat{g}g^表示,阈值设为threshold。当梯度的L2范数∣∣g^∣∣||\hat{g}||∣∣g^∣∣大于或等于阈值,就按照上面的方法修正梯度,这就是梯度裁剪。
6.2 梯度消失和LSTM
为了解决RNN的梯度消失问题,人们提出了诸多Gated RNN框架,具有代表性的有LSTM和GRU,本节我们只关注LSTM,从结构入手,阐明它为何不会引起梯度消失。
6.2.1 LSTM的接口
我们先以简略图比较一下LSTM与RNN的接口:
LSTM比RNN的接口多了一个路径c,这个c称为记忆单元,是LSTM专用的记忆部门,其特点是仅在LSTM层内部接收和传递数据,不向其他层输出。
6.2.2 LSTM层的结构
ctc_{t}ct存储了时刻t时LSTM的记忆,可以认为其中保存了过去到时刻t的所有必要信息,基于ctc_{t}ct向外部输出隐藏状态hth_{t}ht。二者的关系是hth_{t}ht是ctc_{t}ct经过tanh函数变换后的记忆单元,ctc_{t}ct和hth_{t}ht是按元素应用tanh函数,所以它们的元素个数相同。
进入下一项之前,我们需要特别说明的是,LSTM的门控并非只能“开/合“,还能通过”开合程度“来控制信息的流量。sigmoid函数的输出范围是0.0 ~ 1.0,所以用于求门的开合程度。
6.2.3 输出门
刚才介绍hth_{t}ht和ctc_{t}ct关系时只提到应用了tanh函数,这里其实还考虑了对tanh(ct)tanh(c_{t})tanh(ct)施加了“门控”,调整了tanh(ct)tanh(c_{t})tanh(ct)的各个元素的重要程度。由于这里的门管理了hth_{t}ht的输出,所以称为输出门(output gate)。公式如下:
o=σ(xtWx(o)+ht−1Wh(o)+b(o))o = \sigma(x_{t}W_{x}^{(o)}+h_{t-1}W_{h}^{(o)}+b^{(o)}) o=σ(xtWx(o)+ht−1Wh(o)+b(o))
ooo与tanh(ct)tanh(c_{t})tanh(ct)的对应元素乘积,得到hth_{t}ht。
tanh的输出是 -1.0 ~ 1.0的实数,可以认为是表示某种被编码信息的强弱程度。sigmoid的输出是 0.0 ~ 1.0的实数,表示数据流出的比例。因此,多数情况下,门使用sigmoid函数作为激活函数,包含实质信息的数据使用tanh函数作为激活函数。
6.2.4 遗忘门
在记忆单元ct−1c_{t-1}ct−1上添加一个忘记不必要信息的门,称为遗忘门(forget gate)。公式如下:
f=σ(xtWx(f)+ht−1Wh(f)+b(f))f = \sigma(x_{t}W_{x}^{(f)}+h_{t-1}W_h^{(f)}+b^{(f)}) f=σ(xtWx(f)+ht−1Wh(f)+b(f))
fff与ct−1c_{t-1}ct−1对应元素的乘积求得传递到当前时刻的记忆信息(删除了应该忘记的信息)。
6.2.5 新的记忆单元
除了删除上一时刻的记忆单元中应该忘记的信息,我们还需要向这个记忆单元添加应当记住的新信息,为此添加新的tanh节点,公式如下:
g=tanh(xtWx(g)+ht−1Wh(g)+b(g))g=tanh(x_tWx^{(g)}+h_{t-1}W_h^{(g)}+b^{(g)}) g=tanh(xtWx(g)+ht−1Wh(g)+b(g))
ggg表示新的信息。
6.2.6 输入门
对上面的新的记忆单元ggg添加门,控制信息流量(对新信息添加权重从而对信息进行取舍),称为输入门(input gate)。公式如下:
i=σ(xtWx(i)+ht−1Wh(i)+b(i))i = \sigma(x_tW_x^{(i)}+h_{t-1}W_h^{(i)}+b^{(i)}) i=σ(xtWx(i)+ht−1Wh(i)+b(i))
然后,将iii和ggg的对应元素的乘积作为最终的新记忆添加到记忆单元中。
LSTM的整个内部处理如下图所示:
6.2.7 LSTM的梯度的流动
上面介绍完LSTM的结构,观察记忆单元ccc的反向传播我们就会知道它为什么不会引起梯度消失。
记忆单元ccc的反向传播仅流过"➕"和“✖️”节点。“➕”节点将上游传来的梯度原样流出,所以梯度没有变化。“✖️”节点进行的是对应元素的乘积计算(RNN是相同权重矩阵重复多次的矩阵乘积),而且每次乘积的门值不同,门值调节着梯度的大小,所以LSTM的记忆单元不会(难以)梯度消失。
6.3 使用LSTM的语言模型
这里实现的语言模型和上一章几乎一样,唯一区别是这次用Time LSTM层替换了Time RNN层,如下图:
当前的使用LSTM层的语言模型有3点需要改进的地方,分别是:LSTM层的多层化、基于Dropout抑制过拟合和权重共享。
6.3.1 LSTM层的多层化
叠加多个LSTM层可以提高语言模型的精度,前一个LSTM层的隐藏状态是后面一个LSTM层的输入。具体要叠加几层,需要根据问题的复杂程度和数据规模来确定。
6.3.2 基于Dropout抑制过拟合
通过加深层,可以提高模型的表现力,但是这样往往会导致过拟合。抑制过拟合的常用方法有增加训练数据、降低模型的复杂度,以及对模型复杂度给予正则化的惩罚。Dropout也是一种正则化。考虑到噪声的积累,最好在垂直方向上插入Dropout层,这样无论沿时间方向(水平方向)前进多少,信息都不会丢失。常规的Dropout不适合用在时间方向上,但是"变分Dropout"可以,它的机制是同一层的Dropout使用相同的mask(决定是否传递数据的随机布尔值),因为mask被固定,信息的损失方式也被固定,所以可以避免常规Dropout发生的指数级信息损失。
6.3.3 权重共享
Embedding层和Affine层的权重共享,在不影响精度的提高的同时,可以大大减少学习的参数的数量,而且还能抑制过拟合。
6.4 总结
本章的主题是Gated RNN,我们先指出上一章的简单RNN中存在的梯度消失/爆炸问题,说明了作为替代层的Grated RNN(LSTM、GRU等)的有效性。介绍了使用LSTM层创建的语言模型,以及模型的优化。
下一章我们将介绍如何使用语言模型生成文本。
《深度学习进阶 自然语言处理》第六章:LSTM介绍相关推荐
- 基于深度学习的自然语言处理 第六章
文本特征构造 在前一章中,我们讨论了通用的学习问题,并且看到了一些适用于训练这些问题的机器学习模型和算法.这些模型都将x视为输入向量,之后进行预测.迄今为止,我们假设向量x是已知的.在语言处理中,向量 ...
- 《深度学习进阶 自然语言处理》第五章:RNN通俗介绍
文章目录 5.1 概率和语言模型 5.1.1 概率视角下的word2vec 5.1.2 语言模型 5.1.3 将CBOW模型用作语言模型的效果怎么样? 5.2 RNN 5.2.1 循环神经网络 5.2 ...
- 《深度学习进阶 自然语言处理》书籍介绍
写在开头 前面几篇文章介绍了图灵<深度学习入门>一书,接下来将继续带读作者的另一书籍:<深度学习进阶 自然语言处理>. 在这儿我觉得非常有必要解释一下,现在社会上有这么多NLP ...
- 读书笔记:深度学习进阶-自然语言处理(俗称鱼书二)
文章目录 前言 一.神经网络的复习 二.自然语言和单词的分布式表示 2.1什么是自然语言处理 2.2同义词词典 2.3基于计数的方法 2.3.1基于python的语料库的预处理 2.3.2单词的分布式 ...
- 《深度学习进阶 自然语言处理》学习笔记(2)
前篇链接 link 目录 第五章 RNN 语言模型 RNN模型 模型架构 一个典型RNN单元的计算图 损失函数的设置 评价指标 总结 第六章 Gated RNN 上一章RNN存在的问题 梯度爆炸与梯度 ...
- 深度学习(自然语言处理)RNN、LSTM、TextCNN
目录 0 前言: 1.从RNN到LSTM 1.1 RNN 1.2 LSTM模型 1.2.1遗忘门(forget gate) 1.2.2 输入门 1.2.3 输出门 1.3 使用循环神经网络模型 2 t ...
- 深度学习进阶 自然语言处理
- 《深度学习进阶:自然语言处理》第2章 自然语言和单词的分布式表示
<深度学习进阶:自然语言处理>第2章 自然语言和单词的分布式表示 第2章 自然语言和单词的分布式表示 2.1 什么是自然语言处理 2.2 同义词词典 2.2.1 WordNet 2.2.2 ...
- 《深度学习进阶:自然语言处理》natural language processing 的 jupyter notebook代码及笔记
在<深度学习进阶:自然语言处理>这本书过程中,运行了书籍提供的所有代码并做了笔记.同时,原书提供的代码是python文件,我在学习的过程中转换成了jupyter notebook的ipyn ...
最新文章
- Android-如何开发一个功能强大的图片选择器
- 01初识JavaScript
- 渗透知识-XSS跨站脚本攻击
- sales status change in ERP
- druid连接池以及数据源了解
- android面试题2019中高级,2019Android 最新面试题 持续更新
- gcc编译与vc编译器区别
- 集体智慧编程 - 读书笔记
- 【Android自定义View】仿Photoshop取色器ColorPicker(二)
- 真香!百度网盘超级会员等级制度,等级越高,特权越多!容量,解压,转存上限,回收站保存时间,全都有!
- 网络游戏客户端延迟处理
- 什么是gpo,gpt,gpc(活动目录组策略)
- dblink(dblink是什么意思)
- 计算机玩游戏不能全屏,电脑游戏不能全屏怎么办 电脑游戏不能全屏的解决方法...
- 杰克曼为宣传《X战警》抵京
- 三水维修松下服务器,松下A6驱动器佛山维修
- 判断密码是否为键盘排序密码[C++版本] (3个或者3个以上的连续字符)
- 磁敏感加权成像(SWI):技术要点和临床神经学应用
- 学籍管理系统1——mantis
- FileNotFoundError: [Errno 2] No such file or directory: