「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。
导语
本文为我之前在CSDN平台上的一篇博客记录。原链接为:NLP学习笔记(三):RNN网络
RNN网络(Recurrent Neural Network)
机器学习中经常处理时序数据,那么怎么对时序数据进行建模呢?
之前我们了解了全连接网络和卷积网络,这两种网络都是One to One模型,它将输入作为一个整体,具有固定长度的输入和输出,它很适合图片的问题,却不太适合文本的问题。对于文本问题,我们的输入和输出的长度并不固定,一种更好的模型时Many to One 或者 Many to Many模型,RNN就是这样的模型,输入和输出的长度不固定,很适合语音、文本等时序序列数据。
RNN跟人类的阅读习惯很类似。人每次看一个字,逐渐在大脑里积累信息。RNN每次也看一个词,用状态向量来
积累阅读过的信息。我们把输入的一个词用word embedding变成一个词向量输入RNN,然后RNN就会更新状态,把新的输入积累到里面。
如图所示,包含了第一个词the的信息,包含了前两个词的信息。以此类推,最后一个状态包含了整句话的信息,可以看做是从这句话抽取的特征向量。
而更新状态时需要用到参数矩阵,请注意:整个RNN只有一个参数,无论图中示意的这条链有多长,参数只有一个。A随机初始化,然后用训练数据来学习。
简单循环神经网络(Simple RNN)
我们来具体看一下Simple RNN是怎样将输入x结合到状态里面的。
如图所示,记上一个状态为,新输入的词向量记作。把这两个向量做concatenation,得到一个更高维的向量。矩阵A为RNN的模型参数。然后计算矩阵A和拼接后向量的乘积,得到一个向量。然后把激活函数用在向量的每一个元素上,这里的激活函数为tanh,把激活函数的输出作为新的状态向量。
由于使用了tanh激活函数,所以向量的每个元素值都在-1到+1之间。
下图可以这样理解:新的状态是旧的状态和输入的函数,神经网络的模型参数是矩阵A 。新的状态依赖于、和矩阵A。
思考一个问题:为什么需要tanh作为激活函数?能否去掉?
我们假设输入,那么,假如矩阵A的最大特征值为小于1,比如为0.9,那么由于非常接近0了,所以矩阵A几乎为全0了,那么新的状态几乎也是一个全0的向量。 假如矩阵A的最大特征值为1.2,那么由于超级大了,所以矩阵A的元素也超级打,那么新的状态几乎也是一个超大数值的向量。
如此来看,如果没有激活函数,会出大问题。要么数值全为0,要么数值巨大溢出。而使用激活函数,则保证每次模型的输出都在-1到+1之间。
接下来,我们来看一下这个模型的参数数目。 拼接的向量长度为h的维度加x的维度,所以矩阵A的列数为shape(h)+shape(x),A的行数等于向量h的维度。所以矩阵A的大小就是shape(h) [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都会发生变化。但实际上,简单RNN并没有这种性质,这很不合理。
如果把第100个状态关于输入求导,会发现导数几乎等于0。这说明如果改变,那么几乎不会发生任何变化。即第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中记录看到的每一个信息。中积累了之前所有的x信息,可以认为就是从整个序列中抽取的特征向量。
- RNN有个缺点:它的记忆比较短,会遗忘很早的输入信息。
- 简单RNN有一个参数矩阵A(有可能还有一个intercept向量b,这节课忽略了),这个参数的维度是shape(h) [shape(h)+shape(x)]。参数矩阵一开始随机初始化,然后从训练数据中学习。注意,简单RNN只有一个参数矩阵,不管这个时序多长,都是一个。