循环神经网络 RNN
1、前言
数据足够多的时候RNN已经不流行了,自然语言处理多用transformer来进行
2、怎样用时序数据来建模?
传统的one to one模型不适合处理时序性数据,通常情况来说输入和输出的长度都不固定 ,对于时序数据,最好输入和输出的长度都不固定 many to one / many to many,
状态ht看做是从这句话“ the cat sat on the mat.”抽取的特征向量
更新状态h需要用到参数A
A 是参数矩阵,整条链只有一个,A随机初始化,然后利用训练数据来学习A
3、simple RNN
上一时刻的状态ht-1和新输入的词向量xt做(那个词没听清)得到一个更高的向量,与参数矩阵A相乘,矩阵与向量乘积是向量,再把tanh激活函数(默认)用于向量的每一个元素,把激活函数的输出作为新时刻的状态向量ht,ht的每一个元素都在-1到1之间,
新的状态ht,依赖于向量ht-1,xt以及矩阵A
参数数量
4、搭建简单RNN
输入词向量x和h的维度是自己设置的,记得调参留最优,可以只保留最后一个状态(包含“I love the movie so much的全部信息”),然后再输入一个分类器,判断这句话是消极还是积极
(计算参数个数的最后一个32是偏置量b)
若是你想用h0-ht所以的这些状态也可以,如果你让Keras返回所有状态,RNN的输出就是个矩阵,矩阵的每一行是一个状态向量h,如果用所有状态需要加一个flatten层,把状态矩阵变成一个向量,然后把这个向量作为分类器的输入
只需要把代码变成
原来我只要求输出最后一个向量,所以RNN层的输出就是一个32的向量,现在我要求都输出,RNN层的输出就是一个500*32的矩阵,500的意思是电影评论里有500个单词,所以一共有五百个特征向量,每个状态向量都是32维的
【实际试验过程中发现用最后一个状态和全部状态并没有显著区别】
5、simpleRNN的缺陷
比如目前任务是给定半句话要求预测下一个单词:
(1),比如输入时cloud are in the 正确的输出应该是sky,(只借助前面几个词进行预测)RNN可以完成,RNN很擅长short-term dependence
状态h100 会把之前的输入忘记,RNN的记忆只有7秒
RNN->LSTM:
遗忘其实就是深度学习中老生常谈的梯度消失
LSTM或GRU的作用:它可以学习只保留相关信息来进行预测,忘记不相关的数据。在这种情况下,你记得的单词让你判断麦片是好的。
LSTM
LSTM比RNN复杂的多,RNN有一个参数矩阵,LSTM有四个
1、LSTM的内部结构
过去的向量通过传输带送到下一个时刻,不会发生太大的变化,LSTM就是靠传输带来避免梯度消失的问题
LSTM中有很多个Gates可以有选择的让信息通过
forget gate遗忘门由sigmoid函数和element-wise multiplication(两个矩阵对应位置元素进行乘积)两部分组成,
输入sigmoid是一个向量a,算出遗忘门向量f
f怎么算出来的呢
ft是上一个状态ht-1和当前状态xt的函数(图右侧的计算过程)
遗忘门有一个参数Wf需要通过反向传播在训练数据里学习
input gate输入门,运算过程和遗忘门差不多
输入门有一个参数Wi需要通过反向传播在训练数据里学习
New value 也很像,激活函数不一样是tanh
有一个参数Wc需要通过反向传播在训练数据里学习
output计算LSTM的输出,也就是状态向量ht
输出门有一个参数Wo需要通过反向传播在训练数据里学习
LSTM输出ht计算
所有xt状态的信息都积累到了ht里面
2、LSTM的实现
1、任务:电影评论情感分析
代码几乎一样就是层名变了
LSTM层是2080*4=8320个参数
也可以用dropout
但是dropout也不一定提升准确率,因为过拟合是由embedding层造成的(32万个参数)
LSTM总是要比simpleRNN要好