参考文章
Understanding LSTM Networks
译文

什么是循环神经网络

神经网络简单介绍(Recurrent Neural Network)
神经网络可以当作是可以你和任意函数的黑盒子,只要数据量够多,给定特定的x,就能得到期望的y:

理解循环神经网络(RNN)
image.png

神经网络介绍
尽管神经网络的模型已经能拟合任意的函数了,但是在都是只能处理一个一个的输入,t个输入和t+1,t-1个输入是没有关系的。因此在面对与序列性质的问题,比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。这时候就需要深度学习领域中的循环神经网络

举个例子,假设有一个句子的输入是"今天的集美大道很",分词后可以得到三个输入“今天”,“天空”,“很”,三个词语。对应下图RNN网络结构,为xi-1,xi,xi+1,那么预测值yi+1是“堵”的概率比较大,因此“堵”的概率比较大,所以预测得到下个词yi+1是“堵”

循环神经网络结构

基本循环神经网络

理解循环神经网络(RNN)
基本循环神经网络

去掉那个W的圈,这就是一个全链接神经网络,这个W圈,也可以理解为递归的一个过程,x是输入层的向量(这里面没有画出来表示神经元节点的圆圈);s隐藏层的向量值(这里隐藏层面画了一个节点,这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵。V是隐藏层到输出层的权重矩阵。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重。
把上图的基本神经网络展开可以得到下图

理解循环神经网络(RNN)
RNN网络结构

理解循环神经网络(RNN)
标准RNN重复模组式结构中的tanh**层

LSTM

RNN能够一定程度上解决序列问题,但是在遇到长时依赖问题,循环神经网络就没有那么有效了,例如:“我住在厦门,我是闽南人”,那么使用循环神经网络,能够非常好的利用'厦门'来预测‘闽南人’。如果将上半句话防止文章开头,下半句放在结尾,那么因为信息和预测位置跨度太大网络没办法有那么好的长时间的信息了,可能有人相到多党网络中(如上图RNN网络结构)的i数量不就好了,这样理论上是可以计算出来,但是这种面临这问题存储和计算力的问题,这在复杂度中是指数增长的。
标准RNN计算公式
每个节点的计算公式

理解循环神经网络(RNN)
标准RNN计算公式

lstm
lstm是long short term memory networks的缩写,能够在一定程度上解决长时问题。起网络结构与RNN一样,但是在内部结构上比RNN要复杂些。LSTM结构如下图:

理解循环神经网络(RNN)
LSTM中的重复模块包含四个交互层

先了解一下符号的意义

理解循环神经网络(RNN)
各个符号代表意义

在上图中,每一行都携带一个整个向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如矢量加法,而黄色框表示神经网络层。行合并表示连接,而行分叉表示其内容被复制,副本将转移到不同的位置。

LSTM背后的核心理念

LSTMs的关键是cell状态,水平线贯穿图的顶部。
  cell状态有点像是传送带,在整个链中从头流到尾,只有很少线性操作插入进来。对信息而言,可以很容易地通过它无损地流通。 
LSTM记忆元的强大之处在于它能选择性删除或保留状态信息,这个过程是由一个叫“门(gate)”的结构来仔细控制的。

门可以有选择性地让信息通过,最后的结果是由
**函数神经层紧接着逐点乘积运算两步构成的。

理解循环神经网络(RNN)
image.png

[图片上传失败...(image-4df7d3-1560148499327)]
**函数输出值在0到1之间,描述了信息能够通过的比例。0代表没有信息通过,1代表信息完整地通过。一个LSTM记忆元有三(3)个这种门,目的是为了保护和控制记忆元的状态

一步一步了解LSTM记忆元

LSTM记忆元的第一步是要决定从现有记忆元状态中扔掉什么信息,这一决定是由以sigmoid**函数层组成的”忘记门“(forget gate)来作出的,它的输入是ht-1和xt,输出是与记忆元状态向量ct-1同纬度的向量,向量中的每一个数字都介于0到1之间,再重复一下,1代表保留所有信息,0代表完全清楚/忘却信息。例如

理解循环神经网络(RNN)
image.png

就举个之前语言模型的例子,我们的任务是基于之前的词语预测下一个词语。在这样的问题中,记忆元状态可能包含当前主语的性别[译者注:比如在德语中,每个名词都是有性别的,分为阴性feminine、阳性masculine、中性neuter],为的是在后文中能正确使用代词[译者注:比如在德语中,指代主格,阴性为die、阳性为der、中性为das]。当我们看到一个新的主语时,我们就可以忘掉之前那个主语的性别(gender)信息了。

理解循环神经网络(RNN)
image.png

下一步是决定哪些新信息要被存储到cell状态中。分两部分,第一,由sigmoid组成“input gate”决定哪些维度将要被更新;第二,由tanh生成心得可以被加入到cell状态中的候选值向量Ct~。然后,将这两个向量合并生成对cell状态更新的向量。
  在语言模型预测的那个例子中,我们将增加新主题的性别信息到cell状态中,以替换掉旧的性别信息(被忘掉的那个)。

理解循环神经网络(RNN)
image.png

  现在,将旧的cell状态Ct−1更细为Ct,上面几步已经给出了要做的事情。
  首先,将旧cell状态乘以ft,忘掉我们决定要遗忘掉的内容;然后,叠加it∗Ct~,那是我们决定要追加的更新内容。
在语言预测模型的例子中,上述动作对应实际要丢弃的关于旧主题的性别信息,并增加新的信息。

理解循环神经网络(RNN)
image.png

  最后,我们需要决定输出什么,这个输出基于cell状态的,但是个过滤后的版本。先用sigmoid(“output gate”)决定cell状态的哪些部分是将要输出的,以及对应的输出比例;再用tanh将cell状态投射到[-1,1]之间;再将两者乘积得到我们想要输出的结果。
  对语言预测例子而言,当LSTM刚看到一个主题,它想输出动词相关的信息时,比如,它可能输出单数/复数形式的主题,所以需要知道什么类型的动词的格式应该被对应地加入后续要发生的动作中。

理解循环神经网络(RNN)
image.png