博客 | Tensorflow系列专题(十):门控循环神经网络LSTM与GRU(附python演练)

2018 年 12 月 5 日 AI研习社

本文原载于微信公众号:磐创AI(ID:xunixs),AI研习社经授权转载。欢迎关注磐创AI微信公众号及AI研习社博客专栏。

目录:

  • 门控循环神经网络简介

  • 长短期记忆网络(LSTM)

  • 门控制循环单元(GRU)

  • TensorFlow实现LSTM和GRU

  • 参考文献

 

一、 门控循环神经网络

门控循环神经网络在简单循环神经网络的基础上对网络的结构做了调整,加入了门控机制,用来控制神经网络中信息的传递。门控机制可以用来控制记忆单元中的信息有多少需要保留,有多少需要丢弃,新的状态信息又有多少需要保存到记忆单元中等。这使得门控循环神经网络可以学习跨度相对较长的依赖关系,而不会出现梯度消失和梯度爆炸的问题。如果从数学的角度来理解,一般结构的循环神经网络中,网络的状态之间是非线性的关系,并且参数W在每个时间步共享,这是导致梯度爆炸和梯度消失的根本原因。门控循环神经网络解决问题的方法就是在状态之间添加一个线性的依赖关系,从而避免梯度消失或梯度爆炸的问题。


二、 长短期记忆网络(LSTM)

长短期记忆网络(Long Short-term Memory,简称LSTM)的结构如图1所示,LSTM[1]的网络结构看上去很复杂,但实际上如果将每一部分拆开来看,其实也很简单。在一般的循环神经网络中,记忆单元没有衡量信息的价值量的能力,因此,记忆单元对于每个时刻的状态信息等同视之,这就导致了记忆单元中往往存储了一些无用的信息,而真正有用的信息却被这些无用的信息挤了出去。LSTM正是从这一点出发做了相应改进,和一般结构的循环神经网络只有一种网络状态不同,LSTM中将网络的状态分为内部状态和外部状态两种。LSTM的外部状态类似于一般结构的循环神经网络中的状态,即该状态既是当前时刻隐藏层的输出,也是下一时刻隐藏层的输入。这里的内部状态则是LSTM特有的。


在LSTM中有三个称之为“门”的控制单元,分别是输入门(input gate)、输出门(output gate)和遗忘门(forget gate),其中输入门和遗忘门是LSTM能够记忆长期依赖的关键。输入门决定了当前时刻网络的状态有多少信息需要保存到内部状态中,而遗忘门则决定了过去的状态信息有多少需要丢弃。最后,由输出门决定当前时刻的内部状态有多少信息需要输出给外部状态。

图1 单个时间步的LSTM网络结构示意图

从上图我们可以看到,一个LSTM单元在每个时间步都会接收三个输入,当前时刻的输入,来自上一时刻的内部状态以及上一时刻的外部状态。其中,同时作为三个“门”的输入。为Logistic函数。


接下来我们将分别介绍LSTM中的几个“门”结构。首先看一下输入门,如图2所示:

图2 LSTM的输入门结构示意图

LSTM中也有类似于RNN(这里特指前面介绍过的简单结构的循环神经网络)的前向计算过程,如图2,如果去掉输入门部分,剩下的部分其实就是RNN中输入层到隐藏层的结构,“tanh”可以看作是隐藏层的激活函数,从“tanh”节点输出的值为:

式1

上式中,参数的下标“c”代表这是“tanh”节点的参数,同理,输入门参数的下标为“i”,输出门参数的下标为“o”,遗忘门参数的下标为“f”。上式与简单结构循环神经网络中隐藏层的计算公式一样。在LSTM中,我们将“tanh”节点的输出称为候选状态


输入门是如何实现其控制功能的?输入门的计算公式如下:

式2

由于为Logistic函数,其值域为(0,1),因此输入门的值就属于(0,1)。LSTM将“tanh”节点的输出(即候选状态)乘上输入门的值后再用来更新内部状态。如果的值趋向于0的话,那么候选状态就只有极少量的信息会保存到内部状态中,相反的,如果的值趋近于1,那么候选状态就会有更多的信息被保存。输入门就是通过这种方法来决定保存多少中的信息,值的大小就代表了新信息的重要性,不重要的信息就不会被保存到内部状态中.


再来看遗忘门,如图3所示:

图3 LSTM的遗忘门结构示意图

遗忘门的计算公式如下:

式3

和输入门是同样的方法,通过的值来控制上一时刻的内部状态有多少信息需要“遗忘”。当的值越趋近于0,被遗忘的信息越多。同样的原理,我们来看“输出门”,如图4所示。输出门的计算公式如下:

式4

的值月接近于1,则当前时刻的内部状态就会有更多的信息输出给当前时刻的外部状态

图4 LSTM的输出门结构示意图

以上就是LSTM的整个网络结构以及各个“门”的计算公式。通过选择性的记忆和遗忘状态信息,使的LSTM要比一般的循环神经网络能够学习更长时间间隔的依赖关系。根据不同的需求,LSTM还有着很多不同的变体版本,这些版本的网络结构大同小异,但都在其特定的应用中表现出色。


三、 门控制循环单元(GRU)

门控制循环单元(gated recurrent unit,GRU)网络是另一种基于门控制的循环神经网络,GRU[2]的网络结构相比LSTM要简单一些。GRU将LSTM中的输入门和遗忘门合并成了一个门,称为更新门(update gate)。在GRU网络中,没有LSTM网络中的内部状态和外部状态的划分,而是通过直接在当前网络的状态和上一时刻网络的状态之间添加一个线性的依赖关系,来解决梯度消失和梯度爆炸的问题。

图5 单个时间步的GRU网络结构示意图

在GRU网络中,更新门用来控制当前时刻输出的状态中要保留多少历史状态,以及保留多少当前时刻的候选状态。更新门的计算公式如下:

式5

如图5所示,更新门的输出分别和历史状态以及候选状态进行了乘操作,其中和相乘的是。最终当前时刻网络的输出为:

式6

重置门的作用是决定当前时刻的候选状态是否需要依赖上一时刻的网络状态以及需要依赖多少。从图5可以看到,上一时刻的网络状态先和重置门的输出相乘之后,再作为参数用于计算当前时刻的候选状态。重置门的计算公式如下:

式7

的值决定了候选状态对上一时刻的状态的依赖程度,候选状态的计算公式如下:

式8

其实当的值为0且的值为1时,GRU网络中的更新门和重置门就不再发挥作用了,而此时的GRU网络就退化成了简单循环神经网络,因为此时有:

式9

 

四、 TensorFlow实现LSTM和GRU

前面介绍了LSTM和GRU的理论知识,这一小节里我们使用TensorFlow来实现一个LSTM模型。为了方便,这里我们使用前面介绍过的mnist数据集。可能读者对于在循环神经网络中使用图像数据会有一点疑惑,因为通常情况下图像数据一般都是使用卷积神经网络来训练。事实的确是这样,由于卷积神经网络和循环神经网络的结构不同,也就使得它们各自有不同的适用场景,但这不代表卷积神经网络只能用来处理时序数据,同样也不能认为循环神经网络不能用来处理图像数据,只要在输入数据的格式上稍作调整即可,就像上一章中我们使用卷积神经网络网络来处理文本数据一样。


mnist数据集我们在第三章中就已经使用过,这里就不再多做介绍了,直接上代码:

我们首先导入需要的包,然后定义了神经网络中的一些相关参数。其中第6行代码定义了LSTM中的时间步的长度,由于我们mnist数据集的图像大小为28X28,所以我们将一行像素作为一个输入,这样我们就需要有28个时间步。第7行代码定义了每个时间步输入数据的长度(每个时间步的输入是一个向量),即一行像素的长度。

第10行代码用来加载mnist数据集,并通过参数“validation_size”指定了验证集的大小。第16行代码用来将mnist数据集的格式转换成“dynamic_rnn”函数接受的数据格式“[batch_size, max_time,data_length]”。

在上面的代码中,我们定义了一个两层的LSTM网络结构,并使用了交叉熵损失函数和“Adam”优化器。LSTM多层网络结构的定义和我们前面使用过的多层神经网络的定义方法一样,只是将“BasicRNNCell”类换成了“BasicLSTMCel”类。

在上面的整个代码中,我们使用的参数都是比较随意的进行选择的,没有进行任何的优化,最终在测试集上的结果能达到96%左右,当然这肯定不是LSTM网络处理mnist数据集所能达到的最好的效果,有兴趣的读者可以试着去调整网络的结构和参数,看是否能达到更高的准确率。


TensorFlow中实现LSTM和GRU的切换非常简单,在上面的代码中,将第22和26行代码注释掉,然后取消第24和27行代码的注释,实现的就是GRU。


本文介绍了门控循环神经网络LSTM以及GRU的原理及其tensorflow代码实现,希望能让大家对常用到的LSTM及GRU能够有更好的理解。下一篇,我们将介绍RNN循环神经网络的应用部分,分析RNN循环神经网络是怎样用在文本分类,序列标注以及机器翻译上的,以及其存在的不足与改进方法。

 

五、 参考文献

[1]Sepp Hochreiter: Long Short-term Memory .1997

[2]Kazuki Irie, Zoltán Tüske, TamerAlkhouli, Ralf Schlüter, Hermann Ney:

LSTM, GRU, Highway and a Bit of Attention:AnEmpirical Overview for Language Modeling in Speech Recognition.INTERSPEECH2016: 3519-3523


本专题更多相关文章,请查看:

博客 | Tensorflow系列专题(九):一文综述RNN循环神经网络

博客 | Tensorflow系列专题(八):七步带你实现RNN循环神经网络小示例

博客 | Tensorflow系列专题(七):一文综述RNN循环神经网络

博客 | Tensorflow系列专题(六):实战项目Mnist手写数据集识别

博客 | Tensorflow系列专题(五):BP算法原理

博客 | Tensorflow系列专题(四):神经网络篇之前馈神经网络综述

博客 | TensorFlow系列专题(三):深度学习简介

博客 | TensorFlow系列专题(二):机器学习基础

博客 | TensorFlow系列专题(一):机器学习基础


欢迎扫码关注磐创AI微信公众号


独家中文版 CMU 秋季深度学习课程免费开学!

CMU 2018 秋季《深度学习导论》为官方开源最新版本,由卡耐基梅隆大学教授 Bhiksha Raj 授权 AI 研习社翻译。学员将在本课程中学习深度神经网络的基础知识,以及它们在众多 AI 任务中的应用。课程结束后,期望学生能对深度学习有足够的了解,并且能够在众多的实际任务中应用深度学习。

↗扫码即可免费学习↖

登录查看更多
2

相关内容

【ICML2020-西电】用于语言生成的递归层次主题引导RNN
专知会员服务
21+阅读 · 2020年6月30日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
77+阅读 · 2020年2月3日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
干货 | 循环神经网络(RNN)和LSTM初学者指南
THU数据派
15+阅读 · 2019年1月25日
基于 Keras 用 LSTM 网络做时间序列预测
R语言中文社区
21+阅读 · 2018年8月6日
一文读懂LSTM和循环神经网络
七月在线实验室
8+阅读 · 2018年4月18日
基础 | GRU神经网络
黑龙江大学自然语言处理实验室
27+阅读 · 2018年3月5日
深度学习基础之LSTM
全球人工智能
28+阅读 · 2017年12月18日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
19+阅读 · 2018年10月25日
Symbolic Priors for RNN-based Semantic Parsing
Arxiv
3+阅读 · 2018年9月20日
Arxiv
14+阅读 · 2018年5月15日
Arxiv
3+阅读 · 2018年5月11日
Arxiv
4+阅读 · 2015年8月25日
VIP会员
相关VIP内容
【ICML2020-西电】用于语言生成的递归层次主题引导RNN
专知会员服务
21+阅读 · 2020年6月30日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
Sklearn 与 TensorFlow 机器学习实用指南,385页pdf
专知会员服务
129+阅读 · 2020年3月15日
【MIT深度学习课程】深度序列建模,Deep Sequence Modeling
专知会员服务
77+阅读 · 2020年2月3日
【新书】傻瓜式入门深度学习,371页pdf
专知会员服务
187+阅读 · 2019年12月28日
相关资讯
干货 | 循环神经网络(RNN)和LSTM初学者指南
THU数据派
15+阅读 · 2019年1月25日
基于 Keras 用 LSTM 网络做时间序列预测
R语言中文社区
21+阅读 · 2018年8月6日
一文读懂LSTM和循环神经网络
七月在线实验室
8+阅读 · 2018年4月18日
基础 | GRU神经网络
黑龙江大学自然语言处理实验室
27+阅读 · 2018年3月5日
深度学习基础之LSTM
全球人工智能
28+阅读 · 2017年12月18日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
相关论文
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Bivariate Beta LSTM
Arxiv
5+阅读 · 2019年10月7日
Arxiv
19+阅读 · 2018年10月25日
Symbolic Priors for RNN-based Semantic Parsing
Arxiv
3+阅读 · 2018年9月20日
Arxiv
14+阅读 · 2018年5月15日
Arxiv
3+阅读 · 2018年5月11日
Arxiv
4+阅读 · 2015年8月25日
Top
微信扫码咨询专知VIP会员