酷勤网 – 程序员的那点事!

当前位置:首页 > 编程 > 网络技术 > 正文

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

浏览次数: 知乎 2015年06月18日 字号:

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

胡新辰ML/NLP

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

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

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

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

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

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

还有一个最新的(今年)的综述,《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 hidden unit)替代LSTM,其实LSTM和GRU都可以说是gated hidden utite。两者效果相近,但是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.》

2014年提出的,使用多层LSTM网络构建编码器-解码器(encoder-decoder)框架用于机器翻译。文章的encoder和decoder都是多层LSTM网络,文章先用encoder从不定长的源语言输入中学到固定长度的特征V,然后decoder使用特征V和语言模型解码出目标语言句子

《Bahdanau D, Cho K, Bengio Y. Neural machine translation by jointly learning to align and translate[J]. arXiv preprint arXiv:1409.0473, 2014.

这就是提出GRU的那篇论文。使用GRU单元的RNN框架构建了一个机器翻译模型,文章提出注意力信息(attention signal)机制用于源语言和目标语言的对齐。

句法分析:

《Vinyals O, Kaiser L, Koo T, et al. Grammar as a foreign language[J]. arXiv preprint arXiv:1412.7449, 2014.》

把LSTM用于句法分析任务,文章把树状的句法结构进行了线性表示,从而把句法分析问题转成翻译问题,然后套用机器翻译的encoder-decoder框架使用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^)/~

然而我有种预感,说了这么多,工作之后很有可能发现:

这些东西对我工作并没有什么卵用 (>﹏<=

万方平

Alex Graves的Supervised Sequence Labelling with Recurrent Neural Networks(http://www.cs.toronto.edu/~graves/preprint.pdf
Schmidhuber的一个LSTM教程 :Long Short-Term Memory: Tutorial on LSTM Recurrent Networks
Schmidhuber等人还写了这篇关于LSTM的文章 LSTM: A Search Space Odyssey:http://arxiv.org/pdf/1503.04069v1.pdf,也不错
至于动手写代码,题主可以再参考Deep Learning Tutorials里RNN和LSTM的部分了

余思勰暂无描述

我是这样初步了解RNN和LSTM的,希望能有帮助:

1. 看牛津大学的Nando de Freitas教授的deep learning课程中关于RNN和LSTM的视频和讲义。Machine Learning
我觉得他的课程优点有这些:
1.1 配合着 Torch7(https://torch.ch),一边讲RNN和LSTM的内部结构,一边动手写代码。写完就了解RNN与LSTM的工作原理了。并且我自己觉得Torch7的Lua代码要比Theano的代码容易理解。

1.2 他的课程中关于BPTT( back-propagation through time )的讲解很清楚。我按照他的推荐计算了一个two time steps的rnn的bp,然后对BPTT算法的了解比原来要好一些。这是他课程的slides,里面有关于BPTT的推倒。https://www.cs.ox.ac.uk/people/nando.defreitas/machinelearning/lecture11.pdf

1.3 他的课程配合有一个github上的项目:oxford-cs-ml-2015/practical6 · GitHub参考着他提供的对LSTM的实现的源代码能够加速理解。并且看懂了以后还能做一些自己的小扩展。


2. Stanford大学Feifei Li博士生Andrej Karpathy基于前面提到的nando教授的LSTM实现做了一个有趣的项目:char-rnn (karpathy/char-rnn · GitHub)。他在Nando版本基础上又加了对multi-layer,gpu的支持,还有一些其他deep learning里的小trick。推荐这个项目的原因是如果你看懂了nando的版本,那么Karpathy的版本也很容易看懂。并且马上就可以提供自己的数据做运用。比如:我把python的tornado,flask,django框架的代码合成了一个30万行的文件喂给这个LSTM。然后它就能写出貌似正确的python代码了。他还写过一篇博客讲解RNN和LSTM:The Unreasonable Effectiveness of Recurrent Neural Networks

4. CVPR15有一个关于Torch7和deep learning的tutorial,从这个tutorial里面能够快速入门torch7:Torch | Applied Deep Learning for Computer Vision with Torch

5. 如果以上都完成了,还想找一些机会读paper,自己实现,看别人的实现,那么在这个论坛上经常会有人提供一些新的paper的实现,比如:DeepMind的atari,DeepMind的DRAW,Google的BatchNorm等;torch/torch7

6. Torch7的邮件列表:Google 网上论坛

7. 最后,Alex Grave有一份文档很详细地讲解他自己生成sequence的方法。http://arxiv.org/abs/1308.0850

KevinSun机器学习博士在读,只关注神经网络方法!

我觉得我能讲的比任何教程都易懂。当然这是我老板的功劳!

丁00学生

RNN训练我自己有找到一个唯一能看懂的,http://www.docin.com/p-704741266.html

匿名用户

补充一个,ICDAR 2013 Tutorial :Building Fast High-Performance Recognition Systems with Recurrent Neural Networks and LSTM

我觉得写的挺好的,不过要翻墙

可以配合Alex Graves 的rnnlib 一起来用

无觅相关文章插件,快速提升流量