原文链接:https://zhuanlan.zhihu.com/p/89353177

人类不会每秒都从头开始思考,也不会像鱼一样,只有七秒钟的记忆。在阅读文章的时候,你会通过先前的每一个单词,每一句话,来了解和思考接下去的每一句话。

而在传统的神经网络中就不能解决这个问题,于是就有了循环神经网络

下面是一个典型的循环神经网络:

循环神经网络:从RNN到LSTM(学习笔记01)

这是一个循环神经网络按照时间展开的网络。我们可以看到,每一个时间迭代t时刻,每个神经元都能同时接收到输入向量x(i)和前一个时间迭代是输出量h(t-1)。

RNN可以有以下几种模式:

循环神经网络:从RNN到LSTM(学习笔记01)

一对多:在第一个时间迭代给网络输入一个单词(其他时间迭代都是零),并让他出输一个序列的向量到序列网络。
多对一:提供网络一系列的输入并忽略除了最后一个之外的所有输出的序列到向量的网络。
多对多:同时获得输入序列并产生输出序列的序列到序列网络或者延迟的序列到序列网络。

当然,和其他深层的神经网络一样,RNN也会遇到梯度消失/爆炸问题。一般我们解决此类问题用的是良好的初始化参数,非饱和**的方法,批次归一化,梯度剪切,更快的优化器等。但是最简单的方法还是在有限的时间迭代上展开RNN,这种方法被称之为时间截断反向传播。但是这也会带来诸如模型无法学习长期模式,会忽略掉长时间细粒度中的关键信息等问题。

除了这个问题,我们还会面对第一个输入的记忆逐渐衰退的问题。由于数据经过RNN的时候会经过转换,所以会丢弃掉一些信息,长时间累加起来后,我们就会失去第一个输入的痕迹,这会对训练产生很大的干扰。

比如说:在评价某人之前的第一句话先表明了关系:我是xx的爸爸,我觉得xx如何如何。或者我是xx的远房亲戚的邻居的同学的大姨妈的后院的一条狗,我觉得xx如何如何。在多次迭代后,我们已经失去了第一句话的信息了,但是评价人与xx的关系在评价中具有很大的权重,是至关重要的一个信息,丢失会大大影响训练。

所以就有了LSTM!~!

我们先来看一下RNN的模型结构:

循环神经网络:从RNN到LSTM(学习笔记01)

我们再来看一下LSTM的模型结构:

循环神经网络:从RNN到LSTM(学习笔记01)

我们可以看到,和RNN相比,LRTM多了一个输入,他把状态分为了两个向量。你可以认为h(t)是短期状态(偏下的那个),c(t)是长期状态(偏上的那个)。

现在,让我们关注下盒子里面,其关键思维就是可以学习在长期状态下什么要储存,什么要丢弃,以及从什么中读取。我们可以看到,长期记忆c(t-1)从左至右贯穿网络,首先通过一个忘记门,丢失了一些记忆,再通过输入门增加了一些记忆。同时长期记忆一部分被直接输出,一部分被复制后传入tanh函数,然后被输出限制,于是就有了短期状态。

接下来让我们看看盒子里的其他东西。主层就是tanh层, 它的主要作用就是分析输入x(y)和前一个短期状态h(t-1),并直接输出y(t)和h(t)。在RNN中,基本单元就只有这一个层。相比之下,LSTM就没有直接输出,而是将部分输出放在了长期状态中。

其他还有一些门限:

忘记门限:控制哪些长期状态将要被抛弃。
输入门限:控制哪些部分将要被长期加入到长期状态。
输出门限:控制哪些长期门限将要在这个迭代被读取和输出。

简而言之,LSTM单元可以学习识别重要输入,将其储存到长期状态中,学习需要时保护它,以及学习需要时提取它。这就解释了它为什么能成功捕获到时间序列中的长期模式,长文字,录音等。