【人工智能基础08】循环神经网络(RNN)与长短时记忆网络(LSTM):处理和预测序列数据 文章目录一. RNN1. 循环神经网络结构2. 循环神经网络计算2.1. 机器翻译2.2. 循环体前向传播流程二. 长短时记忆网路LSTM1. 产生背景2. LSTM的设计思想与LSTM的链式结构2.1. LSTM的设计思想2.2. LSTM链式结构图与遗忘门3. 长短时记忆网络结构1. 遗忘门2. 输入门3. 更新细胞状态4. 输出门一. RNNRNN出现的原因与基本逻辑卷积神经网络模型层与层之间是全连接或部分连接的但每层之间的节点没有连接。考虑这样一个问题如果要预测一个句子的下一个单词是什么一般需要用到当前单词及前面的单词因为句子中前后单词并不是独立的。例如当前单词是“很”前一个单词是“天空”那么下一个单词很大概率是“蓝”。这样的应用CNN并不擅长。 由此出现了可以用来处理和预测序列数据的循环神经网络(RNN)。人类在阅读时会根据之前已经加过工过的信息来理解现在看到的文字与此类似RNN对信息的处理方式也是如此会记忆之前的信息并利用之前的信息影响后面节点的输出。体现在网络结构上RNN隐藏层之间的节点是有连接的隐藏层的输入不仅包括输入层的输出 还包括上一时刻隐藏层的输出。RNN的发展随着更加有效的循环神经网络结构LSTM、GRU等被不断提出以RNN为基础的网络挖掘数据中的时序信息和语义信息的深度表达能力被充分利用并广泛应用于情感分析、机器翻译、语言模型和语音识别等领域。本文介绍的循环神经网络指的是简单RNN。1. 循环神经网络结构循环神经网络结构下图展示了一个典型的循环神经网络结构图主体结构A的输入除了来自输入层x t x_txt​还有一个循环的边提供上一时刻的隐藏状态h t − 1 h_{t-1}ht−1​。在每一时刻循环神经网络的模块A在读取了x t x_txt​和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_{t1}...Ot​,Ot1​...相关的最重要信息。卷积神经网络在不同的空间位置共享参数循环神经网络是在不同的时间位置共享参数从而能够使用有限的参数处理任意长度的序列。按时间展开后的结构将循环神经网络按时间展开后如下图RNN在每一个适合会有一个输入x t x_txt​然后根据前一时刻的隐藏状态h t − 1 h_{t-1}ht−1​计算新的隐藏状态h t h_tht​并输出O t O_tOt​其中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输入大小为nx也就是将前一段时刻的状态和当前时刻的输入拼接成了一个大的向量作为循环体中神经网络的输入。该部分的直接输出为隐藏状态因此第一个全连接层的参数个数为( n x ) * n n。当前输出组合循环体除了提供给下一时刻的状态还有当前时刻的输出当前时刻的输出是下一个时刻的输入维度为x。因此第二个全连接层的参数为n * x x。下图展示了RNN前向传播的具体分析h 0 h_0h0​的计算逻辑W x W_xWx​拼接输入向量初始hint[0,0] (二维) 输入1[0,0,1]W x ∗ W r n n b W_x*W_{rnn}bWx​∗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)exe−xex−e−x​O 1 O_1O1​的计算O 1 W 0 h 0 B o O_1W_0h_0B_oO1​W0​h0​Bo​计算如下图下图展示了RNN前向传播的具体计算过程二. 长短时记忆网路LSTM1. 产生背景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______。为了正确预测出下一 个单词ChineseLSTM会更加关注上一句中的China并且利用神经元 (cell)对其进行记忆。在处理序列时神经元会对获取的信息进行存储这些信息会用于预测下一个单词。遗忘门的逻辑LSTM网络节点中会单独设计一 个“遗忘门”当遇到句号时遗忘门会意识到句子中的上下文发生了改变并忽略当前神经元中存储的状态信息。换句话说遗忘门的作用是让循环神经网络“遗忘”之前没有用到的信息。3. 长短时记忆网络结构实际上LSTM链式结构中每一个计算节点是一种拥有3个“门”结构的特殊网络结构如下图。LSTM靠一些“门”的结构让信息有选择性地影响循环神经网络中每个时刻的状态。门的结构“门”结构就是一个使用Sigmod神经网络和一个按位做乘法的运算这两个操作合在一起就是一个“门”结构。使用Sigmod作为激活函数的全连接神经网络层会输出一个0~1之间的数值描述当前输入有多少信息量可以通过这个结构。当门打开时如果Sigmoid神经网络层输出为1则全部信息都可以通过。当门关上时如果Sigmoid神经网络层输出为 0则任何信息都无法通过。遗忘门和输入门可以使神经网络更有效的保存需长期记忆的信息遗忘门的作用是让网络忘记之前没有用的信息根据当前输入x i x_ixi​和上一时刻的输出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. 输出门