概述
RNN网络(Recurrent Neural Network)
机器学习中经常处理时序数据,那么怎么对时序数据进行建模呢?
之前我们了解了全连接网络和卷积网络,这两种网络都是One to One模型,它将输入作为一个整体,具有固定长度的输入和输出,它很适合图片的问题,却不太适合文本的问题。对于文本问题,我们的输入和输出的长度并不固定,一种更好的模型时Many to One 或者 Many to Many模型,RNN就是这样的模型,输入和输出的长度不固定,很适合语音、文本等时序序列数据。
RNN跟人类的阅读习惯很类似。人每次看一个字,逐渐在大脑里积累信息。RNN每次也看一个词,用状态向量
h
h
h来
积累阅读过的信息。我们把输入的一个词用word embedding变成一个词向量
x
x
x输入RNN,然后RNN就会更新状态
h
h
h,把新的输入积累到
h
h
h里面。
如图所示,
h
0
h_0
h0包含了第一个词the的信息,
h
1
h_1
h1包含了前两个词的信息。以此类推,最后一个状态
h
t
h_t
ht包含了整句话的信息,可以看做是从这句话抽取的特征向量。
而更新状态 h h h时需要用到参数矩阵 A A A,请注意:整个RNN只有一个参数 A A A,无论图中示意的这条链有多长,参数 A A A只有一个。A随机初始化,然后用训练数据来学习。
简单循环神经网络(Simple RNN)
我们来具体看一下Simple RNN是怎样将输入x结合到状态 h h h里面的。
如图所示,记上一个状态为 h t − 1 h_{t-1} ht−1,新输入的词向量记作 x t x_t xt。把这两个向量做concatenation,得到一个更高维的向量。矩阵A为RNN的模型参数。然后计算矩阵A和拼接后向量的乘积,得到一个向量。然后把激活函数用在向量的每一个元素上,这里的激活函数为tanh,把激活函数的输出作为新的状态向量 h t h_t ht。
由于使用了tanh激活函数,所以向量 h t h_t ht的每个元素值都在-1到+1之间。
下图可以这样理解:新的状态 h t h_t ht是旧的状态 h t − 1 h_{t-1} ht−1和输入 x t x_t xt的函数,神经网络的模型参数是矩阵A 。新的状态 h t h_t ht依赖于 h t − 1 h_{t-1} ht−1、 x t x_t xt和矩阵A。
思考一个问题:为什么需要tanh作为激活函数?能否去掉?
我们假设输入
x
0
=
⋯
=
x
100
=
0
x_0 = cdots = x_{100} = 0
x0=⋯=x100=0,那么
h
100
=
A
h
99
=
⋯
=
A
100
h
0
h_{100} = Ah_{99} = cdots = A^{100}h_0
h100=Ah99=⋯=A100h0,假如矩阵A的最大特征值为小于1,比如为0.9,那么由于
0.
9
100
0.9^{100}
0.9100非常接近0了,所以矩阵A几乎为全0了,那么新的状态
h
100
h_{100}
h100几乎也是一个全0的向量。
假如矩阵A的最大特征值为1.2,那么由于
1.
2
100
1.2^{100}
1.2100超级大了,所以矩阵A的元素也超级打,那么新的状态
h
100
h_{100}
h100几乎也是一个超大数值的向量。
如此来看,如果没有激活函数,会出大问题。要么数值全为0,要么数值巨大溢出。而使用激活函数,则保证每次模型的输出都在-1到+1之间。
接下来,我们来看一下这个模型的参数数目。
拼接的向量长度为h的维度加x的维度,所以矩阵A的列数为shape(h)+shape(x),A的行数等于向量h的维度。所以矩阵A的大小就是shape(h)
×
times
× [shape(h)+shape(x)]。这个乘积值就是Simple RNN的参数数量。
简单RNN于影评数据集(Simple RNN for Movie Review Analysis)
Keras实现 略
简单RNN的缺点(Shortcomings of SimpleRNN)
下面我们来看一下简单RNN有什么缺陷。
举个例子,假设有这样一句话要求预测下一个单词:输入是clouds are in the ,正确的输出应该是sky。
如果在大量例子训练过的,RNN应该是有能力作出这样的预测的,它并不需要去看远处的单词,只需要根据附近的clouds are就可以判断出sky。这种情况是对简单RNN有利的情形,它很适合这种short-term dependence。它的缺点是不擅长long-term dependence,假设RNN中的状态 h t h_{t} ht跟之前所有输入的单词都有依赖关系,照理来说,如果改变输入单词 x 1 x_1 x1,那么之后所有状态h都会发生变化。但实际上,简单RNN并没有这种性质,这很不合理。
如果把第100个状态关于输入 x 1 x_1 x1求导,会发现导数几乎等于0。这说明如果改变 x 1 x_1 x1,那么 h 100 h_{100} h100几乎不会发生任何变化。即第100个状态对于之前的输入没有关系,这显然不合理,这说明100步后,它已经把之前的输入给忘记了。简单RNN的遗忘会导致一些问题。
比如一段很长的话,I grew up in China when I was young, ……,很多句话之后,有一句 I can speak fluent ,下一个单词应该填Chinese,然而简单RNN不太可能会作出这个判断,因为它已经把前文给忘记了。简单RNN对short-term dependence很好,所以它应该知道要填一个语言,但它未必会填Chinese,因为它已经把前文给忘掉了。
总结
- RNN是一种神经网络,但它的结构不同于全连接网络和卷积网络。RNN适用于文本、语音、时序序列等数据。RNN按照顺序读取每一个输入,并在状态h中记录看到的每一个信息。 h t h_t ht中积累了之前所有的x信息,可以认为 h t h_t ht就是从整个序列中抽取的特征向量。
- RNN有个缺点:它的记忆比较短,会遗忘很早的输入信息。
- 简单RNN有一个参数矩阵A(有可能还有一个intercept向量b,这节课忽略了),这个参数的维度是shape(h) × times × [shape(h)+shape(x)]。参数矩阵一开始随机初始化,然后从训练数据中学习。注意,简单RNN只有一个参数矩阵,不管这个时序多长,都是一个。
最后
以上就是野性茉莉为你收集整理的NLP学习笔记(三):RNN网络RNN网络(Recurrent Neural Network)的全部内容,希望文章能够帮你解决NLP学习笔记(三):RNN网络RNN网络(Recurrent Neural Network)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复