目录
1 什么是RNNs
2 RNNs能干什么
2.1 语言模型与文本生成Language Modeling and Generating Text
2.2 机器翻译Machine Translation
2.3 语音识别Speech Recognition
2.4 图像描述生成 Generating Image Descriptions
3 如何训练RNNs
4 RNNs扩展和改进模型
4.1 Simple RNNsSRNs2
4.2 Bidirectional RNNs3
4.3 DeepBidirectionalRNNs4
4.4 Echo State Networks5
4.5 Gated Recurrent Unit Recurrent Neural Networks6
4.6 LSTM Netwoorks7
4.7 Clockwork RNNsCW-RNNs9
5 总结
6 参考博文
7 参考文献html
这篇文章不少内容是参考:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/ ,在这篇文章中,加入了一些新的内容与一些本身的理解。python
循环神经网络(Recurrent Neural Networks,RNNs)已经在众多天然语言处理(Natural Language Processing, NLP)中取得了巨大成功以及普遍应用。可是,目前网上与RNNs有关的学习资料不多,所以该系列即是介绍RNNs的原理以及如何实现。主要分红如下几个部分对RNNs进行介绍:git
不一样于传统的FNNs(Feed-forward Neural Networks,前向反馈神经网络),RNNs引入了定向循环,可以处理那些输入之间先后关联的问题。定向循环结构以下图所示:github
该tutorial默认读者已经熟悉了基本的神经网络模型。若是不熟悉,能够点击:Implementing A Neural Network From Scratch进行学习。web
RNNs的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全链接的,每层之间的节点是无链接的。可是这种普通的神经网络对于不少问题却无能无力。例如,你要预测句子的下一个单词是什么,通常须要用到前面的单词,由于一个句子中先后单词并非独立的。RNNs之因此称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点再也不无链接而是有链接的,而且隐藏层的输入不只包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNNs可以对任何长度的序列数据进行处理。可是在实践中,为了下降复杂性每每假设当前的状态只与前面的几个状态相关,下图即是一个典型的RNNs:算法
From Nature网络
RNNs包含输入单元(Input units),输入集标记为{x0,x1,...,xt,xt+1,...},而输出单元(Output units)的输出集则被标记为{y0,y1,...,yt,yt+1.,..}。RNNs还包含隐藏单元(Hidden units),咱们将其输出集标记为{s0,s1,...,st,st+1,...},这些隐藏单元完成了最为主要的工做。你会发现,在图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另外一条单向流动的信息流从隐藏单元到达输出单元。在某些状况下,RNNs会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“Back Projections”,而且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点能够自连也能够互连。
上图将循环神经网络进行展开成一个全神经网络。例如,对一个包含5个单词的语句,那么展开的网络即是一个五层的神经网络,每一层表明一个单词。对于该网络的计算过程以下:less
须要注意的是:机器学习
RNNs已经被在实践中证实对NLP是很是成功的。如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最普遍最成功的模型即是LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型一般比vanilla RNNs可以更好地对长短时依赖进行表达,该模型相对于通常的RNNs,只是在隐藏层作了手脚。对于LSTMs,后面会进行详细地介绍。下面对RNNs在NLP中的应用进行简单的介绍。函数
给你一个单词序列,咱们须要根据前面的单词预测每个单词的可能性。语言模型可以一个语句正确的可能性,这是机器翻译的一部分,每每可能性越大,语句越正确。另外一种应用即是使用生成模型预测下一个单词的几率,从而生成新的文本根据输出几率的采样。语言模型中,典型的输入是单词序列中每一个单词的词向量(如 One-hot vector),输出时预测的单词序列。当在对网络进行训练时,若是ot=xt+1,那么第t步的输出即是下一步的输入。
下面是RNNs中的语言模型和文本生成研究的三篇文章:
机器翻译是将一种源语言语句变成意思相同的另外一种源语言语句,如将英语语句变成一样意思的中文语句。与语言模型关键的区别在于,须要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便须要从完整的输入序列中进行获取。机器翻译以下图所示:
RNN for Machine Translation. Image Source
下面是关于RNNs中机器翻译研究的三篇文章:
语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的几率值。
RNNs中的语音识别研究论文:
和卷积神经网络(convolutional Neural Networks, CNNs)同样,RNNs已经在对无标图像描述自动生成中获得应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个很是神奇的研究与应用。该组合模型可以根据图像的特征生成描述。以下图所示:
图像描述生成中的深度视觉语义对比. Image Source
对于RNN是的训练和对传统的ANN训练同样。一样使用BP偏差反向传播算法,不过有一点区别。若是将RNNs进行网络展开,那么参数W,U,V是共享的,而传统神经网络却不是的。而且在使用梯度降低算法中,每一步的输出不只依赖当前步的网络,而且还以来前面若干步网络的状态。好比,在t=4时,咱们还须要向后传递三步,已经后面的三步都须要加上各类的梯度。该学习算法称为Backpropagation Through Time (BPTT)。后面会对BPTT进行详细的介绍。须要意识到的是,在vanilla RNNs训练中,BPTT没法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,通常超过十步就无能为力了),由于BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。固然,有不少方法去解决这个问题,如LSTMs即是专门应对这种问题的。
这些年,研究者们已经提出了多钟复杂的RNNs去改进vanilla RNN模型的缺点。下面是目前常见的一些RNNs模型,后面会对其中使用比较普遍的进行详细讲解,在这里进行简单的概述。
SRNs是RNNs的一种特例,它是一个三层网络,而且在隐藏层增长了上下文单元,下图中的y即是隐藏层,u即是上下文单元。上下文单元节点与隐藏层中的节点的链接是固定(谁与谁链接)的,而且权值也是固定的(值是多少),实际上是一个上下文节点与隐藏层节点一一对应,而且值是肯定的。在每一步中,使用标准的前向反馈进行传播,而后使用学习算法进行学习。上下文每个节点保存其链接的隐藏层节点的上一步的输出,即保存上文,并做用于当前步对应的隐藏层节点的状态,即隐藏层的输入由输入层的输出与上一步的本身的状态所决定的。所以SRNs可以解决标准的多层感知机(MLP)没法解决的对序列数据进行预测的任务。
SRNs网络结构以下图所示:
Bidirectional RNNs(双向网络)的改进之处即是,假设当前的输出(第t步的输出)不只仅与前面的序列有关,而且还与后面的序列有关。例如:预测一个语句中缺失的词语那么就须要根据上下文来进行预测。Bidirectional RNNs是一个相对较简单的RNNs,是由两个RNNs上下叠加在一块儿组成的。输出由这两个RNNs的隐藏层的状态决定的。以下图所示:
Deep(Bidirectional)RNNs与Bidirectional RNNs类似,只是对于每一步的输入有多层网络。这样,该网络便有更强大的表达与学习能力,可是复杂性也提升了,同时须要更多的训练数据。Deep(Bidirectional)RNNs的结构以下图所示:
ESNs(回声状态网络)虽然也是一种RNNs,可是它与传统的RNNs相差很大。ESNs具备三个特色:
从结构上讲,ESNs是一种特殊类型的循环神经网络,其基本思想是:使用大规模随机链接的循环网络取代经典神经网络中的中间层,从而简化网络的训练过程。所以ESNs的关键是中间的储备池。网络中的参数包括:W为储备池中节点的链接权值矩阵,Win为输入层到储备池之间的链接权值矩阵,代表储备池中的神经元之间是链接的,Wback为输出层到储备池之间的反馈链接权值矩阵,代表储备池会有输出层来的反馈,Wout为输入层、储备池、输出层到输出层的链接权值矩阵,代表输出层不只与储备池链接,还与输入层和本身链接。Woutbias表示输出层的偏置项。
对于ESNs,关键是储备池的四个参数,如储备池内部链接权谱半径SR(SR=λmax=max{|W的特征指|},只有SR <1时,ESNs才能具备回声状态属性)、储备池规模N(即储备池中神经元的个数)、储备池输入单元尺度IS(IS为储备池的输入信号链接到储备池内部神经元以前须要相乘的一个尺度因子)、储备池稀疏程度SD(即为储备池中互相链接的神经元个数占储备池神经元总个数的比例)。对于IS,若是须要处理的任务的非线性越强,那么输入单元尺度越大。该原则的本质就是经过输入单元尺度IS,将输入变换到神经元激活函数相应的范围(神经元激活函数的不一样输入范围,其非线性程度不一样)。
ESNs的结构以下图所示:
GRUs也是通常的RNNs的改良版本,主要是从如下两个方面进行改进。一是,序列中不一样的位置处的单词(已单词举例)对当前的隐藏层的状态的影响不一样,越前面的影响越小,即每一个前面状态对当前的影响进行了距离加权,距离越远,权值越小。二是,在产生偏差error时,偏差多是由某一个或者几个单词而引起的,因此应当仅仅对对应的单词weight进行更新。GRUs的结构以下图所示。GRUs首先根据当前输入单词向量word vector已经前一个隐藏层的状态hidden state计算出update gate和reset gate。再根据reset gate、当前word vector以及前一个hidden state计算新的记忆单元内容(new memory content)。当reset gate为1的时候,new memory content忽略以前的全部memory content,最终的memory是以前的hidden state与new memory content的结合。
LSTMs与GRUs相似,目前很是流行。它与通常的RNNs结构本质上并无什么不一样,只是使用了不一样的函数去去计算隐藏层的状态。在LSTMs中,i结构被称为cells,能够把cells看做是黑盒用以保存当前输入xt以前的保存的状态ht−1,这些cells更加必定的条件决定哪些cell抑制哪些cell兴奋。它们结合前面的状态、当前的记忆与当前的输入。已经证实,该网络结构在对长序列依赖问题中很是有效。LSTMs的网络结构以下图所示。对于LSTMs的学习,参见 this post has an excellent explanation
LSTMs解决的问题也是GRU中所提到的问题,以下图所示:
LSTMs与GRUs的区别如图所示[8]:
从上图能够看出,它们之间很是相像,不一样在于:
CW-RNNs是较新的一种RNNs模型,其论文发表于2014年Beijing ICML。在原文[8]中做者表示其效果较SRN与LSTMs都好。
CW-RNNs也是一个RNNs的改良版本,是一种使用时钟频率来驱动的RNNs。它将隐藏层分为几个块(组,Group/Module),每一组按照本身规定的时钟频率对输入进行处理。而且为了下降标准的RNNs的复杂性,CW-RNNs减小了参数的数目,提升了网络性能,加速了网络的训练。CW-RNNs经过不一样的隐藏层模块工做在不一样的时钟频率下来解决长时间依赖问题。将时钟时间进行离散化,而后在不一样的时间点,不一样的隐藏层组在工做。所以,全部的隐藏层组在每一步不会都同时工做,这样便会加快网络的训练。而且,时钟周期小的组的神经元的不会链接到时钟周期大的组的神经元,只会周期大的链接到周期小的(认为组与组之间的链接是有向的就行了,表明信息的传递是有向的),周期大的速度慢,周期小的速度快,那么即是速度慢的连速度快的,反之则不成立。如今还不明白没关系,下面会进行讲解。
CW-RNNs与SRNs网络结构相似,也包括输入层(Input)、隐藏层(Hidden)、输出层(Output),它们之间也有向前链接,输入层到隐藏层的链接,隐藏层到输出层的链接。可是与SRN不一样的是,隐藏层中的神经元会被划分为若干个组,设为g,每一组中的神经元个数相同,设为k,并为每个组分配一个时钟周期Ti∈{T1,T2,...,Tg},每个组中的全部神经元都是全链接,可是组j到组i的循环链接则须要知足Tj大于Ti。以下图所示,将这些组按照时钟周期递增从左到右进行排序,即T1<T2<...<Tg,那么链接即是从右到左。例如:隐藏层共有256个节点,分为四组,周期分别是[1,2,4,8],那么每一个隐藏层组256/4=64个节点,第一组隐藏层与隐藏层的链接矩阵为64 * 64的矩阵,第二层的矩阵则为64 * 128矩阵,第三组为64 * (3 * 64)=64 * 192矩阵,第四组为64 (4 64)=64 * 256矩阵。这就解释了上一段的后面部分,速度慢的组连到速度快的组,反之则不成立。
CW-RNNs的网络结构以下图所示:
在传统的RNN中,按照下面的公式进行计算:
st=fs(Wst−1+Winxt)
ot=fo(Woutst)
其中,W为隐藏层神经元的自链接矩阵,Win为输入层到隐藏层的链接权值矩阵,Wout是隐藏层到输出层的链接权值矩阵 ,xt是第t步的输入,st−1为第t−1步隐藏层的输出,st为第t步隐藏层的输出,ot为第t步的输出,fs为隐藏层的激活函数,fo为输出层的激活函数。
与传统的RNNs不一样的是,在第t步时,只有那些知足(tmodTi)=0的隐藏层组才会执行。而且每一隐藏层组的周期{T1,T2,...,Tg}均可以是任意的。原文中是选择指数序列做为它们的周期,即Ti=2i−1i∈[1,...,g]。
所以W与Win将被划分为g个块。以下:
W=⎡⎣⎢W1...Wg⎤⎦⎥
Win=⎡⎣⎢Win1...Wing⎤⎦⎥
其中W是一个上三角矩阵,每个组行Wi被划分为列向量{W1i,...,Wii,0(i+1)i,...,0gi}T,Wji,j∈[1,...,g]表示第i个组到第j个组的链接权值矩阵。在每一步中,W与Win只有部分组行处于执行状态,其它的为0:
Wi={Wi0,for(tmodTi)=0,otherwise
Wini={Wini0,for(tmodTi)=0,otherwise
为了使表达不混淆,将Win写成Win。而且执行的组所对应的o才会有输出。处于非执行状态下的隐藏层组仍保留着上一步的状态。下图是含五个隐藏层组在t=6时的计算图:
在CW-RNNs中,慢速组(周期大的组)处理、保留、输出长依赖信息,而快速组则会进行更新。CW-RNNs的偏差后向传播也和传统的RNNs相似,只是偏差只在处于执行状态的隐藏层组进行传播,而非执行状态的隐藏层组也复制其链接的前面的隐藏层组的后向传播。即执行态的隐藏层组的偏差后向传播的信息不只来自与输出层,而且来自与其链接到的左边的隐藏层组的后向传播信息,而非执行态的后向传播信息只来自于其链接到的左边的隐藏层组的后向传播数据。
下图是原文对三个不一样RNNs模型的实验结果图:
上图中,绿色实线是预测结果,蓝色散点是真实结果。每一个模型都是对前半部分进行学习,而后预测后半部分。LSTMs模型相似滑动平均,可是CW-RNNs效果更好。其中三个模型的输入层、隐藏层、输出层的节点数都相同,而且只有一个隐藏层,权值都使用均值为0,标准差为0.1的高斯分布进行初始化,隐藏层的初始状态都为0,每个模型都使用Nesterov-style momentum SGD(Stochastic Gradient Descent,随机梯度降低算法)[10]进行学习与优化。
到目前为止,本文对RNNs进行了基本的介绍,并对常见的几种RNNs模型进行了初步讲解。下一步将基于Theano与Python实现一个RNNs语言模型并对上面的一些RNNs模型进行详解。这里有更多的RNNs模型。
后面将陆续推出:
本系列将实现一个基于循环神经网络的语言模型(recurrent neural network based language model)。该实现包含两个方面:一是可以获得任意语句在现实中成立的得分,其提供了判断语法与语义的正确性的度量方式。该模型是机器翻译中的典型应用。二是模型可以产生新的文本,这是一个很是棒的应用。好比,对莎士比亚的文章进行训练,可以产生一个新的相似莎士比亚的文本,目前,这个有趣的想法已经被Andrew Karpathy基于RNNs的字符级别的语言模型实现了。
http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
[1] Hinton G E. Learning Distributed Representations of Concepts[C]. Proceedings of the 8th Annual Conference of the Cognitive Science Society. 1986, 1: 12.
[2] Elman, J. L. Finding structure in time. CRL Technical Report 8801, Center for Research in Language, University of California, San Diego, 1988.
[3] Schuster M, Paliwal K K. Bidirectional recurrent neural networks[J]. Signal Processing, IEEE Transactions on, 1997, 45(11): 2673-2681.
[4] Graves A, Mohamed A R, Hinton G. Speech Recognition with Deep Recurrent Neural Networks[J]. Acoustics Speech & Signal Processing . icassp. international Conference on, 2013:6645 - 6649.
[5] Jaeger H, Haas H. Harnessing nonlinearity: Predicting chaotic systems and saving energy in wireless communication[J]. Science, 2004, 304(5667): 78-80.
[6] Cho K, Van Merrienboer B, Gulcehre C, et al. Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation[J]. Eprint Arxiv, 2014.
[7] Hochreiter S, Schmidhuber J. Long short-term memory.[J]. Neural Computation, 1997, 9(8):1735-1780.
[8] Chung J, Gulcehre C, Cho K H, et al. Empirical evaluation of gated recurrent neural networks on sequence modeling[J]. arXiv preprint arXiv:1412.3555, 2014.
[9] Jan Koutnik, Klaus Greff, Faustino Gomez, Juergen Schmidhuber. A Clockwork RNN[J]. Proceedings of The 31st International Conference on Machine Learning, pp. 1863–1871, 2014.
[10] Sutskever, Ilya, Martens, James, Dahl, George E., and Hinton, Geoffrey E. On the importance of initialization and momentum in deep learning. In Dasgupta, Sanjoy and Mcallester, David (eds.), Proceedings of the 30th International Conference on Machine Learning (ICML-13), volume 28, pp. 1139–1147.
附:http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/
http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/
http://www.wildml.com/2015/10/recurrent-neural-network-tutorial-part-4-implementing-a-grulstm-rnn-with-python-and-theano/
From: http://blog.csdn.net/heyongluoyao8/article/details/48636251