循环神经网络(Recurrent Neural Networks)
RNNs的目的是用来处理序列数据,在传统的神经网络模型中,网络结构是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的,但是这种网络对很多问题搜无能为力,例如,预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中的单词不是独立存在的,RNNs之所以称为循环神经网络,即一个序列当前的输入和前面的输出是有关系的,并且隐藏层的输入不但包括输入层的输入还包括上一时刻隐藏层的输出。理论上,RNNs能够对任何长度的序列数据进行处理,但在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关。
RNNs包含输入单元,输入集标记为x0,x1,...,xt,xt+1,...,而输出单元的输出集为y0,y1,...,yt,yt+1,...,RNNs还包含隐藏单元,将其输出集标记为s0,s1,...st,st+1,...,在上图中,有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元,并且隐藏层的输入还包括上一隐藏层单元的输出,即隐藏层内的节点可以自连也可以互连,在某些情况下,RNNs也可以引导信息从输出单元返回隐藏单元。
xt表示t,t=1,2,3,...步的输入,比如,x1表示第二个词的one-hot向量(在机器学习过程中,需要将其数值化,词向量就是一种可行的方法,词向量就是用指定长度的实数向量表示一个词。)
st为隐藏层的第t步的状态,它是网络的记忆单元,st=f(Uxt+Wst−1),其中f是一般的非线性的**单元,在计算s0时,即第一个词的隐藏层状态,需要用到s−1但是它并不存在,在现实中一般置为0向量。
ot是第t步的输出,ot=softmax(Vst)
需要注意的是:
你可以认为隐藏层状态st是网络的记忆单元,st包含了前面所有步的隐藏层状态。而输出层的输出ot只与当前步的st有关,在实践中,为了降低网络的复杂度,往往st只包含前面若干步而不是所有步的隐藏层状态;
在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数U,V,W。其反应在RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数;解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么xt到st之间的U矩阵与xt+1到st+1之间的U是不同的,而RNNs中的却是一样的,同理对于s与s层之间的W、s层与o层之间的V也是一样的。
上图中每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
RNNs能干什么?
语言模型与文本生成:机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。
机器翻译:机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。
语音识别:语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。
图像描述生成
RNNs的训练
训练同样使用BP误差反向传播算法,不过和传统的神经网络有所区别,在RNNs中,将其网络展开,参数U,V,W是共享的,并且每一步的输出不仅依赖于当前步的网络,还依赖前面的若干步的的状态有关。比如,在t=4时,我们还需要向后传递三步,已经后面的三步都需要加上各种的梯度。该学习算法称为Backpropagation Through Time (BPTT)。需要意识到的是,在vanilla RNNs训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。当然,有很多方法去解决这个问题,如LSTMs便是专门应对这种问题的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:循环神经网络(RNN)介绍 - Python技术站