循环神经网络(RNN)

循环神经网络(RNN),神经元的输出能够在下一个时间戳直接做用到自身(做为输入),看看下面的对比图: 网络

 

从上面的两个简化图,能够看出RNN相比经典的神经网络结构多了一个循环圈,这个圈就表明着神经元的输出在下一个时间戳还会返回来做为输入的一部分,这些循环让RNN看起来彷佛很神秘,然而,换个角度想一想,也不比一个经典的神经网络难于理解。RNN能够被看作是对同一神经网络的屡次赋值,第i层神经元在t时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(t-1)时刻的输出,若是咱们按时间点将RNN展开,将获得如下的结构图:函数

 在不一样的时间点,RNN的输入都与将以前的时间状态有关,tn时刻网络的输出结果是该时刻的输入和全部历史共同做用的结果,这就达到了对时间序列建模的目的。学习

 

【问题】关于RNN的长期依赖(Long-Term Dependencies)问题

 

理论上,RNN可使用先前全部时间点的信息做用到当前的任务上,也就是上面所说的长期依赖,若是RNN能够作到这点,将变得很是有用,例如在自动问答中,能够根据上下文实现更加智能化的问答。然而在现实应用中,会面临着不一样的状况,例如:
(1)有一个语言模型是基于先前的词来预测下一个词。若是如今要预测如下这句话的最后一个单词“白云飘浮在(天空)”,咱们并不须要任何其它上下文,最后一个词很显然就应该是 天空。在这样的场景中,相关的信息和预测的词位置之间的间隔是很是小的。blog

(2)假设咱们要预测“我从小生长在四川……我会讲流利的 (四川话)”最后一个词,根据最后一句话的信息建议最后一个词多是一种语言的名字,可是若是咱们要弄清楚是什么语言,则须要找到离当前位置很远的“四川”那句话的上下文。这说明相关信息和当前预测位置之间的间隔就变得至关大。ci

随着间隔的不断增大,RNN会出现“梯度消失”或“梯度爆炸”的现象,这就是RNN的长期依赖问题。例如咱们经常使用sigmoid做为神经元的激励函数,如对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,到最后梯度指数衰减到底层基本上接受不到有效的信号,这种状况就是“梯度消失”。所以,随着间隔的增大,RNN会丧失学习到链接如此远的信息的能力。get

 

【解决方案】Long Short Term Memory网络(简称LSTM,长短时间记忆网络)

 

LSTM是一种RNN特殊的类型,能够学习长期依赖信息。在不少问题上,LSTM都取得至关巨大的成功,并获得了普遍的应用。it

一个LSTM单元的结构,以下图所示:入门

 

从上图能够看出,中间有一个cell(细胞),这也是LSTM用于判断信息是否有用的“处理器”。同时,cell旁边被放置了三扇门,分别是输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)。一个信息进入LSTM的网络当中,能够根据规则来判断是否有用,只有符合要求的信息才会被留下,不符合的信息则会经过遗忘门被遗忘。
LSTM巧妙地经过“门”的形式,利用开关实现时间上的记忆功能,是解决长期依赖问题的有效技术。在数字电路中,门(gate)是一个二值变量{0,1},0表明关闭状态、不容许任何信息经过;1表明开放状态,容许全部信息经过。而LSTM中的“门”也是相似,但它是一个“软”门,介于(0,1)之间,表示以必定的比例使信息经过。class

RNN按时间展开后的简化图,结构很简单,标准RNN中的重复模块只包含单一的层,例如tanh层,以下图:变量


LSTM有着相似的结构,可是重复的模块拥有一个不一样的结构,LSTM 中的重复模块包含四个交互的层,其中输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)便在这里面,以下图:

LSTM的工做原理,计算公式以下,表示输入是x,通过变换Wx+b和激活函数f获得输出y。下面会屡次出现相似的公式

 

 

下面以一个语言模型的例子来进行介绍,这个模型是根据已经看到的词来预测下一个词,例如:


                              小明刚吃完米饭,如今准备要吃水果,而后拿起了一个()

 

 

(1)遗忘门(Forget Gate)

该门会读取ht-1和xt的信息,经过sigmoid层输出一个介于0 到 1 之间的数值,做为给每一个在细胞状态Ct-1中的数字,0 表示“彻底舍弃”,1 表示“彻底保留”。

结合上面讲到的语言预测模型例子,“小明刚吃完米饭”,这句话主语是“小明”,宾语是“米饭”,下一句话“如今准备要吃水果”,这时宾语已经变成了新的词“水果”,那第三句话要预测的词,就是跟“水果”有关了,跟“米饭”已经没有什么关系,所以,这时即可以利用“遗忘门”将“米饭”遗忘掉。

 

(2)输入门(Input Gate)
下一步是肯定什么样的新信息被存放在细胞状态中。这里包含两部分:
首先是通过“输入门”,这一层是决定咱们将要更新什么值;而后,一个 tanh 层建立一个新的候选值向量,加入到状态中,以下图:


在这个语言预测模型的例子中,咱们但愿将新的代词“水果”增长到细胞状态中,来替代旧的须要忘记的代词“米饭”。

如今来更新旧细胞的状态,由Ct-1更新为Ct。

更新方式为:

(1)把旧状态Ct-1与ft相乘(回顾一下,ft就是遗忘门,输出遗忘程度,即0到1之间的值),丢弃掉须要丢弃的信息(如遗忘门输出0,则相乘后变成0,该信息就被丢弃了);

(2)而后再加上it与候选值相乘(计算公式见上图)。这二者合并后就变成一个新的候选值。

在这个语言预测模型的例子中,这就是根据前面肯定的目标,丢弃旧的代词信息(米饭)并添加新的信息(水果)的地方。

 

(3)输出门(Output Gate)
最后咱们要肯定输出什么值。

首先,经过一个sigmoid层来肯定细胞状态的哪一个部分将要输出出去,接着,把细胞状态经过 tanh 进行处理(获得一个介于-1到1之间的值)并将它和 sigmoid的输出结果相乘,最终将会仅仅输出咱们须要的那部分信息。

在这个语言模型的例子中,由于看到了一个新的代词(水果),可能须要输出与之相关的信息(苹果、梨、香蕉……)。

 

以上就是标准LSTM的原理介绍,LSTM也出现了很多的变体,其中一个很流行的变体是Gated Recurrent Unit (GRU),它将遗忘门和输入门合成了一个单一的更新门,一样还混合了细胞状态和隐藏状态,以及其它一些改动。最终GRU模型比标准的 LSTM 模型更简单一些,以下图所示: