RNN学习笔记,我不是知识的创造者,我只是知识的搬运工。

RNN:递归神经网络,带有一个指向自身的环,用来表示它可以传递当前时刻处理的信息给下一时刻使用,如下图所示,一条链状神经网络代表了一个递归神经网络,可以认为它是对相同神经网络的多重复制,每一时刻的神经网络会传递信息给下一时刻。

递归神经网络算法 递归神经网络实际应用_网络层


其中Xt为网络层的输入,A表示模型处理部分,ht为输出,A的细节实现如下图所示:

递归神经网络算法 递归神经网络实际应用_神经网络_02


    所有的递归神经网络都是由重复神经网络模块构成的一条链,可以看到它的处理层非常简单,通常是一个单tanh层,通过当前输入及上一时刻的输出来得到当前输出。与神经网络相比,经过简单地改造,它已经可以利用上一时刻学习到的信息进行当前时刻的学习了。每条线表示一个完整向量,从一个节点的输出到其他节点的输入。粉红色圆圈代表逐点操作,比如向量加法,而黄色框框表示的是已学习的神经网络层。线条合并表示串联,线条分叉表示内容复制并输入到不同地方。

    递归神经网络因为具有一定的记忆功能,这种网络与序列和列表密切相关,可以被用来解决很多问题,例如:语音识别、语言模型、机器翻译等。但是它并不能很好地处理长时依赖问题。

长时依赖问题是当预测点与依赖的相关信息距离比较远的时候,就难以学到该相关信息。例如在句子”我出生在法国,……,我会说法语“中,若要预测末尾”法语“,我们需要用到上下文”法国“。理论上,递归神经网络是可以处理这样的问题的,但是实际上,常规的递归神经网络并不能很好地解决长时依赖,于是LSTMs的使用很好地解决这个问题。

LSTMs: Long Short Term Mermory network是一种特殊的RNNs,能够学习长期依赖关系。它们由Hochreiter和Schmidhuber (1997)提出,在后期工作中又由许多人进行了调整和普及,LSTM结构与RNN相似,处理模块A更为复杂,如下图所示:

递归神经网络算法 递归神经网络实际应用_神经网络_03


     LSTMs的关键点是单元状态,就是穿过图中的水平线。单元状态有点像是个传送带。它贯穿整个链条,只有一些小的线性相互作用。

递归神经网络算法 递归神经网络实际应用_网络层_04

这很容易让信息以不变的方式向下流动, 但LSTM有能力向单元状态中移除或添加信息,通过结构来仔细管理,这种结构称为门限。门限是有选择地让信息通过。它们由一个sigmoid神经网络层和逐点乘法运算组成。


递归神经网络算法 递归神经网络实际应用_递归神经网络算法_05



sigmoid层输出0到1之间的数字,描述了每个成分应该通过门限的程度。0表示“不让任何成分通过”,而1表示“让所有成分通过!”。LSTM有三种这样的门限,来保护和控制单元状态。


细节解析:


1、决定哪些信息需要从单元状态中抛弃。这项决策是由一个称为“遗忘门限层”的sigmoid层决定的。它根据上一时刻的输出和当前输入来为单元状态中的每个数字计算一个0到1之间的数字。1表示“完全保留”,而0则表示“完全抛弃”。


递归神经网络算法 递归神经网络实际应用_递归_06


2、决定在单元状态中需要存储哪些新信息。这分为两个部分。首先,一个叫做“输入门限层”的sigmoid层决定哪些值需要更新。接下来,一个tanh层创建一个向量,包含新候选值,这些值可以添加到这个状态中。下一步我们将会结合这两者来创建一个状态更新。


递归神经网络算法 递归神经网络实际应用_递归神经网络算法_07


3、更新旧单元状态了,输入到新单元状态。之前的步骤已经决定了需要做哪些事情,我们只需要实现这些事情就行了。我们在旧状态上乘以ft,忘记之前决定需要忘记的。然后我们加上,这就是新的候选值,它的规模取决于我们决定每个状态值需要更新多少。


递归神经网络算法 递归神经网络实际应用_递归神经网络算法_08


4、决定需要输出什么。这个输出将会建立在单元状态的基础上,但是个过滤版本。首先,我们运行一个sigmoid层来决定单元状态中哪些部分需要输出。然后我们将单元状态输入到tanh函数(将值转换成-1到1之间)中,然后乘以输出的sigmoid门限值,所以我们只输出了我们想要输出的那部分。


递归神经网络算法 递归神经网络实际应用_神经网络_09


参考: http://colah.github.io/posts/2015-08-Understanding-LSTMs/