废话不说,进入正题。

为什么需要RNN

在讨论RNN之前,首先我们来探讨一下—既然我们已经有了人工神经网络和CNN(卷积神经网络),为什么还需要RNN(循环神经网络,嗯,很多地方喜欢称之为递归神经网络,不管穿了什么马甲,其实是一个东西)?

原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。

但在现实世界中,很多元素都是相互连接的,比如你想预测句子中的下一个单词,你最好知道它前面有哪些单词。又比如一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去__________。上面这句话填空的话,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,因此,就有了现在的循环神经网络。循环神经网络的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

何为RNN

我们已经知道RNN是用来处理序列数据的,那么什么样的数据可以被称为序列数据呢?别急,请看下图:

RNN 名字国籍 rng成员国籍_deep learning

在上面的例子中,我们看到序列数据可以是一段音频,或一句话,又或是一段DNA序列。那么,RNN到底是怎么处理序列数据的呢?

单词表示

要想处理一段序列,我们首先得把序列数据表示为计算机可以识别的形式。首先我们应该有一个词汇表,词汇表中列出你要用到的所有单词。到这里你可能又想问我们怎么才能获得一个词汇表呢?

一般来说,有几种解决办法:(1)训练你的数据集,找到最常用的词;(2)直接到网上找一些词典,它能告诉你英语里最常用的单词是什么。

假设我们现在有一个包含10000个单词的词汇表,其中RNN 名字国籍 rng成员国籍_deep learning_02为词汇表中第一个单词,RNN 名字国籍 rng成员国籍_deep learning_03为第367个,RNN 名字国籍 rng成员国籍_deep learning_04为第4075个,RNN 名字国籍 rng成员国籍_deep learning_05为第6830个,而RNN 名字国籍 rng成员国籍_RNN 名字国籍_06为词汇表中最后一位。

那么这样一个序列数据 “RNN 名字国籍 rng成员国籍_数据_07 RNN 名字国籍 rng成员国籍_数据_08 RNN 名字国籍 rng成员国籍_deep learning_03 RNN 名字国籍 rng成员国籍_数据_10 RNN 名字国籍 rng成员国籍_循环神经网络_11 RNN 名字国籍 rng成员国籍_数据_12 RNN 名字国籍 rng成员国籍_deep learning_02 RNN 名字国籍 rng成员国籍_RNN_14 RNN 名字国籍 rng成员国籍_deep learning_15” 里的每一个单词就可以表示为如下图这种形式。我们称之为one-hot向量,每个单词都是一个10000维的向量,且只有一个值为1(它所在词汇表中的位置),其余值均为0。

到这里你可能又想问了,如果我们遇到了一个不在词典里的词怎么办呢?

我们可以创建一个新的标记,比如UNK

RNN 名字国籍 rng成员国籍_deep learning_16

由上图可以看出,在使用one-hot表示单词时,缺点是十分明显的:

(1)由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加,麻烦!(Impossible to keep up to date);

(2)主观性太强(subjective) ,这么多单词,还得人工打labor并且adapt,想想就恐

(3)最不能忍受的一点便是很难计算单词之间的相似性。

现在有一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec。

RNN原理

RNN 名字国籍 rng成员国籍_循环神经网络_17

RNN由三个单元组成:

