文章目录

  • 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=1y2,分别画在图上如下图:

图中的虚线可以看出,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} ifg^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}htctc_{t}ct经过tanh函数变换后的记忆单元,ctc_{t}cthth_{t}ht是按元素应用tanh函数,所以它们的元素个数相同。

进入下一项之前,我们需要特别说明的是,LSTM的门控并非只能“开/合“,还能通过”开合程度“来控制信息的流量。sigmoid函数的输出范围是0.0 ~ 1.0,所以用于求门的开合程度。

6.2.3 输出门

刚才介绍hth_{t}htctc_{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)+ht1Wh(o)+b(o))
oootanh(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}ct1上添加一个忘记不必要信息的门,称为遗忘门(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)+ht1Wh(f)+b(f))
fffct−1c_{t-1}ct1对应元素的乘积求得传递到当前时刻的记忆信息(删除了应该忘记的信息)。

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)+ht1Wh(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)+ht1Wh(i)+b(i))
然后,将iiiggg的对应元素的乘积作为最终的新记忆添加到记忆单元中。

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介绍相关推荐

  1. 基于深度学习的自然语言处理 第六章

    文本特征构造 在前一章中,我们讨论了通用的学习问题,并且看到了一些适用于训练这些问题的机器学习模型和算法.这些模型都将x视为输入向量,之后进行预测.迄今为止,我们假设向量x是已知的.在语言处理中,向量 ...

  2. 《深度学习进阶 自然语言处理》第五章:RNN通俗介绍

    文章目录 5.1 概率和语言模型 5.1.1 概率视角下的word2vec 5.1.2 语言模型 5.1.3 将CBOW模型用作语言模型的效果怎么样? 5.2 RNN 5.2.1 循环神经网络 5.2 ...

  3. 《深度学习进阶 自然语言处理》书籍介绍

    写在开头 前面几篇文章介绍了图灵<深度学习入门>一书,接下来将继续带读作者的另一书籍:<深度学习进阶 自然语言处理>. 在这儿我觉得非常有必要解释一下,现在社会上有这么多NLP ...

  4. 读书笔记:深度学习进阶-自然语言处理(俗称鱼书二)

    文章目录 前言 一.神经网络的复习 二.自然语言和单词的分布式表示 2.1什么是自然语言处理 2.2同义词词典 2.3基于计数的方法 2.3.1基于python的语料库的预处理 2.3.2单词的分布式 ...

  5. 《深度学习进阶 自然语言处理》学习笔记(2)

    前篇链接 link 目录 第五章 RNN 语言模型 RNN模型 模型架构 一个典型RNN单元的计算图 损失函数的设置 评价指标 总结 第六章 Gated RNN 上一章RNN存在的问题 梯度爆炸与梯度 ...

  6. 深度学习(自然语言处理)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 ...

  7. 深度学习进阶 自然语言处理

  8. 《深度学习进阶:自然语言处理》第2章 自然语言和单词的分布式表示

    <深度学习进阶:自然语言处理>第2章 自然语言和单词的分布式表示 第2章 自然语言和单词的分布式表示 2.1 什么是自然语言处理 2.2 同义词词典 2.2.1 WordNet 2.2.2 ...

  9. 《深度学习进阶:自然语言处理》natural language processing 的 jupyter notebook代码及笔记

    在<深度学习进阶:自然语言处理>这本书过程中,运行了书籍提供的所有代码并做了笔记.同时,原书提供的代码是python文件,我在学习的过程中转换成了jupyter notebook的ipyn ...

最新文章

  1. Android-如何开发一个功能强大的图片选择器
  2. 01初识JavaScript
  3. 渗透知识-XSS跨站脚本攻击
  4. sales status change in ERP
  5. druid连接池以及数据源了解
  6. android面试题2019中高级,2019Android 最新面试题 持续更新
  7. gcc编译与vc编译器区别
  8. 集体智慧编程 - 读书笔记
  9. 【Android自定义View】仿Photoshop取色器ColorPicker(二)
  10. 真香!百度网盘超级会员等级制度,等级越高,特权越多!容量,解压,转存上限,回收站保存时间,全都有!
  11. 网络游戏客户端延迟处理
  12. 什么是gpo,gpt,gpc(活动目录组策略)
  13. dblink(dblink是什么意思)
  14. 计算机玩游戏不能全屏,电脑游戏不能全屏怎么办 电脑游戏不能全屏的解决方法...
  15. 杰克曼为宣传《X战警》抵京
  16. 三水维修松下服务器,松下A6驱动器佛山维修
  17. 判断密码是否为键盘排序密码[C++版本] (3个或者3个以上的连续字符)
  18. 磁敏感加权成像(SWI):技术要点和临床神经学应用
  19. 学籍管理系统1——mantis
  20. FileNotFoundError: [Errno 2] No such file or directory:

热门文章

  1. OLED屏显示电池电量设计
  2. vs2019中使用github看不到更改按钮如何解决
  3. 如何快速简单的获取WIFI的加密方式
  4. 【2023版】基于部标JT808JT1078车载视频位置监控平台介绍-开源项目
  5. paypal付款通知IPN
  6. SpringCloud Alibaba 2021微服务实战三十二 集成RocketMQ实现分布式事务
  7. 57.【Java 接口】
  8. java -jar指定main方法
  9. 自学springboot、开源框架、中间键笔记
  10. 两个网管的不同职业命运