赞
踩
刚好毕设相关,论文写完顺手就答了
先给出一个最快的了解+上手的教程:
直接看theano官网的LSTM教程+代码:LSTM Networks for Sentiment Analysis
但是,前提是你有RNN的基础,因为LSTM本身不是一个完整的模型,LSTM是对RNN隐含层的改进。一般所称的LSTM网络全叫全了应该是使用LSTM单元的RNN网络。教程就给了个LSTM的图,它只是RNN框架中的一部分,如果你不知道RNN估计看不懂。
比较好的是,你只需要了解前馈过程,你都不需要自己求导就能写代码使用了。
补充,今天刚发现一个中文的博客:LSTM简介以及数学推导(FULL BPTT)
不过,稍微深入下去还是得老老实实的好好学,下面是我认为比较好的
完整LSTM学习流程:
我一直都觉得了解一个模型的前世今生对模型理解有巨大的帮助。到LSTM这里(假设题主零基础)那比较好的路线是MLP->RNN->LSTM。还有LSTM本身的发展路线(97年最原始的LSTM到forget gate到peephole再到CTC )
按照这个路线学起来会比较顺,所以我优先推荐的两个教程都是按照这个路线来的:
还有一个最新的(今年2015)的综述,《A Critical Review of Recurrent Neural Networks for Sequence Learning》不过很多内容都来自以上两个材料。
其他可以当做教程的材料还有:
《From Recurrent Neural Network to Long Short Term Memory Architecture Application to Handwriting Recognition Author》
《Generating Sequences With Recurrent Neural Networks》(这个有对应源码,虽然实例用法是错的,自己用的时候还得改代码,主要是摘出一些来用,供参考)
然后呢,可以开始编码了。除了前面提到的theano教程还有一些论文的开源代码,到github上搜就好了。
顺便安利一下theano,theano的自动求导和GPU透明对新手以及学术界研究者来说非常方便,LSTM拓扑结构对于求导来说很复杂,上来就写LSTM反向求导还要GPU编程代码非常费时间的,而且搞学术不是实现一个现有模型完了,得尝试创新,改模型,每改一次对应求导代码的修改都挺麻烦的。
其实到这应该算是一个阶段了,如果你想继续深入可以具体看看几篇经典论文,比如LSTM以及各个改进对应的经典论文。
还有楼上提到的《LSTM: A Search Space Odyssey》 通过从新进行各种实验来对比考查LSTM的各种改进(组件)的效果。挺有意义的,尤其是在指导如何使用LSTM方面。
不过,玩LSTM,最好有相应的硬件支持。我之前用Titan 780,现在实验室买了Titan X,应该可以说是很好的配置了(TitanX可以算顶配了)。但是我任务数据量不大跑一次实验都要好几个小时(前提是我独占一个显卡),(当然和我模型复杂有关系,LSTM只是其中一个模块)。
===========================================
如果想玩的深入一点可以看看LSTM最近的发展和应用。老的就不说了,就提一些比较新比较好玩的。
LSTM网络本质还是RNN网络,基于LSTM的RNN架构上的变化有最先的BRNN(双向),还有今年Socher他们提出的树状LSTM用于情感分析和句子相关度计算《Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks》(类似的还有一篇,不过看这个就够了)。他们的代码用Torch7实现,我为了整合到我系统里面自己实现了一个,但是发现效果并不好。我觉的这个跟用于建树的先验信息有关,看是不是和你任务相关。还有就是感觉树状LSTM对比BLSTM是有信息损失的,因为只能使用到子节点信息。要是感兴趣的话,这有一篇树状和线性RNN对比《(treeRNN vs seqRNN )When Are Tree Structures Necessary for Deep Learning of Representations?》。当然,关键在于树状这个概念重要,感觉现在的研究还没完全利用上树状的潜力。
今年ACL(2015)上有一篇层次的LSTM《A Hierarchical Neural Autoencoder for Paragraphs and Documents》。使用不同的LSTM分别处理词、句子和段落级别输入,并使用自动编码器(autoencoder)来检测LSTM的文档特征抽取和重建能力。
记忆单元方面,Bahdanau Dzmitry他们在构建RNN框架的机器翻译模型的时候使用了GRU单元(gated recurrent unit)替代LSTM,其实LSTM和GRU都可以说是gated hidden unit。两者效果相近,但是GRU相对LSTM来说参数更少,所以更加不容易过拟合。(大家堆模型堆到dropout也不管用的时候可以试试换上GRU这种参数少的模块)。这有篇比较的论文《(GRU/LSTM对比)Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling》
应用嘛,宽泛点来说就是挖掘序列数据信息,大家可以对照自己的任务有没有这个点。比如(直接把毕设研究现状搬上来(。・∀・)ノ゙):
先看比较好玩的,
图像处理(对,不用CNN用RNN):
《Visin F, Kastner K, Cho K, et al. ReNet: A Recurrent Neural Network Based Alternative to Convolutional Networks[J]. arXiv preprint arXiv:1505.00393, 2015》
4向RNN(使用LSTM单元)替代CNN。
使用LSTM读懂python程序:
《Zaremba W, Sutskever I. Learning to execute[J]. arXiv preprint arXiv:1410.4615, 2014.》
使用基于LSTM的深度模型用于读懂python程序并且给出正确的程序输出。文章的输入是短小简单python程序,这些程序的输出大都是简单的数字,例如0-9之内加减法程序。模型一个字符一个字符的输入python程序,经过多层LSTM后输出数字结果,准确率达到99%
手写识别:
《Liwicki M, Graves A, Bunke H, et al. A novel approach to on-line handwriting recognition based on bidirectional long short-term memory》
机器翻译:
《Sutskever I, Vinyals O, Le Q V V. Sequence to sequence learning with neural networks[C]//Advances in neural information processing systems. 2014: 3104-3112.》
使用多层LSTM构建了一个seq2seq框架(输入一个序列根据任务不同产生另外一个序列),用于机器翻译。先用一个多层LSTM从不定长的源语言输入中学到特征v。然后使用特征v和语言模型(另一个多层LSTM)生成目标语言句子。
《Cho K, Van Merriënboer B, Gulcehre C, et al. Learning phrase representations using rnn encoder-decoder for statistical machine translation[J]. arXiv preprint arXiv:1406.1078, 2014.》
这篇文章第一次提出GRU和RNN encoder-decoder框架。使用RNN构建编码器-解码器(encoder-decoder)框架用于机器翻译。文章先用encoder从不定长的源语言输入中学到固定长度的特征V,然后decoder使用特征V和语言模型解码出目标语言句子
以上两篇文章提出的seq2seq和encoder-decoder这两个框架除了在机器翻译领域,在其他任务上也被广泛使用。
《Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.》
在上一篇的基础上引入了BRNN用于抽取特征和注意力信号机制(attention signal)用于源语言和目标语言的对齐。
对话生成:
《Shang L, Lu Z, Li H. Neural Responding Machine for Short-Text Conversation[J]. arXiv preprint arXiv:1503.02364, 2015.》
华为诺亚方舟实验室,李航老师他们的作品。基本思想是把对话看成是翻译过程。然后借鉴Bahdanau D他们的机器翻译方法(encoder-decoder,GRU,attention signal)解决。训练使用微博评论数据。
《VINYALS O, LE Q,.A Neural Conversational Model[J]. arXiv:1506.05869 [cs], 2015.》
google前两天出的论文(2015-6-19)。看报道说结果让人觉得“creepy”: Google's New Chatbot Taught Itself to Be Creepy 。还以为有什么NB模型,结果看了论文发现就是一套用 seq2seq框架的实验报告。(对话可不是就是你一句我一句,一个序列对应产生另一序列么)。论文里倒是说的挺谨慎的,只是说纯数据驱动(没有任何规则)的模型能做到这样不错了,但还是有很多问题,需要大量修改(加规则呗?)。主要问题是缺乏上下文一致性。(模型只用对话的最后一句来产生下一句也挺奇怪的,为什么不用整个对话的历史信息?)句法分析:
《Vinyals O, Kaiser L, Koo T, et al. Grammar as a foreign language[J]. arXiv preprint arXiv:1412.7449, 2014.》
把LSTM用于句法分析任务,文章把树状的句法结构进行了线性表示,从而把句法分析问题转成翻译问题,然后套用机器翻译的seq2seq框架使用LSTM解决。
信息检索:
《Palangi H, Deng L, Shen Y, et al. Deep Sentence Embedding Using the Long Short Term Memory Network: Analysis and Application to Information Retrieval[J]. arXiv preprint arXiv:1502.06922, 2015.》
使用LSTM获得大段文本或者整个文章的特征向量,用点击反馈来进行弱监督,最大化query的特性向量与被点击文档的特性向量相似度的同时最小化与其他未被点击的文档特性相似度。
图文转换:
图文转换任务看做是特殊的图像到文本的翻译问题,还是使用encoder-decoder翻译框架。不同的是输入部分使用卷积神经网络(Convolutional Neural Networks,CNN)抽取图像的特征,输出部分使用LSTM生成文本。对应论文有:
《Karpathy A, Fei-Fei L. Deep visual-semantic alignments for generating image descriptions[J]. arXiv preprint arXiv:1412.2306, 2014.》
《Mao J, Xu W, Yang Y, et al. Deep captioning with multimodal recurrent neural networks (m-rnn)[J]. arXiv preprint arXiv:1412.6632, 2014.》
《Vinyals O, Toshev A, Bengio S, et al. Show and tell: A neural image caption generator[J]. arXiv preprint arXiv:1411.4555, 2014.》
就粘这么多吧,呼呼~复制粘贴好爽\(^o^)/~
其实,相关工作还有很多,各大会议以及arxiv上不断有新文章冒出来,实在是读不过来了。。。
然而我有种预感,说了这么多,工作之后很有可能发现:
这些东西对我工作并没有什么卵用 (>﹏<=
# 理解LSTM网络
## 周期神经网络(Recurrent Neural Networks)
人类并非每一秒都在从头开始思考问题。当你阅读这篇文章时,你是基于之前的单词来理解每个单词。你并不会把所有内容都抛弃掉,然后从头开始理解。你的思考具有持久性。
传统的神经网络并不能做到这一点,这似乎是其一个主要的缺点。例如,想象你要把一部电影里面每个时间点所正在发生的事情进行分类。并不知道传统神经网络怎样才能把关于之前事件的推理运用到之后的事件中去。
周期神经网络解决了这个问题。它们是一种具有循环的网络,具有保持信息的能力。![]()
**如上图**所示,神经网络的模块*A*输入为,输出为
。模块*A*的循环结构使得信息从网络的上一步传到了下一步。
这个循环使周期神经网络看起来有点神秘。然而,如果你仔细想想就会发现它与普通的神经网络并没有太大不同。周期神经网络可以被认为是相同网络的多重复制结构,每一个网络把消息传给其继承者。如果我们把循环体展开就是这样,**如图所示**:![]()
这种链式属性表明,周期神经网络与序列之间有着紧密的联系。这也是运用这类数据最自然的结构。
当然它们已经得到了应用!过去几年中,RNNs已经被成功应用于各式各样的问题中:语音识别,语言建模,翻译,图像标注…等等。RNNs取得的各种瞩目成果可以参看Andrej Karpathy的博客:[The Unreasonable Effectiveness of Recurrent Neural Networks]( The Unreasonable Effectiveness of Recurrent Neural Networks)。确实效果让人非常吃惊。
取得这项成功的一个要素是『LSTMs』,这是一种非常特殊的周期神经网络,对于许多任务,比标准的版本要有效得多。几乎所有基于周期神经网络的好成果都使用了它们。本文将着重介绍LSTMs。
## 长期依赖问题(The Problem of Long-Term Dependencies)
RNNs的一个想法是,它们可能会能够将之前的信息连接到现在的任务之中。例如用视频前一帧的信息可以用于理解当前帧的信息。如果RNNs能够做到这些,那么将会非常使用。但是它们可以吗?这要看情况。
有时候,我们处理当前任务仅需要查看当前信息。例如,设想又一个语言模型基于当前单词尝试着去预测下一个单词。如果我们尝试着预测『the clouds are i n the *sky*』的最后一个单词,我们并不需要任何额外的信息了-很显然下一个单词就是『天空』。这样的话,如果目标预测的点与其相关信息的点之间的间隔较小,RNNs可以学习利用过去的信息。
但是也有时候我们需要更多的上下文信息。设想预测这句话的最后一个单词:『I grew up in France… I speak fluent *French*』。最近的信息表明下一个单词似乎是一种语言的名字,但是如果我们希望缩小确定语言类型的范围,我们需要更早之前作为France 的上下文。而且需要预测的点与其相关点之间的间隔非常有可能变得很大,**如图所示**:
![]()
不幸的是,随着间隔增长,RNNs变得难以学习连接之间的关系了,**如图所示**:![]()
理论上来说,RNNs绝对能够处理这种『长期依赖』。人们可以小心选取参数来解决这种类型的小模型。悲剧的是,事实上,RNNs似乎并不能学习出来这些参数。这个问题已经在[Hochreiter (1991) [German]]( http://people.idsia.ch/~juergen/SeppHochreiter1991ThesisAdvisorSchmidhuber.pdf)与[Bengio, et al. (1994)]( http://www-dsi.ing.unifi.it/~paolo/ps/tnn-94-gradient.pdf)中被深入讨论,他们发现了为何RNNs不起作用的一些基本原因。
幸运的是,LSTMs可以解决这个问题!
## LSTM网络
长短时间记忆网络(Long Short Term Memory networks)——通常成为『LSTMs』——是一种特殊的RNN,它能够学习长时间依赖。它们由[Hochreiter & Schmidhuber (1997)]( http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf)提出,后来由很多人加以改进和推广。他们在大量的问题上都取得了巨大成功,现在已经被广泛应用。
LSTMs是专门设计用来避免长期依赖问题的。记忆长期信息是LSTMs的默认行为,而不是它们努力学习的东西!
所有的周期神经网络都具有链式的重复模块神经网络。在标准的RNNs中,这种重复模块具有非常简单的结构,比如是一个tanh层,**如图所示**:
![]()
LSTMs同样具有链式结构,但是其重复模块却有着不同的结构。不同于单独的神经网络层,它具有4个以特殊方式相互影响的神经网络层,**如图所示**:
![]()
不要担心接下来涉及到的细节。我们将会一步步讲解LSTM的示意图。下面是我们将要用到的符号,**如图所示**:
![]()
在上图中,每一条线代表一个完整的向量,从一个节点的输出到另一个节点的输入。粉红色圆形代表了逐点操作,例如向量求和;黄色方框代表学习出得神经网络层。聚拢的线代表了串联,而分叉的线代表了内容复制去了不同的地方。
## LSTMs背后的核心思想
LSTMs的关键在于细胞状态,在图中以水平线表示。
细胞状态就像一个传送带。它顺着整个链条从头到尾运行,中间只有少许线性的交互。信息很容易顺着它流动而保持不变。**如图所示**:
![]()
LSTM通过称之为门(gates)的结构来对细胞状态增加或者删除信息。
门是选择性让信息通过的方式。它们的输出有一个sigmoid层和逐点乘积操作,**如图所示**:
![]()
Sigmoid 层的输出在0到1之间,定义了各成分被放行通过的程度。0值意味着『不让任何东西过去』;1值意味着『让所有东西通过』。
一个LSTM具有3种门,用以保护和控制细胞状态。
## 逐步讲解LSTM
LSTM的第一步是决定我们要从细胞中抛弃何种信息。这个决定是由叫做『遗忘门』的sigmoid层决定的。它以和
为输入,在
细胞输出一个介于0和1之间的数。其中1代表『完全保留』,0代表『完全遗忘』。
让我们回到之前那个语言预测模型的例子,这个模型尝试着根据之前的单词学习预测下一个单词。在这个问题中,细胞状态可能包括了现在主语的性别,因此能够使用正确的代词。当我们见到一个新的主语时,我们希望它能够忘记之前主语的性别。**如图所示**:
![]()
下一步是决定细胞中要存储何种信息。它有2个组成部分。首先,由一个叫做『输入门层』的sigmoid层决定我们将要更新哪些值。其次,一个tanh层创建一个新的候选向量,它可以加在状态之中。在下一步我们将结合两者来生成状态的更新。
在语言模型的例子中,我们希望把新主语的性别加入到状态之中,从而取代我们打算遗忘的旧主语的性别,**如图所示**:
![]()
现在我们可以将旧细胞状态更新为
了。之前的步骤已经决定了该怎么做,我们现在实际操作一下。
我们把旧状态乘以,用以遗忘之前我们决定忘记的信息。然后我们加上
。这是新的候选值,根据我们决定更新状态的程度来作为放缩系数。
在语言模型中,这里就是我们真正丢弃关于旧主语性别信息以及增添新信息的地方,**如图所示**:
![]()
最终,我们可以决定输出哪些内容。输出取决于我们的细胞状态,但是以一个过滤后的版本。首先,我们使用sigmoid层来决定我们要输出细胞状态的哪些部分。然后,把用tanh处理细胞状态(将状态值映射到-1至1之间)。最后将其与sigmoid门的输出值相乘,从而我们能够输出我们决定输出的值。**如图所示**:
![]()
对于语言模型,在预测下一个单词的例子中,当它输入一个主语,它可能会希望输出相关的动词。例如,当主语是单数或复数时,它可能会以相应形式的输出。
## 各种LSTM的变化形式
目前我所描述的都是普通的LSTM。然而并非所有的LSTM都是一样的。事实上,似乎每一篇使用LSTMs的文章都有些细微差别。这些差别很小,但是有些值得一提。
其中一个流行的LSTM变化形式是由[Gers & Schmidhuber (2000)](ftp://ftp.idsia.ch/pub/juergen/TimeCount-IJCNN2000.pdf)提出,增加了『窥视孔连接(peephole connections)』。**如图所示**:
![]()
在上图中,所有的门都加上了窥视孔,但是许多论文中只在其中一些装了窥视孔。
另一个变种是使用了配对遗忘与输入门。与之前分别决定遗忘与添加信息不同,我们同时决定两者。只有当我们需要输入一些内容的时候我们才需要忘记。只有当早前信息被忘记之后我们才会输入。**如图所示**:
![]()
LSTM一个更加不错变种是 Gated Recurrent Unit(GRU),是由[Cho, et al. (2014)]( http://arxiv.org/pdf/1406.1078v3.pdf)提出的。这个模型将输入门与和遗忘门结合成了一个单独的『更新门』。而且同时还合并了细胞状态和隐含状态,同时也做了一下其他的修改。因此这个模型比标准LSTM模型要简单,并且越来越收到欢迎。**如图所示**:
![]()
这些仅仅只是LSTM的少数几个著名变种。还有很多其他的种类,例如由[Yao, et al. (2015)]( http://arxiv.org/pdf/1508.03790v2.pdf) 提出的Depth Gated RNNs 。以及处理长期依赖问题的完全不同的手段,如[Koutnik, et al. (2014)]( http://arxiv.org/pdf/1402.3511v1.pdf)提出的Clockwork RNNs。
那种变种是最好的?这些不同重要吗?[Greff, et al. (2015)]( http://arxiv.org/pdf/1503.04069.pdf) 将各种著名的变种做了比较,发现其实基本上是差不多的。[Jozefowicz, et al. (2015)]( http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf) 测试了超过一万种RNN结构,发现了一些在某些任务上表现良好的模型。
## 结论
最开始我提到的杰出成就都是使用RNNs做出的。本质上所有这些成果都是使用了LSTMs。在大多数任务中,它们的表现确实非常优秀!
以公式的形式写下来,LSTMs看起来非常令人胆怯。然而通过本文的逐步讲解使得LSTM变得平易近人了。
LSTMs 是我们使用RNNs的重要一步。我们很自然地想到:还有下一步吗?研究者的普遍观点是:『有!下一大步就是「注意力」(Attention)。』其基本思想就是让RNN的每一步从更大范围的信息中选取。例如,假设你为图片打标签,它可能会为它输出的每一个词语选取图片的一部分作为输入。事实上,[Xu, et al. (2015)]( http://arxiv.org/pdf/1502.03044v2.pdf)就是这么做的——如果你想探索『注意力』的话,这是个有趣的引子!已经有大量使用『注意力』得到的良好成果,而且似乎更多的陈果也将要出现......
『注意力』并非是RNN研究中唯一一个激动人心的方向。例如,[Kalchbrenner, et al. (2015)]( http://arxiv.org/pdf/1507.01526v1.pdf)做出的Grid LSTMs 似乎很有前途。在生成模型中使用RNNs-例如[Gregor, et al. (2015)]( http://arxiv.org/pdf/1502.04623.pdf),[Chung, et al. (2015)]( http://arxiv.org/pdf/1506.02216v3.pdf)以及[Bayer & Osendorfer (2015) ]( http://arxiv.org/pdf/1411.7610v3.pdf)-似乎也很有趣。过去几年是RNN激动人心的阶段,未来几年将会更加如此!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。