关于RNN那点事儿

废话不说,进入正题。

为什么需要RNN

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

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

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

何为RNN

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

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

单词表示

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

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

假设我们现在有一个包含10000个单词的词汇表,其中 a a a为词汇表中第一个单词, a n d and and为第367个, h a r r y harry harry为第4075个, p o t t e r potter potter为第6830个,而 r e l u relu relu为词汇表中最后一位。

那么这样一个序列数据 “ H a r r y Harry Harry P o t t e r Potter Potter a n d and and H e r m i o n e Hermione Hermione G r a n g e r Granger Granger i n v e n t e d invented invented a a a n e w new new s p e l l spell spell” 里的每一个单词就可以表示为如下图这种形式。我们称之为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),输入集标记为 { x 0 , x 1 , . . . , x t , x t + 1 , . . . x_0,x_1,...,x_t,x_{t+1},... x0,x1,...,xt,xt+1,...}。 x t x_t xt表示第 t t t (t=1,2,3…步(step)的输入。比如, x 1 x_1 x1为第二个词的one-hot向量(根据上图, x 0 x_0 x0为第一个词);

(2)输出单元(Output units),输出集则被标记为 { y 0 , y 1 , . . . , y t , y t + 1 . , . . y_0,y_1,...,y_t,y_{t+1}.,.. y0,y1,...,yt,yt+1.,..}。 o t o_t ot是第t步的输出。

(3)隐藏单元(Hidden units),我们将其输出集标记为 { s 0 , s 1 , . . . , s t , s t + 1 , . . . s_0,s_1,...,s_t,s_{t+1},... s0,s1,...,st,st+1,...}。 s t s_t st为隐藏层的第t步的状态,它是网络的记忆单元。

使用公式将上图结构表示为:
s t = f ( U x t + W s t − 1 ) st=f(Ux_t+Ws_{t−1}) st=f(Uxt+Wst1)

o t = s o f t m a x ( V s t ) ot=softmax(Vs_t) ot=softmax(Vst)
如果隐层节点个数为100,字典大小C=10000,参数的维度信息为:

x t ∈ R 10000 x_t∈R^{10000} xtR10000

o t ∈ R 10000 o_t∈R^{10000} otR10000

s t ∈ R 100 s_t∈R^{100} stR100

U ∈ R 100 ∗ 10000 U∈R^{100*10000} UR10010000

V ∈ R 10000 ∗ 100 V∈R^{10000*100} VR10000100

W ∈ R 100 ∗ 100 W∈R^{100*100} WR100100

你可以认为隐藏层状态 s t s_t st是网络的记忆单元。 s t s_t st包含了前面所有步的隐藏层状 态。而输出层的输出 o t o_t ot只与当前步的 s t s_t st有关。其中 f f f一般是非线性的激活函数,如 t a n h tanh tanh R e L U ReLU ReLU,在计算 s 0 s_0 s0时,即第一个单词的隐藏层状态,需要用到 s − 1 s_{−1} s1,但是其并不存在,在实现中一般置为0向量。

在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数 U U U, V V V, W W W。其反应着RNNs中的每一步都在做相同的事,只是输入不同,因此大大地降低了网络中需要学习的参数。

这里并没有说清楚,解释一下,传统神经网络的参数是不共享的,并不是表示对于每个输入有不同的参数,而是将RNN是进行展开,这样变成了多层的网络,如果这是一个多层的传统神经网络,那么 x t x_t xt s t s_t st之间的 U U U矩阵与 x t + 1 x_{t+1} xt+1 s t + 1 s_{t+1} st+1之间的 U U U是不同的,而RNNs中的却是一样的,同理对于 s s s s s s层之间的 W W W s s s层与 o o o层之间的 V V V也是一样的。

RNN的应用

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值