【人工智能基础08】循环神经网络(RNN)与长短时记忆网络(LSTM):处理和预测序列数据
【人工智能基础四】循环神经网络(RNN)与长短时记忆网络(LSTM)
文章目录
一. RNN
RNN出现的原因与基本逻辑
- 卷积神经网络模型,层与层之间是全连接或部分连接的,但每层之间的节点没有连接。
- 考虑这样一个问题,如果要预测一个句子的下一个单词是什么,一般需要用到当前单词及前面的单词,因为句子中前后单词并不是独立的。例如,当前单词是“很”,前一个单词是“天空”,那么下一个单词很大概率是“蓝”。这样的应用CNN并不擅长。 由此出现了可以用来处理和预测序列数据的循环神经网络(RNN)。
- 人类在阅读时会根据之前已经加过工过的信息来理解现在看到的文字,与此类似,RNN对信息的处理方式也是如此,会记忆之前的信息,并利用之前的信息影响后面节点的输出。 体现在网络结构上,RNN隐藏层之间的节点是有连接的,隐藏层的输入不仅包括输入层的输出, 还包括上一时刻隐藏层的输出。
RNN的发展
随着更加有效的循环神经网络结构(LSTM、GRU)等被不断提出,以RNN为基础的网络挖掘数据中的时序信息和语义信息的深度表达能力被充分利用,并广泛应用于情感分析、机器翻译、语言模型和语音识别等领域。
本文介绍的循环神经网络指的是简单RNN。
1. 循环神经网络结构
循环神经网络结构
下图展示了一个典型的循环神经网络结构图,主体结构A的输入除了来自输入层 x t x_t xt ,还有一个循环的边提供上一时刻的隐藏状态 h t − 1 h_{t-1} ht−1。在每一时刻,循环神经网络的模块A在读取了 x t x_t xt和 h t − 1 h_{t-1} ht−1之后,会生成新的隐藏状态 h t h_{t} ht ,并产生本时刻的输出 O t O_{t} Ot。
序列的保存逻辑
由于序列长度可以无限长,维度有限的 h t h_{t} ht状态不可能将序列的全部信息都保存下来,因此循环神经网络只保存与后面任务 O t , O t + 1 . . . O_{t},O_{t+1}... Ot,Ot+1...相关的最重要信息。卷积神经网络在
不同的空间位置共享参数
,循环神经网络是在不同的时间位置共享参数
,从而能够使用有限的参数处理任意长度的序列。
按时间展开后的结构
将循环神经网络按时间展开后如下图,RNN在每一个适合会有一个输入 x t x_t xt,然后根据前一时刻的隐藏状态 h t − 1 h_{t-1} ht−1,计算新的隐藏状态 h t h_t ht,并输出 O t O_t Ot,其中 h t − 1 h_{t-1} ht−1浓缩了之前序列 x 0 , x 1 , x t − 1 x_0,x_1,x_{t-1} x0,x1,xt−1的信息。
循环网络的展开在模型训练中有重要意义,假设序列长度为N,将RNN展开后可以视为一个有N个中间层的前馈神经网络模,可以利用反向传播算法进行训练。
2. 循环神经网络计算
从RNN的结构特征可以很容易看出它最擅长解决与时间序列相关的问题。对于一个序列数据,可以将这个序列上不同时刻的数据依次传入RNN的输入层,而输出可以是对序列中下一个时刻的预测,也可以是对当前时刻信息的处理结果,例如语音识别结果。
RNN中的状态是通过一个向量来表示的,这个向量的维度也称为RNN隐藏层的大小,假设其为n。
- 对于时间序列数据来说(例如不同时刻商品的销量),每一时刻的输入样例可以是当前时刻的数值(例如销量值);
- 对于语言模型来说,输入样例可以是当前单词对应的单词向量(Word Embedding)。
2.1. 机器翻译
RNN中每一个时刻的输入为需要翻译的句子中的单词。如下图,如果需要翻译的句子为ABCD,那么RNN第一段每一个时刻的输入就分别是A、 B、C 和 D,然后用“_”作为待翻译句子的结束符。
在第一段中,循环神经网络没有输出。从结束符“_”开始,循环神经网络进入翻译阶段。该阶段中每一个时刻的输入是上一个时刻的输出,如虚线所示,而最终得到的输出就是句子ABCD翻译的结果。从图中可以看到句子ABCD对应的翻译结果就是XYZ,当网络输出“_”时表示翻译结束。
2.2. 循环体:前向传播流程
RNN可以看做同一个神经网络结构(输入层-隐藏层-输出层)在时间序列上被复制多次的结果,这个被复制多次的结构称为循环体,如何设计循环体的网络结构是循环神经网络效果的关键,如简单RNN、LSTM和GRU等不同的神经网络关于循环体结构是不一致的。
如下图展示了简单RNN的循环体结构,这个循环体只使用了类似全连接层的网络结构,图中tanh作为激活函数的全连接层,下面通过下图所示的网络结构来标识RNN前向传播的完整流程。
上图所示的循环体包括两个全连接层,第一个包含在tanh内,第二个连接层用于当前时刻的输出。
- 当前的输入组合:
假设当前输入向量的维度是x,隐藏状态的维度为n,输入大小为n+x,也就是将前一段时刻的状态和当前时刻的输入拼接成了一个大的向量作为循环体中神经网络的输入。该部分的直接输出为隐藏状态,因此第一个全连接层的参数个数为
( n + x ) * n + n
。
- 当前输出组合
循环体除了提供给下一时刻的状态,还有当前时刻的输出,当前时刻的输出是下一个时刻的输入,维度为x。因此第二个全连接层的参数为
n * x + x
。
下图展示了RNN前向传播的具体分析:
h 0 h_0 h0的计算逻辑
- W x W_x Wx:拼接输入向量:初始hint[0,0] (二维)+ 输入1=[0,0,1]
- W x ∗ W r n n + b W_x*W_{rnn}+b Wx∗Wrnn+b带入到函数中: tanh ( x ) = e x − e − x e x + e − x \tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+e−xex−e−x
O
1
O_1
O1的计算:
O
1
=
W
0
h
0
+
B
o
O_1=W_0h_0+B_o
O1=W0h0+Bo,计算如下图
下图展示了RNN前向传播的具体计算过程
二. 长短时记忆网路(LSTM)
1. 产生背景
RNN的问题:无法很好的处理很长的序列数据
- 循环神经网络处理序列较短的数据效果较好,但是当序列较长时,RNN可能会丧失学习到长近距离信息的能力,比如用RNN构建模型预测下一个词,当预测the clouds are in the sky最后的词,这个时候其 实并不需要任何其他的上下文,因为下一个词很显然就应该是sky。但如果预测I grew up in China…I speak fluent Chinese最后的词。当前的信息建议下一个词可能是一种语言的名字, 但是如果我们需要弄清楚是什么语言,我们就需要离当前位置很远的 Chinese的上下文信息。
- 理论上,RNN可以处理这样的问题,但在实践中,即使仔细挑选参数,RNN也不能有效处理这种长期依赖问题。随着间隔不断增大,RNN会彻底丧失学习到连接远信息的能力。除此之外,RNN还容易出现梯度消失和梯度爆炸问题。(tanh函数的问题?)
长短时记忆网络的提出
由此,Hochreiter 和Schmidhuber提出了长短时记忆网络(Long Short-Term Memory, LSTM),本质上,LSTM是一种时间循环神经网络
。
LSTM可以
- 解决RNN中普遍存在的长期依赖问题
- 能有效传递和表达长时间序列中的信息并且不会导致长时间前的有效信息被忽略
- 解决RNN的梯度消失以及梯度爆炸的问题
2. LSTM的设计思想与LSTM的链式结构
2.1. LSTM的设计思想
LSTM的设计借鉴了人类对自然语言处理的直觉性经验,
- 在时间序列中,不是所有信息都等同有效,大多数情况存在“关键词”或“关键帧”,
- 我们在阅读时会自动概括已阅读部分的内容并且用之前的内容帮助理解后文。
基于这两点,LSTM提出了“长短期记忆”的概念,只有一部分信息需要长期记忆,而且还需要动态地处理神经网络的记忆,因为有的信息一开始价值很高,后面价值逐渐衰减,因此需要让神经网络学会遗忘特定的信息。
2.2. LSTM链式结构图与遗忘门
同循环神经网络一 样,LSTM也具有RNN重复模块链的形式,如下图。
假设输入的句子为I am from China.I am fluent in______。为了正确预测出下一 个单词Chinese,LSTM会更加关注上一句中的China并且利用神经元 (cell)对其进行记忆。在处理序列时神经元会对获取的信息进行存储,这些信息会用于预测下一个单词。
遗忘门的逻辑
LSTM网络节点中会单独设计一 个
“遗忘门”
,当遇到句号时,遗忘门会意识到句子中的上下文发生了改变,并忽略当前神经元中存储的状态信息。换句话说,遗忘门的作用是让循环神经网络“遗忘”之前没有用到的信息。
3. 长短时记忆网络结构
实际上,LSTM链式结构中每一个计算节点是一种拥有3个“门”结构的特殊网络结构,如下图。LSTM靠一些“门”的结构让信息有选择性地影响循环神经网络中每个时刻的状态。
门的结构
- “门”结构就是一个使用Sigmod神经网络和一个按位做乘法的运算,这两个操作合在一起就是一个“门”结构。
- 使用Sigmod作为激活函数的全连接神经网络层会输出一个0~1之间的数值,描述当前输入有多少信息量可以通过这个结构。当门打开时,如果Sigmoid神经网络层输出为1,则全部信息都可以通过。当门关上时,如果Sigmoid神经网络层输出为 0,则任何信息都无法通过。
遗忘门和输入门可以使神经网络更有效的保存需长期记忆的信息,遗忘门的作用是让网络忘记之前没有用的信息,根据当前输入
x
i
x_i
xi和上一时刻的输出
h
t
−
1
h_{t-1}
ht−1决定那一部分信息被遗忘,哪一部分信息被记忆。
1. 遗忘门
该门读取
x
t
和
h
t
−
1
x_t和h_{t-1}
xt和ht−1,输出一个0-1之间的数字,决定保存多少信息。1表示完全保留,0表示完全舍弃。
2. 输入门
3. 更新细胞状态
4. 输出门
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)