NLP学习笔记(三):RNN网络

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} ht1,新输入的词向量记作 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} ht1和输入 x t x_t xt的函数,神经网络的模型参数是矩阵A 。新的状态 h t h_t ht依赖于 h t − 1 h_{t-1} ht1 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只有一个参数矩阵,不管这个时序多长,都是一个。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值