RNN循环神经网络(Recurrent Neural Network)
- RNN的基本介绍以及一些常见的RNN(本文内容);
2. 详细介绍RNN中一些经常使用的训练算法,如Back Propagation Through Time(BPTT)、Real-time Recurrent Learning(RTRL)、Extended Kalman Filter(EKF)等学习算法,以及梯度消失问题(vanishing gradient problem)
3. 详细介绍Long Short-Term Memory(LSTM,长短时记忆网络);
4. 详细介绍Clockwork RNN(CW-RNN,时钟频率驱动循环神经网络);
5. 基于Python和Theano对RNN进行实现,包括一些常见的RNN模型。
什么是RNN?
RNN的目的是用来处理序列数据。RNN之所以称为循环神经网络,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNN:
xt表示第t步的输入。词向量模式,如word2vec,该模式是通过神经网络或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。
st为隐藏层的第t步的状态,它是网络的记忆单元。st根据当前输入层的输出与上一步隐藏层的状态进行计算。
st=f(Uxt + Wst),其中f一般是非线性的激活函数,如tanh或RELU,在计算s0时,即第一个单词的隐藏层状态,需要用到s-1,但是并不存在,在实现中一般置为0向量;
ot是第t步的输出,如下过个单词的向量表示,ot=softmax(Vst)
需要注意的是:
你可以认为隐藏层状态st是网络的记忆单元。st包含了前面所有步的隐藏层状态。而输出层的输出ot只与当前步的st有关,在实践中,为了降低网络的复杂度,往往st只包含前面若干步而不是所有步的隐藏层状态;
在传统神经网络中,每一个网络层的参数是不共享的。而在RNN中,每输入一步,每一层各自都共享参数U,V,W。其反应着RNN中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数;这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么xt到st之间的U矩阵与xt+1到st+1之间的U是不同的,而RNN中的却是一样的,同理对于s与s层之间的W、s层与o层之间的V也是一样的。
上图中每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNN的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
RNN能干什么?
RNN已经被在实践中证明对NLP是非常成功的。如词向量表达、语句合法性检查、词性标注等。在RNN中,目前使用最广泛最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型通常比vanilla RNN能够更好地对长短时依赖进行表达,该模型相对于一般的RNN,只是在隐藏层做了手脚。
语言模型与文本生成(Language Modeling and Generating Text)
应用一:给你一个单词序列,我们需要根据前面的单词预测每一个单词的可能性。
应用二:便是使用生成模型预测下一个单词的概率,从而生成新的文本根据输出概率的采样。
下面是RNNs中的语言模型和文本生成研究的三篇文章:
Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
机器翻译(Machine Translation)
机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。机器翻译如下图所示:
下面是关于RNNs中机器翻译研究的三篇文章:
A Recursive Recurrent Neural Network for Statistical Machine Translation
Sequence to Sequence Learning with Neural Networks
Joint Language and Translation Modeling with Recurrent Neural Networks
语音识别(Speech Recognition)
语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。RNN中的语音识别研究论文:
Towards End-to-End Speech Recognition with Recurrent Neural Networks
图像描述生成(Generating Image Descriptions)
和卷积神经网络(convolutional Neural Networks, CNNs)一样,RNNs已经在对无标图像描述自动生成中得到应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。
如何训练RNN?
对于RNN是的训练和对传统的ANN训练一样。同样使用BP误差反向传播算法,不过有一点区别。如果将RNN进行网络展开,那么参数W,U,V是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。比如,在t=4t=4时,我们还需要向后传递三步,已经后面的三步都需要加上各种的梯度。该学习算法称为Backpropagation Through Time (BPTT)。后面会对BPTT进行详细的介绍。需要意识到的是,在vanilla RNN训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。当然,有很多方法去解决这个问题,如LSTM便是专门应对这种问题的。
RNN扩展和改进模型
Simple RNNs(SRNs)[2]
Bidirectional RNNs[3]
Deep(Bidirectional)RNNs[4]
Echo State Networks[5]
Gated Recurrent Unit Recurrent Neural Networks[6]
LSTM Netwoorks[7]
Clockwork RNNs(CW-RNNs)[9]