建设网站公司怎么收费百度指数下载手机版
声明:
本文基于哔站博主【Shusenwang】的视频课程【RNN模型及NLP应用】,结合自身的理解所作,旨在帮助大家了解学习NLP自然语言处理基础知识。配合着视频课程学习效果更佳。
材料来源:【Shusenwang】的视频课程【RNN模型及NLP应用】
视频链接:
RNN模型与NLP应用(3/9):Simple RNN模型_哔哩哔哩_bilibili
一、学习目标
1. 了解什么是Simple RNN 模型
2.清楚Simple RNN 模型的底层逻辑
3.如何用编程实现一个Simple RNN 模型
二、RNN
【小提示】现在的NLP自然语言处理很少用到RNN模型了。在数据集较大的情况下大家普遍用的都是transformer(后续会讲到),本节课让我们先从RNN开始学习。
RNN可以用来处理时序数据
可以处理这种多对一、多对多的数据
这是一个简单的RNN模型示意图:
【运作原理】
RNN模型会将一段文字从第一个字一个一个读取到最后一个子,并且读一个记忆一个。就像h_0记录了输入X_0的信息,h_1记录了X_0和X_1的信息,以此类推:h_t记录了从X_0到X_t的所有文字信息。
【注意】
更新h时需要用到一个参数矩阵A。整个RNN模型只需要用到一个参数矩阵A。
三、Simple RNN
1.我们来看一下Simple RNN是如何将X_t与h_t-1构成h_t的。
如图:
h_t 是由参数矩阵A×(X_t与h_t-1的整合矩阵),再经过tanh函数的季激活最终得到的一个矩阵。
h_t的维度就是参数矩阵A的行数。
A参数矩阵的列数是(X_t与h_t-1的整合矩阵)的维度即行数。
这个过程可以这样的理解:
【思考】为什么要使用tanh函数?
因为h_100=A**100×h_0,那么当A的最大特征值为0.9时A**100会无限接近于0,则新的h_100也是一个无限接近于0的数。这种现象类似于我们一开始学习深度学习时学到的梯度消失。
同理,当A最大特征值为1.2时,则A**100就会变得非常的大,也类似于我们一开始学习深度学习时学到的梯度爆炸。
2.A参数矩阵的总参数
Total #parameter: shape(h)× [shape(h)+shape(x)]
四、代码实现Simple RNN
【应用示例】示例为上节课所讲的电影评论
搭模型:
(1)设置h的维度为32、X的维度为32【这里二者维度相等,但通常二者不相等】
(2)将评论进行词划分,分别被标记为X_0、X_1...X_t.
(3)最后用sigmoid()函数将h_t化成一个(0,1)的值,用来判断电影评价的好与坏
(4)我选择只输出h_t,其他的h删除不显示,你也可以选择都显示
代码:【王树森老师所用框架为tensorflow,但作者我更喜欢用pytorch】
①vocabulary词汇表大小为10000
②embedding_dim词向量维度为32,即X维度=32
③word_num每个电影评论有500个单词
④state_dim状态向量为32,即h维度=32
⑤Sequential:可以将神将网络按顺序搭建起来
⑥embedding层:输出为20×8的矩阵,每条电影评论选取20个单词,每个单词词向量是8维的
⑦SimpleRNN层:”return_sequence=False“意思是我只输出最后一个状态向量h
⑧Dense全连接层:输出一个(0,1)之间的一个数,来判别评论是正面的还是负面的
⑨Summary:模型概要
参数数量:
32×(32×32)即此公式——>shape(h)× [shape(h)+shape(x)]
最后面内个+32是Dence层偏移量的数量
编译并拟合模型:
epoches=3这是Early stopping操作,在深度学习中我们同时还与其一同了解了dropout操作,二者都是为了防止模型过拟合
最后测试数据:
【思考】如果我想使用h_0到h_t的所有数据的话,那么你就需要再添加一个Flatten层,将所有的h压缩为一个向量,然后再使用sigmoid函数激活。
这时需要将下面代码中的return_sequence=False改为True即可
五、Simple RNN的缺点:
Simple RNN 只长短期记忆,只擅长short term denpendence(短程依赖关系),不擅长long term dependence(长程依赖关系)。当语句数量很长时,Simple RNN则无法对下一个词做出准确预测,
下一节课我们会讲到LSTM模型,它可以满组long term denpendence (长程依赖关系)
六、总结
(1)RNN是一种神经网络,但是他不同于全连接层网络和卷积神经网络,它适用于文本、语音、时序等数据
(2)状态向量h_t中包含了之前所有的x信息
(3)RNN记忆比较短,他会忘记很久之前的输入X,