原文:https://www.jianshu.com/p/95d5c461924c 感谢作者
循环神经网络(Recurrent Neural Networks)
人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。在理解当前文字的时候,你并不会忘记之前看过的文字,从头思考当前文字的含义。
传统的神经网络并不能做到这一点,这是在对这种序列信息(如语音)进行预测时的一个缺点。比如你想对电影中的每个片段去做事件分类,传统的神经网络是很难通过利用前面的事件信息来对后面事件进行分类。
而循环神经网络(下面简称RNNs)可以通过不停的将信息循环操作,保证信息持续存在,从而解决上述问题。RNNs如下图所示
![](https://img2018.cnblogs.com/common/1117808/202002/1117808-20200217114647934-565085070.png)
可以看出A是一组神经网络(可以理解为一个网络的自循环),它的工作是不停的接收
并且输出
。从图中可以看出A允许将信息不停的在内部循环,这样使得它可以保证每一步的计算都保存以前的信息(不能狗熊掰棒子!也叫 不忘初心!)。
这样讲可能还是有点晕,更好的理解方式,也是很多文章的做法,将RNNs的自循环结构展开,像是将同一个网络复制并连成一条线的结构,将自身提取的信息传递给下一个继承者,如下图所示。
![](https://img2018.cnblogs.com/common/1117808/202002/1117808-20200217115050330-1839394918.png)
这种
链式的结构揭示了RNNs与
序列和列表类型的数据密切相关。好像他们
生来就是为了处理序列类型数据的。
例如:RNNs在语音识别、文字建模、翻译、字幕等领域的应用。很多成功的案例都有一个共性,就是都用了一种叫LSTMs的特殊的RNNs网络结构。下面就来看看什么是LSTMs。
普通的RNN对于处理短的序列数据还行,当数据很长时,就会出现梯度消失和梯度爆炸的问题。所以又提出了改进版RNN,LSTM。
长依赖存在的问题
从之前的描述可以看出来,RNNs理论上是可以将以前的信息与当前的任务进行连接,例如使用以前的视频帧来帮助网络理解当前帧。如果RNNs能做到这一点,那将会是非常的有用。但是他们能做到这点吗?答案是不一定。
例如:如果我们需要预测“the clouds are in the sky”这句话的最后一个词sky,我们不需要其他的信息,通过前面的语境就能知道最后一个词应该是sky。
在这种情况下,相关信息与需要该信息的位置距离较近!
但是 再例如:有个更为复杂的任务,考虑到下面这句话“I grew up in France… I speak fluent French.”,现在需要语言模型通过现有以前的文字信息预测该句话的最后一个字。通过以前文字语境可以预测出最后一个字是某种语言,但是要猜测出French,要根据之前的France语境。这样的任务,不同之前,因为这次的有用信息与需要进行处理信息的地方之间的距离较远,这样容易导致RNNs不能学习到有用的信息,最终推导的任务可能失败。
LSTM 网络
Long Short Term Memory networks(以下简称LSTMs),一种
特殊的RNN网络,该网络设计出来是为了
解决长依赖问题。该网络由
Hochreiter & Schmidhuber (1997)引入,并有许多人对其进行了改进和普及。他们的工作被用来解决了各种各样的问题,直到目前还被广泛应用。
所有循环神经网络都具有神经网络的重复模块链的形式。 在标准的RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。标准的RNN网络如下图所示
LSTMs也具有这种链式结构,但是它的重复单元不同于标准RNN网络里的单元只有一个网络层,它的内部有四个网络层。LSTMs的结构如下图所示。
![](https://img2018.cnblogs.com/common/1117808/202002/1117808-20200217121716249-1297806964.png)
在解释LSTMs的详细结构时先定义一下图中各个符号的含义,符号包括下面几种
图中黄色类似于CNN里的激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,箭头合并表示向量的合并(concat)操作,箭头分叉表示向量的拷贝操作。
LSTM多了一个表示cell记忆的值。也就是我们不仅要更新当前cell的输出,我们还要思考,哪些东西可以记在我们的cell里呢,记忆的话,记多少又如何确定呢?既然有了记忆,那么我们的输入不仅仅有上一时刻的输出,此刻的输入,还有cell本身存储的那部分信息。所以LSTM的构造看起来很复杂,其实是围绕着记忆做操作的。
LSTMs的核心思想
LSTMs的核心是细胞状态,用贯穿细胞的水平线表示。下图的C就表示记忆
细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNNs。细胞状态如下图所示
LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。
为了实现我们引入的记忆的思想,构造了三个门,忘记门,输入门,输出门。
忘记门能够有选择性的决定让哪些信息通过。其实门的结构很简单,就是一个sigmoid层和一个点乘操作的组合。如下图所示
因为sigmoid层的输出是0-1的值,这代表有多少信息能够流过sigmoid层。0表示都不能通过,1表示都能通过。
一个LSTM里面包含三个门来控制细胞状态。
一步一步理解LSTM
前面提到LSTM由三个门来控制细胞状态,这三个门分别称为忘记门、输入门和输出门。
下面一个一个的来讲述:
第一步:LSTM的
第一步就是决定细胞状态需要
丢弃哪些信息。这部分操作是通过一个称为
忘记门的
sigmoid单元来处理的。它通过查看
![h_{t-1}](https://math.jianshu.com/math?formula=h_%7Bt-1%7D)
和
![x_{t}](https://math.jianshu.com/math?formula=x_%7Bt%7D)
信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态
![C_{t-1}](https://math.jianshu.com/math?formula=C_%7Bt-1%7D)
中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。忘记门如下图所示。
第二步:下一步是
决定给细胞状态
添加哪些新的信息。这一步又分为两个步骤,首先,利用
![h_{t-1}](https://math.jianshu.com/math?formula=h_%7Bt-1%7D)
和
![x_{t}](https://math.jianshu.com/math?formula=x_%7Bt%7D)
通过一个称为输入门的操作来决定更新哪些信息。然后利用
![h_{t-1}](https://math.jianshu.com/math?formula=h_%7Bt-1%7D)
和
![x_{t}](https://math.jianshu.com/math?formula=x_%7Bt%7D)
通过一个tanh层得到新的候选细胞信息
![\tilde C_{t}](https://math.jianshu.com/math?formula=%5Ctilde%20C_%7Bt%7D)
,这些信息可能会被更新到细胞信息中。这两步描述如下图所示。
第三步:下面将更新旧的细胞信息
,变为新的细胞信息
。更新的规则就是通过忘记门选择忘记旧细胞信息的一部分,通过输入门选择添加候选细胞信息
的一部分得到新的细胞信息
。更新操作如下图所示
第四步:更新完细胞状态后需要根据输入的
![h_{t-1}](https://math.jianshu.com/math?formula=h_%7Bt-1%7D)
和
![x_{t}](https://math.jianshu.com/math?formula=x_%7Bt%7D)
来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个-1~1之间值的向量,该向量与输出门得到的判断条件
相乘就得到了最终该RNN单元的输出。该步骤如下图所示
![](https://img2018.cnblogs.com/common/1117808/202002/1117808-20200217131058623-361362770.png)