(1)输入单元(Input units),输入集标记为 {RNN 名字国籍 rng成员国籍_deep learning_18}。RNN 名字国籍 rng成员国籍_循环神经网络_19表示第 RNN 名字国籍 rng成员国籍_RNN 名字国籍_20 (t=1,2,3…步(step)的输入。比如,RNN 名字国籍 rng成员国籍_RNN 名字国籍_21为第二个词的one-hot向量(根据上图,RNN 名字国籍 rng成员国籍_deep learning_22为第一个词);

(2)输出单元(Output units),输出集则被标记为 {RNN 名字国籍 rng成员国籍_RNN 名字国籍_23}。RNN 名字国籍 rng成员国籍_循环神经网络_24是第t步的输出。

(3)隐藏单元(Hidden units),我们将其输出集标记为 {RNN 名字国籍 rng成员国籍_RNN 名字国籍_25}。RNN 名字国籍 rng成员国籍_RNN_26为隐藏层的第t步的状态,它是网络的记忆单元。

使用公式将上图结构表示为:RNN 名字国籍 rng成员国籍_数据_27

RNN 名字国籍 rng成员国籍_循环神经网络_28 如果隐层节点个数为100,字典大小C=10000,参数的维度信息为:

RNN 名字国籍 rng成员国籍_循环神经网络_29

RNN 名字国籍 rng成员国籍_RNN 名字国籍_30

RNN 名字国籍 rng成员国籍_RNN 名字国籍_31

RNN 名字国籍 rng成员国籍_数据_32

RNN 名字国籍 rng成员国籍_RNN 名字国籍_33

RNN 名字国籍 rng成员国籍_数据_34

你可以认为隐藏层状态RNN 名字国籍 rng成员国籍_RNN_26是网络的记忆单元。RNN 名字国籍 rng成员国籍_RNN_26包含了前面所有步的隐藏层状 态。而输出层的输出RNN 名字国籍 rng成员国籍_循环神经网络_24只与当前步的RNN 名字国籍 rng成员国籍_RNN_26有关。其中RNN 名字国籍 rng成员国籍_数据_39一般是非线性的激活函数,如RNN 名字国籍 rng成员国籍_RNN_40RNN 名字国籍 rng成员国籍_RNN 名字国籍_41,在计算RNN 名字国籍 rng成员国籍_deep learning_42时,即第一个单词的隐藏层状态,需要用到RNN 名字国籍 rng成员国籍_deep learning_43,但是其并不存在,在实现中一般置为0向量。

在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数RNN 名字国籍 rng成员国籍_循环神经网络_44,RNN 名字国籍 rng成员国籍_循环神经网络_45,RNN 名字国籍 rng成员国籍_RNN 名字国籍_46。其反应着RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。

这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么RNN 名字国籍 rng成员国籍_循环神经网络_19RNN 名字国籍 rng成员国籍_RNN_26之间的RNN 名字国籍 rng成员国籍_循环神经网络_44矩阵与RNN 名字国籍 rng成员国籍_循环神经网络_50RNN 名字国籍 rng成员国籍_deep learning_51之间的RNN 名字国籍 rng成员国籍_循环神经网络_44是不同的,而RNNs中的却是一样的,同理对于RNN 名字国籍 rng成员国籍_循环神经网络_53RNN 名字国籍 rng成员国籍_循环神经网络_53层之间的RNN 名字国籍 rng成员国籍_RNN 名字国籍_46RNN 名字国籍 rng成员国籍_循环神经网络_53层与RNN 名字国籍 rng成员国籍_deep learning_57层之间的RNN 名字国籍 rng成员国籍_循环神经网络_45也是一样的。

RNN的应用

由上图我们可以看到它每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。

鉴于此,RNN可以解决很多不同的问题,其结构可以有一下几种形式:

RNN 名字国籍 rng成员国籍_数据_59

RNNs已经被在实践中证明对NLP是非常成功的。如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最广泛最成功的模型便是LSTMs(可以参考我的这篇博客)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNNs,只是在隐藏层做了手脚。对于LSTMs,后面会进行详细地介绍。下面对RNNs在NLP中的应用进行简单的介绍。

  • 音乐生成(one to many) 在这种情况下,用户可以不需要输入,或者只输入想要生成的音乐的类型。然后机器自动的输出一段旋律。
  • 情感分类(many to one) 比如电影评分,机器根据一段用户对电影的评论给出其好评度。
  • 命名实体识别(many to many) 比如给定一段文本,找出其中所有的人名。在这种情况下,RNN 名字国籍 rng成员国籍_RNN_60
  • 机器翻译(many to many) 机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。注意,在这种情况下,可能存在RNN 名字国籍 rng成员国籍_数据_61。 RNNs中的语音识别研究论文:先戳这里再戳这里
  • 语音识别(many to many) 是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。 RNNs中的语音识别研究论文:请戳这里
  • 图像描述生成 (Generating Image Descriptions) 和卷积神经网络(convolutional Neural Networks, CNNs)一样,RNNs已经在对无标图像描述自动生成中得到应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。如下图所示: