长短期记忆神经网络(LSTM)介绍

   日期:2024-12-27    作者:metira 移动:http://3jjewl.riyuangf.com/mobile/quote/71470.html

长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问题,导致无法处理较长序列数据,从而无法获取长距离数据的信息。

长短期记忆神经网络(LSTM)介绍

LSTM主要用于处理序列数据,广泛应用于自然语言处理(NLP)、时间序列预测、语音识别、机器翻译、生成图像描述和视频标记等领域。具体来说,LSTM在以下任务中表现出色

  • 语言模型:预测序列中的下一个词或字符。
  • 文本生成:根据输入生成相应的文本序列。
  • 时间序列预测:如股票价格、气象数据的预测。
  • 语音识别:将语音信号转化为文本。
  • 机器翻译:将一种语言翻译成另一种语言。

2009年, 应用LSTM搭建的神经网络模型赢得了ICDAR手写识别比赛冠军。

2015年以来,在机械故障诊断和预测领域,相关学者应用LSTM来处理机械设备的振动信号。

2016年, 谷歌公司应用LSTM来做语音识别和文字翻译,其中Google翻译用的就是一个7-8层的LSTM模型。

2016年, 苹果公司使用LSTM来优化Siri应用。

1997年,Sepp Hochreiter 和 Jürgen Schmidhuber[1]提出了长短期记忆神经网络(LSTM),有效解决了RNN难以解决的人为延长时间任务的问题,并解决了RNN容易出现梯度消失的问题。

1999年,Felix A. Gers等人[2]发现[1]中提出的LSTM在处理连续输入数据时,如果没有重置网络内部的状态,最终会导致网络崩溃。因此,他们在文献[1]基础上引入了遗忘门机制,使得LSTM能够重置自己的状态。

2000年,Felix A. Gers和Jiirgen Schmidhuber[3]发现,通过在LSTM内部状态单元内添加窥视孔(Peephole)连接,可以增强网络对输入序列之间细微特征的区分能力。

2005年,Alex Graves和Jürgen Schmidhuber[4]在文献[1] [2] [3]的基础上提出了一种双向长短期记忆神经网络(BLSTM,也称为vanilla LSTM,是当前应用最广泛的一种LSTM模型。

2005年-2015年期间,相关学者提出了多种LSTM变体模型,此处不多做描述。

2016年,Klaus Greff 等人[5]回顾了LSTM的发展历程,并比较分析了八种LSTM变体在语音识别、手写识别和弦音乐建模方面的能力,实验结果表明这些变体不能显著改进标准LSTM体系结构,并证明了遗忘门和输出激活功能是LSTM的关键组成部分。在这八种变体中,vanilla LSTM的综合表现能力最佳。另外,还探索了LSTM相关超参数的设定影响,实验结果表明学习率是最关键的超参数,其次是网络规模(网络层数和隐藏层单元数,而动量梯度等设置对最终结果影响不大。

下图展示了Simple RNN(图左)和vanilla LSTM(图右,图中蓝色线条表示窥视孔连接)的基本单元结构图[5]

在众多LSTM变体中,2014年Kyunghyun Cho等人[6]提出的变体引起了众多学者的关注。Kyunghyun Cho等人简化了LSTM架构,称为门控递归单元(GRU)。GRU摆脱了单元状态,基本结构由重置门和更新门组成。LSTM和GRU的基本结构单元如下图(具体可参考:Illustrated Guide to LSTM’s and GRU’s: A step by step explanation)。

在GRU被提出后,Junyoung Chung等人[7]比较了LSTM和GRU在复音音乐和语音信号建模方面的能力,实验结果表明GRU和LSTM表现相当。

GRU被提出至今(2019年,也只有几年时间,关于它的一些应用利弊到目前还未探索清楚。不过,相对于LSTM架构,GRU的的参数较少,在数据量较大的情况下,其训练速度更快。

LSTM是深度学习技术中的一员,其基本结构比较复杂,计算复杂度较高,导致较难进行较深层次的学习,例如谷歌翻译也只是应用7-8层的LSTM网络结构。另外,在训练学习过程中有可能会出现过拟合,可以通过应用dropout来解决过拟合问题(这在Keras等框架中均有实现,具体可参考:LSTM原理与实践,原来如此简单)。

LSTM在当前应用比较的结构是双向LSTM或者多层堆叠LSTM,这两种结构的实现在Keras等框架中均有对应的API可以调用。

下图展示一个堆叠两层的LSTM结构图(来源:运用TensorFlow处理简单的NLP问题

下图展示了一个双向LSTM的结构图(来源:双向LSTM

本节首先讲解一下RNN的基本结构,然后说明LSTM的具体原理(下面要介绍的LSTM即为vanilla LSTM)。

循环神经网络(下面简称RNN)可以通过不停的将信息循环操作,保证信息持续存在。原始的RNN基本结构图如下图所示(原图来源:Understanding LSTM Networks)。

可以看出A是一组神经网络(可以理解为一个网络的自循环,它的工作是不停的接收Xt并且输出ht。从上图左中可以看出A允许将信息不停的再内部循环,这样使得它可以保证每一步的计算都保存以前的信息。

将RNN的自循环结构展开,像是将同一个网络复制并连成一条线的结构,将自身提取的信息传递给下一个继承者,RNN展开后(上图右)由多个相同的单元连续连接。RNN的实际结构和上图左边的结构所示,是一个自我不断循环的结构。随着输入数据的不断增加,上述自我循环的结构把上一次的状态传递给当前输入,一起作为新的输入数据进行当前轮次的训练和学习,一直到输入或者训练结束,最终得到的输出即为最终的预测结果。

一般来说,RNN的输入和输出都是一个序列,分别记为seqin={x1,x2,...,xn}和 seqout={o1,o2,...,on},同时ot的取值不仅与xt有关还与序列中更早的输入有关(序列中的第t个元素我们叫做序列在time_step=t时的取值)。更直观的理解可看下图

把上图用公式表达就是

S[t]=f(U⋅X[t]+W⋅S[t−1]),Ot=g(V⋅S[t]) 

有时候我们需要利用近期的信息来执行来处理当前的任务。例如,考虑用一个语言模型通过利用以前的文字信息来预测下一个文字。如果我们需要预测“the clouds are in the sky”这句话的最后一个字,我们不需要其他的信息,通过前面的语境就能知道最后一个字应该是sky。在这种情况下,相关信息与需要该信息的位置距离较近,RNNs能够学习利用以前的信息来对当前任务进行相应的操作。如下图所示通过输入的X1、X2信息来预测出h3。

假设现在有个更为复杂的任务,考虑到下面这句话“I grew up in France… I speak fluent French.”,现在需要语言模型通过现有以前的文字信息预测该句话的最后一个字。通过以前文字语境可以预测出最后一个字是某种语言,但是要猜测出French,要根据之前的France语境。这样的任务,不同之前,因为这次的有用信息与需要进行处理信息的地方之间的距离较远,这样容易导致RNNs不能学习到有用的信息,最终推导的任务可能失败。如下图所示。

理论上RNN是能够处理这种“长依赖”问题的。通过BPTT去优化、或调参来解决这种问题。但是在实践过程中RNN无法学习到这种特征。但是当序列过长时很容易引起梯度爆炸或梯度消失现象。

LSTM是一种特殊的RNN,两者的区别在于普通的RNN单个循环结构内部只有一个状态。而LSTM的单个循环结构(又称为细胞)内部有四个状态。相比于RNN,LSTM循环结构之间保持一个持久的单元状态不断传递下去,用于决定哪些信息要遗忘或者继续传递下去。

包含三个连续循环结构的RNN如下图,每个循环结构只有一个输出

包含三个连续循环结构的LSTM如下图,每个循环结构有两个输出,其中一个即为单元状态

一层LSTM是由单个循环结构结构组成,既由输入数据的维度和循环次数决定单个循环结构需要自我更新几次,而不是多个单个循环结构连接组成(此处关于这段描述,在实际操作的理解详述请参考:Keras关于LSTM的units参数,还是不理解? ,即当前层LSTM的参数总个数只需计算一个循环单元就行,而不是计算多个连续单元的总个数。

在解释LSTMs的详细结构时先定义一下图中各个符号的含义,符号包括下面几种

图中黄色类似于CNN里的激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,箭头合并表示向量的合并(concat)操作,箭头分叉表示向量的拷贝操作。

LSTMs的核心是细胞状态,用贯穿细胞的水平线表示。细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNN。细胞状态如下图所示L

LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。

门能够有选择性的决定让哪些信息通过。其实门的结构很简单,就是一个sigmoid层和一个点乘操作的组合。如下图所示

因为sigmoid层的输出是0-1的值,这代表有多少信息能够流过sigmoid层。0表示都不能通过,1表示都能通过。一个LSTM里面包含三个门来控制细胞状态。

下面将由一组图来详细结构LSTM细胞的基本组成和实现原理。LSTM细胞由输入门、遗忘门、输出门和单元状态组成。

  • 输入门:决定当前时刻网络的输入数据有多少需要保存到单元状态。
  • 遗忘门:决定上一时刻的单元状态有多少需要保留到当前时刻。
  • 输出门:控制当前单元状态有多少需要输出到当前的输出值。

此外,LSTM还有一个记忆单元(Cell State,用于保存跨时间步长的信息。通过这些门控机制,LSTM能够在时间步长之间灵活地存储和删除信息,从而有效解决了长时间依赖问题。

LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为忘记门的sigmoid单元来处理的。它通过查看h_(t-1)和x_t信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。忘记门如下图所示, 展示了应用上一个时刻的输出h_(t-1)和当前的数据输入x_t,通过遗忘门得到f_t的过程。(下面的一组原图来源:Understanding LSTM Networks

下一步是决定给细胞状态添加哪些新的信息。这一步又分为两个步骤,首先,利用h_(t-1)和x_t通过一个称为输入门的操作来决定更新哪些信息。然后利用h_(t-1)和x_t通过一个tanh层得到新的候选细胞信息C~t,这些信息可能会被更新到细胞信息中。这两步描述如下图所示,展示了应用上一个时刻的输出h_(t-1)和当前的数据输入x_t,通过输入门得到i_t,以及通过单元状态得到当前时刻暂时状态C~t的过程。

下面将更新旧的细胞信息C_(t-1),变为新的细胞信息C_t。更新的规则就是通过忘记门选择忘记旧细胞信息的一部分,通过输入门选择添加候选细胞信息C~t的一部分得到新的细胞信息C_t。更新操作如下图所示,展示了应用上一个细胞结构的单元状态C_(t-1)、遗忘门输出f_t、输入门输出i_t以及单元状态的输出C~t,得到当前细胞的状态C_t的过程。

更新完细胞状态后需要根据输入的h_(t-1)和x_t来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个-1~1之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。该步骤如下图所示,展示了应用上一个时刻的输出h_(t-1)和当前的数据输入x_t,通过输出门得到o_t的过程,以及结合当前细胞的单元状态C_t和o_t得到最终的输出h_t的过程。

拿语言模型来举例说明,在预测动词形式的时候,我们需要通过输入的主语是单数还是复数来推断输出门输出的预测动词是单数形式还是复数形式。 

 之前描述的LSTM结构是最为普通的。在实际的文章中LSTM的结构存在各种变式,虽然变化都不会太大,但是也值得一提。

其中一种比其他形式变化更为显著的LSTM变式是由 Cho, et al. (2014)提出的门循环单元(GRU)。它将忘记门和输入门合并成一个新的门,称为更新门。GRU还有一个门称为重置门。如下图所示

其中重置门为上图中前面那个门,决定了如何将新的输入信息与前面的记忆相结合。更新门为上图中后面那个门,定义了前面记忆保存到当前时间步的量。由于该变式的简单有效,后来被广泛应用。

这里介绍的只是一些较为有名的LSTM变式,关于LSTM的变式其实还有很多种,像 Yao, et al. (2015)提出的Depth Gated RNNs。还有其他用于解决长依赖问题的方法,如由 Koutnik, et al. (2014)提出的 Clockwork RNNs。

优点

  • 解决长时依赖问题:相比于传统RNN,LSTM能够更好地捕捉序列中的长时依赖关系。
  • 适用性广泛:LSTM可以处理不同类型的序列数据,如文本、语音、时间序列等。
  • 在复杂任务中的表现更好:如机器翻译、图像字幕生成等任务。

缺点

  • 计算开销大:LSTM结构复杂,计算量大,训练时间较长。
  • 难以调参:LSTM模型包含多个超参数,如层数、隐藏单元数量等,调参较为复杂。
  • 容易过拟合:由于模型复杂,训练时容易发生过拟合,需要加入正则化手段。

5.1、简单的LSTM示例代码

以下是一个使用Python和Keras库实现LSTM的简单示例代码,来完成一个基本的时间序列预测任务

 

代码解释
数据生成:generate_data函数生成了一些模拟的正弦波数据作为训练集。
LSTM模型:模型包含一个LSTM层和一个Dense层,用于输出预测值。
模型训练:使用MSE(均方误差)作为损失函数,Adam优化器进行训练。
测试和可视化:用训练好的模型对一个完整的正弦波进行预测,并与真实值进行对比。
这个示例展示了LSTM如何被应用于一个简单的时间序列预测任务中。根据任务的复杂度,LSTM模型的层数、单元数以及其他超参数可以进行调整。

5.2、基于Keras框架的手写数字识别实验

本节应用Keras提供的API,比较和分析Simple RNN、LSTM和GRU在手写数字mnist数据集上的预测准确率。

应用Simple RNN进行手写数字预测训练的代码如下

 

训练结果

 

可知Simple RNN在测试集上的最终预测准确率为97.33%。

只需修改下方代码中Simple RNN为LSTM,即可调用LSTM进行模型训练

 

改变为

 

训练结果

 

可知LSTM在测试集上的最终预测准确率为98.67%。

采用同样的思路,把Simple RNN改为GRU,即可调用GRU进行模型训练。

训练结果

 

可知GRU在测试集上的最终预测准确率为98.79%。

由上述实验结果可知,LSTM和GRU的预测准确率要显著高于Simple RNN,而LSTM和GRU的预测准确率相差较小。

5.3、基于Pytorch的实战

5.3.1、核心API

 

其构造器的参数列表如下

  • input_size – 每个time step中其输入向量xt的维度。
  • hidden_size – 每个time step中其隐藏状态向量ht的维度。
  • num_layers – 每个time step中其纵向有几个LSTM单元,默认为1。如果取2,第二层的 xt是第一层的ht,有时也会加一个dropout因子。
  • bias – 如果为False,则计算中不用偏置,默认为True。
  • batch_first –若为True,则实际调用时input和output张量格式为(batch, seq, feature),默认为False。
  • dropout – 是否加dropout,Default: 0。
  • bidirectional – 是否为双向LSTM,Default: False。

定义了模型,实际调用按如下方式

 

注意上述代码中
1)h_0, c_0分别代表batch中每个元素的hidden state和cell state的初始化值。

2)h_n, c_n分别代表当t = seq_len时,hidden state和cell state的值。

3)如果batch_first=False时,input格式为:(seq_len, batch=1, input_size),output格式为:(seq_len, batch=1, num_directions * hidden_size)。但是当batch_first=True时,input的格式变为:(batch_size, seq_len, input_size),而output的格式变为:(batch_size, seq_len, num_directions * hidden_size)。

5.3.2、LSTM实战

1)简单demo

 

2)完整demo

 


参考文献

[1] S. Hochreiter and J. Schmidhuber, “Long Short-Term Memory,” Neural Comput, vol. 9, no. 8, pp. 1735–1780, Nov. 1997.

[2] F. A. Gers, J. Schmidhuber, and F. A. Cummins, “Learning to Forget: Continual Prediction with LSTM,” Neural Comput., vol. 12, pp. 2451–2471, 2000.

[3] F. A. Gers and J. Schmidhuber, “Recurrent nets that time and count,” Proc. IEEE-INNS-ENNS Int. Jt. Conf. Neural Netw. IJCNN 2000 Neural Comput. New Chall. Perspect. New Millenn., vol. 3, pp. 189–194 vol.3, 2000.

[4] A. Graves and J. Schmidhuber, “Framewise phoneme classification with bidirectional LSTM and other neural network architectures,” Neural Netw., vol. 18, no. 5, pp. 602–610, Jul. 2005.

[5] K. Greff, R. K. Srivastava, J. Koutník, B. R. Steunebrink, and J. Schmidhuber, “LSTM: A Search Space Odyssey,” IEEE Trans. Neural Netw. Learn. Syst., vol. 28, no. 10, pp. 2222–2232, Oct. 2017.

[6] K. Cho et al., “Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation,” ArXiv14061078 Cs Stat, Jun. 2014.

[7] J. Chung, C. Gulcehre, K. Cho, and Y. Bengio, “Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling,” ArXiv14123555 Cs, Dec. 2014.

参考链接

长短期记忆神经网络(LSTM)介绍以及简单应用分析「建议收藏」-腾讯云开发者社区-腾讯云

LSTM原理及实战 - 知乎

LSTM--概念、作用、原理、优缺点以及简单的示例代码_lstm一般用来处理什么数据-CSDN博客


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号