RNN与LSTM学习

来源:互联网 发布:mac客人用户退出不了 编辑:程序博客网 时间:2024/06/05 09:15

RNN&LSTM基本原理

别人的翻译太水,实在是看不下去去了,自己搞一个。

RNN(循环神经网络)

神经元结构:




展开:


这就是循环神经网络,天生就是用来处理序列信息的。

LSTM(long short term memory)

主要来源:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

动机

首先LSTM是对RNN的一个改进,既然是改进,那么肯定是针对RNN的某个缺陷来的。RNN的缺陷就是,当RNN比较长的时候,由于前面的信息过于久远,因此对当前的状态所起到的作用就很小了,但是在各种序列信息里,和当前状态最相关的信息不一定出现在哪里,如果出现的比较久远,RNN就搞不定了,因为它已经忘了。其实这个问题就是梯度消失和梯度爆炸造成的。


例如我们做完型填空时,可能需要整合全文来填某一个词,比如I grew up in France…(此处省略一万字)I speak fluent _____ .。如果网络只知道邻近的几个单词,可能

它会知道此处需要填写一门语言,但至于应该填什么,就需要找到更远前的信息,直到找到 France 才行。这种需要寻找相距很远信息的情况,实际上非常常见。

因此我们就得想办法让RNN找到那些信息比较重要,然后把他记住。

基本结构

先看传统的RNN结构:


LSTM也有这样的链状结构,但是有所不同。

具体是这样:


传统的RNN中只有一层网络,而LSTM中有四层。


l  黄色块表示神经网络层;

l  粉圈代表按位操作(pointwise operations),如向量加法;

l  每条线代表着一个向量(vector),用来表示从一个节点的输出到另一个节点的输入;

l  合并的线代表连接(concatenate);

l  分叉的线表示复制(copy)。


既然要记住,那么就得肯定有一块存储空间去记住,因此LSTM中增加了一个叫Cell的东西,用来存储要记住的信息,这个也是LSTM的核心所在。

在不同的节点里面,有不同的Cell,这些Cell组成了一条Cell信息的链路,也就是图中上面那一条. Cell 的状态就像是传送带,它的状态会沿着整条链条传送,而只有少数地方有一些线性交互。



LSTM 通过一种名为门(gate)的结构控制cell 的状态,并向其中删减或增加信息。门由一个 sigmoid 网络层与一个按位乘操作构成,这个门可以控制信息的通过与否。




其中那个Sigmod函数输出一个在0和1之间的值,指示了有多少信息可以通过这个门,如果是0,表示不通过任何信息,如果是1,表示让所有信息通过。

LSTM运行过程

现在重点来了,LSTM到底是如何工作的。

在LSTM中有三种门:Forget Gate、Input Gate、Output Gate。

Forget Gate:

首先是Forget Gate,就是他:



它是用来控制哪些信息需要被记住、哪些信息需要被忘记。具体是通过一个Sigmod函数来实现的。它的输入是ht1和xt,然后对于cell state Ct1中的每一个信息都输出一个处于0-1的值,1表示完全记住,0表示完全抛弃。

拿刚才预测单词的语言模型来举例,cell 的状态可能会需要考虑主语的性别,这样才能找到正确的代词。因此我们设定:

如果看到了一个新的主语,就忘记旧的主语所代表的性别。

Input Gate:

之后就是Input Gate(输入门)



这个门是控制那些数据需要被存储在Cell中,这一过程分为两个部分:

第一,有一个基于Sigmod的输入门,这个门用来决定那些数据需要被更新;

第二,有一个tanh来生成一个存储候选更新信息的向量Ct_hat,这些信息是可以被加入到cell中的;

之后,就是可以使用这两个信息对cell state 进行更新。

在刚才的例子中,我们需要将新主语的性别信息加入 cell 的状态中,以替换要忘记的旧信息。

更新信息的过程就是将Ct1更新为Ct,前面已经得到了用于更新Ct的所有信息。



具体过程为:首先用ft乘以Ct1,将该忘的都忘掉,然后加上itCt_hat,前面讲过,就是候选信息,it表示的是我们对这些信息按多少比例更新。

在例子中,说的就是我们用新的主语的性别代替了旧的主语的性别。

Output Gate:

最后就是我们要决定对外输出什么,这个是由output gate(输出门)所控制的,所输出的信息是基于那个刚才已经更新过的Cell State,

但是经过了一些过滤。

首先还是用一个Sigmod来决定Cell State中的那些信息需要被输出,

之后我们让Cell State 通过一个tanh函数(将输出归一到-1到1之间),

然后将二者相乘,目的就是只输出那些我们想要输出的信息。



对于语言模型的例子,当它只看到一个主语时,就可能会输出与动词相关的信息。比如它会输出主语是单数还是复数。

这样的话,如果后面真的出现了动词,我们就可以确定它的形式了。

总结一个规律,这里的门用的都是Sigmod函数,门是用来控制那些信息可以通过,那些不能通过,当然这个门不是hard门,而是是soft门,

因此使用了Sigmod而不是binary(0或者1),然后信息的变化用的是tanh函数。


原创粉丝点击