RNN学习笔记以及LSTM详解

来源:互联网 发布:成都理工大学网络 编辑:程序博客网 时间:2024/06/05 02:59

RNN

RNN介绍

RNN的目的使用来处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。

一个RNN的简单例子

这里写图片描述

输入序列为 [1,1] , [1,1] , [2,2]
图中蓝色的为记忆单元,黄色的为输入单元,红色的为输出单元,首先记忆单元初始化为0,黄色为输入[1,1]时,绿色的输出为黄色的输入加蓝色的输入。也就是说绿色的输入有四个,二个蓝色的单元和二个黄色的单元,红色的output为[4,4]。然后把蓝色的更新为绿色的输出[2,2]。

这里写图片描述

此时记忆单元(蓝色的神经元)已经更新为[2,2],再输入序列的第二个数[1,1],绿色神经元输出位[6,6],红色的神经元输出为[12,12]。以此类推。这样就把上一个时间序列的信息存贮到记忆单元中,然后传输到下一个序列位置。而且随意调换序列的顺序,输出序列是不一样的,所以这也就考虑到了序列的Order。

RNN处理句子序列

这里写图片描述

Input神经元先输入第一个词的Vector表示,然后产生第一个时间点的output y1以及记忆单元存贮a1,然后输入第二个词,此时绿色神经元的输入为上一个时刻记忆单元存贮的值a1和第二个词的向量(x2),再把绿色神经元的输出更新存贮到记忆单元(图中蓝色单元)中,以此类推。这里蓝色神经元也就是记忆单元。

这里只考虑了一个隐层,当考虑多个隐层时:

这里写图片描述

这个是RNN最基本的概念。根据记忆单元的不同以及输入到记忆单元的区别又衍生了很多种RNN的变体。

双向RNN

这里写图片描述

双向的RNN:二个序列,一个正序,一个反序。然后在同一时刻正反序的接到一起产生输出。这样的优点是输出考虑的词更多。
比如一个词序列1,2,3,4,5,6。反序为6,5,4,3,2,1,当输入到第三个时刻时,所以的词都考虑到了。正序1,2,3,反序6,5,4。(个人理解)

现在比较常用的记忆单元(Memory)是LSTM。

LSTM

LSTM介绍

LSTM(Long Short-Term Memory)是长短期记忆网络,是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。

这里写图片描述

LSTM包括四个输入,一个输出。

Input Gate的功能是外界能否存入值到Memory里去。当打开时,能存入,当关闭时,则不能存入值。
Output Gate的功能是决定Memory的值能否传递到外面单元去。
Forget Gate 的功能是什么时候要把过去记忆的东西忘掉。
Input Gate和Output Gate以及Forget Gate的打开和关闭都是通过学习自己学习得到的。

而LSTM有四个inputs和一个output:
1.想要被存入到Memory里面的值,但是不一定存的进去(看Input Gate的开关)
2.操控Input Gate的输入
3.操控Output Gate的输入
4.操控Forget Gate的输入

一个输出:
Memory输出的值(不一定能输出,要受Output Gate的控制)

为什么会被称为长短记忆呢?我的理解是,之前的RNN记忆单元每次只能记忆前面一个时刻的值,每一次都会重新给memory赋值,从而刷新,而LSTM只要Forget Gate不关闭(忘记)就会记得前面序列的所有信息。

描述更为实际的LSTM图:

这里写图片描述

如上图所示,四个输入分别为:
想要被存入到Memory里面的值z
操控Input Gate的输入zi
操控Output Gate的输入zo
操控Forget Gate的输入zf

那么这三个控制门又是怎么实现控制的呢?
Zi通过激励函数变成f(zi),取值为0或者1,z通过激励函数为g(z),然后做乘法,f(zi)*g(z),当f(zi)取值为0时,相当于没有值存入到记忆单元,此时相当于Input Gate为关闭状态。
其他二个门同理,通过激励函数转换之后的输出值为0或1二个状态来实现门的开和关二个状态。如图,原来记忆单元存贮值为f(zf),此时输入为
g(z)f(zi),记忆单元从上一时刻传递累计下来的值为cf(zf),此时记忆单元更新为g(z)f(zi)+cf(zf),当f(zf)为0时,相当于forget Gate关闭,前面累计下来的值清零。再把此时更新之后的记忆单元的值与输出门做乘法,得到输出。

LSTM例子

这里写图片描述

输入序列为x1,x2,x3时,蓝色为记忆单元值,y为输出值。

Step1:输入为第一个向量时

这里写图片描述

四个控制门的输入为输入序列乘以weight加上bias,权重和偏置都是通过训练数据集学习得到的,为了计算方便,这里给出了一组数值。

输入为3,1,0时,Input Gate的值为1,输入为3,Forget Gate的值为1,Output Gate值为0,所以输出为0。此时记忆单元值更新为3。

Step2:输入为第二个向量时

这里写图片描述

输入为4,1,0时,Input Gate的值为1,输入为4,Forget Gate的值为1,Output Gate值为0,所以输出为0。此时记忆单元值更新为7。以此类推。这样可以非常直观的看出RNN+LSTM的计算流程。

从上图可以看出,LSTM有四个输入,所以LSTM比一般的network的参数多四倍。

上面其实是非常简单的LSTM例子,并不能反映实际用的过程中的计算过程,更为一般的,来,我们接下来继续说。

这里写图片描述

这个图已经不陌生了吧,但是和上面那个例子有点不同,我是这样理解的,xt是t时刻的输入向量,z,zt,zo,zi分别为LSTM四个输入,那他们是怎么来的?xt向量乘以不同的权重矩阵构成了z,zt,zo,zi,然后z,zt,zo,zi分别作为LSTM的四个不同输入,这个时候问题又来了,为什么只有一个LSTM?别急,看下图,其实,每一个LSTM的输入都是一维的,所以你有多少维,就应该有多少LSTM。

这里写图片描述

趁热打铁,每一个记忆单元的值以及上一个时刻的输出会和xt一起来乘以不同的matrix生成此时刻的z,zt,zo,zi,所以就变成了这样:

这里写图片描述

上面考虑的仅仅是只有一个隐藏层的,但是很多时候隐层往往是多层甚至是深层的,所以你经常看到的应该是这样的:

这里写图片描述

所以以后看到这个图也就不用一脸懵逼了~~~~

参考:http://speech.ee.ntu.edu.tw/~tlkagk/index.html

原创粉丝点击