在前面讲到的CNN中,训练样本的输入和输出是比较的确定的。传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是有一类问题CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过CNN进行训练。
RNN的特点:RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。什么是序列特性呢?简单来说就是符合时间顺序,逻辑顺序,或者其他顺序就叫序列特性。例如拿人类的某句话来说,也就是人类的自然语言,就是按照某个逻辑或规则将字词拼凑排列起来,这就是符合序列特性。
1、为什么要发明循环神经网络RNN呢?
我们先来看一个NLP很常见的问题,命名实体识别,举个例子,现在有两句话:
第一句话:I like eating apple!(我喜欢吃苹果!)
第二句话:The Apple is a great company!(苹果真是一家很棒的公司!)
现在的任务是要给apple打Label,我们都知道第一个apple是一种水果,第二个apple是苹果公司,假设我们现在有大量的已经标记好的数据以供训练模型,当我们使用全连接的神经网络时,我们做法是把apple这个单词的特征向量输入到我们的模型中(如下图),在输出结果时,让我们的label里,正确的label概率最大,来训练模型,但我们的语料库中,有的apple的label是水果,有的label是公司,这将导致,模型在训练的过程中,预测的准确程度,取决于训练集中哪个label多一些,这样的模型对于我们来说完全没有作用。问题就出在了我们没有结合上下文去训练模型,而是单独的在训练apple这个单词的label,这也是全连接神经网络模型所不能做到的,于是就有了我们的循环神经网络。
再比如,在一个语音订票的全连接系统中,输入两句话:我想在这周六从上海去北京。我想在这周六离开北京去上海。在训练样本中对第一句话中的上海打上出发地的标签,北京打上目的地的标签,周六打上日期标签,对第二句话中的上海打上目的地标签,北京打上出发地标签,周六打上日期标签。如果不考虑这句话的前后逻辑关系,那么系统将很难确定此次行程的目的地和出发地。就像上面的例子一样,如果训练样本中的上海-->北京的样本比北京-->上海的样本多,那么训练的准确程度则由标签数量决定。
RNN会记忆之前的信息(保存前后逻辑关系),并利用之前的信息影响后面结点的输出。
2、RNN的结构及原理
RNN网络结构
上图是简化后的RNN网络结构。从图上看 ,RNN结构与全连接的区别只是在右侧W处有差异。
我们不看W部分,并且将上图展开,就是一个全连接的神经网络如下图。上图中的X对应下图中的input layer,U是隐藏层的参数矩阵,对应下图中的参数,S对应下图hidden layer,O对应下图的输出层,V则对应输出层的参数矩阵