废话不说,进入正题。
为什么需要RNN
在讨论RNN之前,首先我们来探讨一下—既然我们已经有了人工神经网络和CNN(卷积神经网络),为什么还需要RNN(循环神经网络,嗯,很多地方喜欢称之为递归神经网络,不管穿了什么马甲,其实是一个东西)?
原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。
但在现实世界中,很多元素都是相互连接的,比如你想预测句子中的下一个单词,你最好知道它前面有哪些单词。又比如一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去__________。上面这句话填空的话,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,因此,就有了现在的循环神经网络。循环神经网络的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。
何为RNN
我们已经知道RNN是用来处理序列数据的,那么什么样的数据可以被称为序列数据呢?别急,请看下图:
在上面的例子中,我们看到序列数据可以是一段音频,或一句话,又或是一段DNA序列。那么,RNN到底是怎么处理序列数据的呢?
单词表示
要想处理一段序列,我们首先得把序列数据表示为计算机可以识别的形式。首先我们应该有一个词汇表,词汇表中列出你要用到的所有单词。到这里你可能又想问我们怎么才能获得一个词汇表呢?
一般来说,有几种解决办法:(1)训练你的数据集,找到最常用的词;(2)直接到网上找一些词典,它能告诉你英语里最常用的单词是什么。
假设我们现在有一个包含10000个单词的词汇表,其中为词汇表中第一个单词,为第367个,为第4075个,为第6830个,而为词汇表中最后一位。
那么这样一个序列数据 “ ” 里的每一个单词就可以表示为如下图这种形式。我们称之为one-hot向量,每个单词都是一个10000维的向量,且只有一个值为1(它所在词汇表中的位置),其余值均为0。
到这里你可能又想问了,如果我们遇到了一个不在词典里的词怎么办呢?
我们可以创建一个新的标记,比如UNK
由上图可以看出,在使用one-hot表示单词时,缺点是十分明显的:
(1)由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加,麻烦!(Impossible to keep up to date);
(2)主观性太强(subjective) ,这么多单词,还得人工打labor并且adapt,想想就恐
(3)最不能忍受的一点便是很难计算单词之间的相似性。
现在有一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec。
RNN原理
RNN由三个单元组成:
(1)输入单元(Input units),输入集标记为 {}。表示第 (t=1,2,3…步(step)的输入。比如,为第二个词的one-hot向量(根据上图,为第一个词);
(2)输出单元(Output units),输出集则被标记为 {}。是第t步的输出。
(3)隐藏单元(Hidden units),我们将其输出集标记为 {}。为隐藏层的第t步的状态,它是网络的记忆单元。
使用公式将上图结构表示为:
如果隐层节点个数为100,字典大小C=10000,参数的维度信息为:
你可以认为隐藏层状态是网络的记忆单元。包含了前面所有步的隐藏层状 态。而输出层的输出只与当前步的有关。其中一般是非线性的激活函数,如或,在计算时,即第一个单词的隐藏层状态,需要用到,但是其并不存在,在实现中一般置为0向量。
在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数,,。其反应着RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。
这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么到之间的矩阵与到之间的是不同的,而RNNs中的却是一样的,同理对于与层之间的、层与层之间的也是一样的。
RNN的应用
由上图我们可以看到它每一步都会有输出,但是每一步都要有输出并不是必须的。比如,我们需要预测一条语句所表达的情绪,我们仅仅需要关系最后一个单词输入后的输出,而不需要知道每个单词输入后的输出。同理,每步都需要输入也不是必须的。RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
鉴于此,RNN可以解决很多不同的问题,其结构可以有一下几种形式:
RNNs已经被在实践中证明对NLP是非常成功的。如词向量表达、语句合法性检查、词性标注等。在RNNs中,目前使用最广泛最成功的模型便是LSTMs(可以参考我的这篇博客)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNNs,只是在隐藏层做了手脚。对于LSTMs,后面会进行详细地介绍。下面对RNNs在NLP中的应用进行简单的介绍。
- 音乐生成(one to many) 在这种情况下,用户可以不需要输入,或者只输入想要生成的音乐的类型。然后机器自动的输出一段旋律。
- 情感分类(many to one) 比如电影评分,机器根据一段用户对电影的评论给出其好评度。
- 命名实体识别(many to many) 比如给定一段文本,找出其中所有的人名。在这种情况下,。
- 机器翻译(many to many) 机器翻译是将一种源语言语句变成意思相同的另一种源语言语句,如将英语语句变成同样意思的中文语句。与语言模型关键的区别在于,需要将源语言语句序列输入后,才进行输出,即输出第一个单词时,便需要从完整的输入序列中进行获取。注意,在这种情况下,可能存在。 RNNs中的语音识别研究论文:先戳这里再戳这里
- 语音识别(many to many) 是指给一段声波的声音信号,预测该声波对应的某种指定源语言的语句以及该语句的概率值。 RNNs中的语音识别研究论文:请戳这里
- 图像描述生成 (Generating Image Descriptions) 和卷积神经网络(convolutional Neural Networks, CNNs)一样,RNNs已经在对无标图像描述自动生成中得到应用。将CNNs与RNNs结合进行图像描述自动生成。这是一个非常神奇的研究与应用。该组合模型能够根据图像的特征生成描述。如下图所示: