有哪些LSTM(Long Short Term Memory)和RNN(Recurrent)网络的教程?

不需要面面俱到,只需把他们解决什么问题,训练的过程是怎样的讲清楚就好。最好看完后就能直接上手写代码。
关注者
4,532
被浏览
415,204

37 个回答

刚好毕设相关,论文写完顺手就答了


先给出一个最快的了解+上手的教程:


直接看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 )

按照这个路线学起来会比较顺,所以我优先推荐的两个教程都是按照这个路线来的:

  1. 多伦多大学的 Alex Graves 的RNN专著《Supervised Sequence Labelling with Recurrent Neural
    Networks》
  2. Felix Gers的博士论文《Long short-term memory in recurrent neural networks》

这两个内容都挺多的,不过可以跳着看,反正我是没看完
┑( ̄Д
 ̄)┍

还有一个最新的(今年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的文档特征抽取和重建能力。


还有一篇文章《Chung J, Gulcehre C, Cho K, et al. Gated feedback recurrent neural networks[J]. arXiv preprint arXiv:1502.02367, 2015.》,把gated的思想从记忆单元扩展到了网络架构上,提出多层RNN各个层的隐含层数据可以相互利用(之前的多层RNN多隐含层只是单向自底向上连接),不过需要设置门(gated)来调节。


记忆单元方面,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只要看看这张图就行了,你会发现除了矩阵多了些,没啥新东西。另外theano、torch都有现成的,可以直接拿来用。至于bptt,想自己写,就自己求一遍导,或者如果你对于nn bp很熟练,直接按照图中的箭头逆序bptt就可以了。至于调参,可以借鉴已有的大量工作,省心了不少。

代码:
java:lipiji/JRNN · GitHub
theano:lipiji/rnn-theano · GitHub

pytorch: lipiji/rnn-pytorch



图中的链接:
A Note on BPTT for LSTM LM
slideshare.net/tmasada/ (我基本上就是照着这个以及上图实现的bptt)
Fig ref:dophist/kaldi-lstm · GitHub
当然,Colah的blog那是写的很赞的:colah.github.io/posts/2


补充:图中的lsmt中pre-h和pre-c更存的设计效果不好,基本没人用,要么只h,要么只c。