RNN网络详解

来源:互联网 发布:java web 项目书籍pdf 编辑:程序博客网 时间:2024/06/05 03:41

一、RNN网络简介
  RNN网络的目的是用来处理序列数据,保存前后序列之间的前后关系,让网络对于信息具有记忆能力。对于传统的神经网络模型,它是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于一些问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的,再比如你要判断一个人说话的情感,肯定也需要用到全局前后词的信息来进行判断。
  在这个背景下,为了记忆前后序列之间的关系,RNN网络被提出。RNN叫循环神经网路,在该网络中一个序列当前的输出与前面的输出有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN网络能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关,下图便是一个典型的RNN网络:

这里写图片描述

这里写图片描述

  RNN网络包含输入单元(Input units),输入集标记为{x0,x1,…,xt,xt+1,…},而输出单元(Output units)的输出集则被标记为{o0,o1,…,ot,ot+1,…}。RNN网络还包含隐藏单元(Hidden units),我们将其输出集标记为{s0,s1,…,st,st+1,…},这些隐藏单元完成了最为主要的工作。在上图中:有一条单向流动的信息流是从输入单元到达隐藏单元的,与此同时另一条单向流动的信息流从隐藏单元到达输出单元。在某些情况下,RNN网络会打破后者的限制,引导信息从输出单元返回隐藏单元,这些被称为“Back Projections”,并且隐藏层的输入还包括上一隐藏层的状态,即隐藏层内的节点可以自连也可以互连。
  上图将循环神经网络进行展开成一个全神经网络。例如,对一个包含5个单词的语句,那么展开的网络便是一个五层的神经网络,每一层代表一个单词。对于该网络的计算过程如下:
  (1)xt表示第t,t=1,2,3…步(step)的输入。比如,x1为第二个词的one-hot向量(根据上图,x0为第一个词);
  注释:使用计算机对自然语言进行处理,便需要将自然语言处理成为机器能够识别的符号,加上在机器学习过程中,需要将其进行数值化。而词是自然语言理解与处理的基础,因此需要对词进行数值化,词向量(Word Representation,Word embeding)便是一种可行又有效的方法。何为词向量,即使用一个指定长度的实数向量v来表示一个词。有一种种最简单的表示方法,就是使用One-hot vector表示单词,即根据单词的数量|V|生成一个|V| * 1的向量,当某一位为一的时候其他位都为零,然后这个向量就代表一个单词。缺点也很明显:
  (a)由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加,麻烦;
  (b)主观性太强(subjective);
  (c)这么多单词,还得人工打labor并且adapt,想想就恐;
  (d)最不能忍受的一点便是很难计算单词之间的相似性。
现在有一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec。
  (2)st为隐藏层的第t步的状态,它是网络的记忆单元。 st根据当前输入层的输出与上一步隐藏层的状态进行计算。st=f(U*xt+W*st−1),其中f一般是非线性的激活函数,如tanh或Relu,在计算s0时,即第一个单词的隐藏层状态,需要用到s-1,但是其并不存在,在实现中一般置为0向量;
  (3)ot是第t步的输出,如下个单词的向量表示,ot=softmax(V*st)。
  注意:(a)隐藏层状态st是网络的记忆单元。st包含了前面所有步的隐藏层状态。而输出层的输出ot只与当前步的st有关,在实践中,为了降低网络的复杂度,往往st只包含前面若干步而不是所有步的隐藏层状态;
  (b)在传统神经网络中,每一个网络层的参数是不共享的。而在RNN网络中,每输入一步,每一层各自都共享参数U,V,W。其反应RNN网络中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数;这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么xt到st之间的U矩阵与xt+1到st+1之间的U是不同的,而在RNN网络中的却是一样的,同理对于s与s层之间的W、s层与o层之间的V也是一样的。
  (c)上图中每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNN网络的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。

二、RNN网络的实际应用
  RNN网络已经在实践中被证明对NLP问题的实践是非常成功的。如词向量表达、语句合法性检查、词性标注、句子分类等。在RNN网络中,目前使用最广泛最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNN网络,只是在隐藏层做了手脚。对于LSTMs,后面会进行详细地介绍。下面对RNN网络在NLP中的应用进行简单的介绍。
1、语言模型与文本生成
  给定一个词的序列,我们想预测在前面的词确定之后,每个词出现的概率。语言模型可以度量一个句子出现的可能性,这可以作为机器翻译的一个重要输入(因为出现概率高的句子通常是正确的)。能预测下一个词所带来的额外效果是我们得到了一个生成模型,这可以让我们通过对输出概率采样来生成新的文本。根据训练数据的具体内容,我们可以生成任意东西。在语言模型中,输入通常是词的序列(编码成one hot向量),输出是预测得到的词的序列。
2、机器翻译
  机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。机器翻译如下图所示:

这里写图片描述

3、语音识别
  语音识别是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。
4、图像描述生成
  和卷积神经网络(convolutional Neural Networks, CNNs)一样,RNNs已经在对无标图像描述自动生成中得到应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。如下图所示:

这里写图片描述

三、如何训练RNN网络
  对于RNN是的训练和对传统的ANN训练一样。同样使用BP误差反向传播算法,不过有一点区别。如果将RNN网络进行展开,那么参数W,U,V是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。比如,在t=4时,我们还需要向后传递三步,后面的三步都需要加上各种的梯度。该学习算法称为Backpropagation Through Time (BPTT)。后面会对BPTT进行详细的介绍。需要意识到的是,在vanilla RNN训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),这是因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。当然,有很多方法去解决这个问题,如LSTM便是专门应对这种问题的。

四、RNN的改进模型
4.1 双向RNN网络
  Bidirectional RNN(双向网络)的改进之处便是,假设当前的输出(第t步的输出)不仅仅与前面的序列有关,并且还与后面的序列有关。例如:预测一个语句中缺失的词语那么就需要根据上下文来进行预测。Bidirectional RNN是一个相对较简单的RNN网络,是由两个RNN网络上下叠加在一起组成的。输出由这两个RNN网络的隐藏层的状态决定的。如下图所示:

这里写图片描述

4.2 Deep(Bidirectional)RNN网络
  Deep(Bidirectional)RNN与Bidirectional RNN相似,只是对于每一步的输入有多层网络。这样,该网络便有更强大的表达与学习能力,但是复杂性也提高了,同时需要更多的训练数据。Deep(Bidirectional)RNN的结构如下图所示:

这里写图片描述

4.3 Gated Recurrent Unit Recurrent Neural Networks(GRU)
  GRU是一般的RNN的改良版本,主要是从以下两个方面进行改进。一是,序列中不同的位置处的单词(以单词举例)对当前的隐藏层的状态的影响不同,越前面的影响越小,即每个前面状态对当前的影响进行了距离加权,距离越远,权值越小。二是,在产生误差error时,误差可能是由某一个或者几个单词而引发的,所以应当仅仅对对应的单词weight进行更新。GRU的结构如下图所示。GRU首先根据当前输入单词向量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的结合。

这里写图片描述

4.4 LSTM网络
  RNN是深度学习领域用于解决序列问题的神器,从理论的上来说,RNN是可以实现长时间记忆的。然而RNN反向求导会出现梯度弥散或者梯度爆炸,导致我们很难训练网络,对于长时刻记忆总不尽人意,于是就诞生了LSTM。
  LSTM与GRU类似,目前非常流行。它与一般的RNN结构本质上并没有什么不同,只是使用了不同的函数去计算隐藏层的状态。在LSTM中,i结构被称为cells,可以把cells看作是黑盒用以保存当前输入xt和之前的保存的状态ht-1,这些cells加一定的条件决定哪些cell抑制哪些cell兴奋。它们结合前面的状态、当前的记忆与当前的输入。如今已经证明,该网络结构在对长序列依赖问题中非常有效。LSTMs的网络结构如下图所示:

这里写图片描述

具体的变化过程如下图所示:

这里写图片描述

  具体的计算公式如下所示:

这里写图片描述

上面的计算公式也可以通过下面二个图来进行理解:

这里写图片描述

这里写图片描述

4.5 LSTM与GRU的区别

这里写图片描述

  从上图可以看出,LSTM和GRU之间非常相像,都能通过各种Gate将重要特征保留,保证其在long-term 传播的时候也不会被丢失,不同在于:
  (1)new memory的计算方法都是根据之前的state及input进行计算,但是GRU中有一个reset gate控制之前state的进入量,而在LSTM里没有这个gate;
  (2)产生新的state的方式不同,LSTM有两个不同的gate,分别是forget gate (f gate)和input gate(i gate),而GRU只有一个update gate(z gate);
  (3)LSTM对新产生的state有一个output gate(o gate)可以调节大小,而GRU直接输出无任何调节。

原创粉丝点击