RNN与LSTM学习
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函数来实现的。它的输入是ht−1和xt,然后对于cell state Ct−1中的每一个信息都输出一个处于0-1的值,1表示完全记住,0表示完全抛弃。
拿刚才预测单词的语言模型来举例,cell 的状态可能会需要考虑主语的性别,这样才能找到正确的代词。因此我们设定:
如果看到了一个新的主语,就忘记旧的主语所代表的性别。
Input Gate:
之后就是Input Gate(输入门)
这个门是控制那些数据需要被存储在Cell中,这一过程分为两个部分:
第一,有一个基于Sigmod的输入门,这个门用来决定那些数据需要被更新;
第二,有一个tanh来生成一个存储候选更新信息的向量Ct_hat,这些信息是可以被加入到cell中的;
之后,就是可以使用这两个信息对cell state 进行更新。
在刚才的例子中,我们需要将新主语的性别信息加入 cell 的状态中,以替换要忘记的旧信息。
更新信息的过程就是将Ct−1更新为Ct,前面已经得到了用于更新Ct的所有信息。
具体过程为:首先用ft乘以Ct−1,将该忘的都忘掉,然后加上it∗Ct_hat,前面讲过,就是候选信息,it表示的是我们对这些信息按多少比例更新。
在例子中,说的就是我们用新的主语的性别代替了旧的主语的性别。
Output Gate:
最后就是我们要决定对外输出什么,这个是由output gate(输出门)所控制的,所输出的信息是基于那个刚才已经更新过的Cell State,
但是经过了一些过滤。
首先还是用一个Sigmod来决定Cell State中的那些信息需要被输出,
之后我们让Cell State 通过一个tanh函数(将输出归一到-1到1之间),
然后将二者相乘,目的就是只输出那些我们想要输出的信息。
对于语言模型的例子,当它只看到一个主语时,就可能会输出与动词相关的信息。比如它会输出主语是单数还是复数。
这样的话,如果后面真的出现了动词,我们就可以确定它的形式了。
总结一个规律,这里的门用的都是Sigmod函数,门是用来控制那些信息可以通过,那些不能通过,当然这个门不是hard门,而是是soft门,
因此使用了Sigmod而不是binary(0或者1),然后信息的变化用的是tanh函数。