RNN与LSTM的对比分析

一、RNN

1. 为什么需要RNN?

在这之前,我们已经学习了基础的神经网络,它们可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y;但基础的神经网络只在层与层之间建立了权连接,也就是说,他们都只能单独的去处理一个个的输入,前一个输入和后一个输入是完全没有关系的。而在实际应用中某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。RNN最大的不同之处就是在层之间的神经元之间也建立的权连接,相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。

2. RNN的结构

RNN的一般形式如下图所示

RNN的一般形式

其中,x为当前状态下数据的输入,h表示接收到的上一个节点的输入。y为当前节点状态下的输出,h’为传递到下一个节点的输出。其中σ为激活函数,一般来说会选择tanh函数,通常后面还会加一个b作为偏置。

通过上图的公式可以看到,输出 h’ 与 x 和 h 的值都相关。而 y 则常常使用 h’ 投入到一个线性层(主要是进行维度映射)然后使用softmax进行分类得到需要的数据。
这里的y如何通过 h’ 计算得到往往看具体模型的使用方式。

通过序列输入,我们就可以得到以下形式

通过序列输入,RNN的形式

以上是RNN的标准结构,然而在实际中这一种结构并不能解决所有问题,它还有单输入序列输出、序列输入单输出、序列输入序列输出(分等长和不等长)等一系列结构,在此不过多叙述。

3. RNN存在的问题及解决办法

由梯度消失引起的短期记忆问题是RNN的痛点,RNN的特点本来就是能“追根溯源“利用历史数据,但由于梯度消失,RNN不会跨时间步骤学习远程依赖性。关于梯度消失的问题,我们在之前的神经网络中已经学习过,在循环神经网络中,我们可以将其中的每个时间步骤视为一个层。为了训练一个递归神经网络,我们使用一种称为通过时间反向传播的方法,梯度值在每个时间步长传播时将呈指数级收缩。

梯度值将用于在神经网络权重中进行调整,从而允许其学习,小的渐变意味着小的调整,这将导致最前面的层没有优化。而这种梯度消失,就会引起短期记忆问题,下面用一个例子来说明什么是短期记忆和长期记忆

有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。

RNN存在的问题

但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。

不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。

RNN存在的问题

为了解决梯度消失,我们通常可以采用两种办法

  • 选取更好的激活函数(如换成ReLU函数)
  • 改变传播结构(也就是我们下面要介绍的LSTM模型)

二、LSTM

1. 为什么要引出LSTM

如上文所述,长短期记忆(Long short-term memory, LSTM)是对RNN结构的一种改进,主要是为了解决长序列训练过程中的梯度消失问题,让循环神经网络具备更强更好的记忆性能。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

2. LSTM与RNN结构的对比

如下图一是RNN的结构,下图二是LSTM的基本结构

LSTM的基本结构

LSTM的基本结构

可以看到,相比RNN,LSTM整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。接下来,我们就详细分析一下LSTM的结构

3. 详细分析LSTM的结构

LSTM内部主要有三个阶段:忘记阶段、选择记忆阶段和输出阶段。而这三个阶段都是用来增加或减少细胞状态中的信息的,所以,我们首先先来看一下细胞状态。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互,信息在上面流传保持不变会很容易。

详细分析LSTM的结构<br />

  • 忘记阶段

这个阶段主要是对上一个节点传进来的输入进行选择性忘记。决定我们从细胞状态中丢弃什么信息。遗忘门的位置和更新公式如下

详细分析LSTM的结构

其中,ft 是由 ht-1 和 xt 拼接向量乘以权重矩阵之后,再通过一个sigmoid激活函数转换成 0 到 1 之间的数值,来作为一种门控状态。

  • 选择记忆阶段

这个阶段主要是将输入有选择性地进行“记忆”。确定什么样的新信息被存放在细胞状态中。更新门的位置和结构公式如下

更新门的位置和结构公式

然后LSTM 结合遗忘门、更新门、上一层记忆细胞值和记忆细胞候选值来共同决定和更新当前细胞状态:

LSTM 结合遗忘门、更新门、上一层记忆细胞值和记忆细胞候选值来共同决定和更新当前细胞状态

  • 输出阶段

这个阶段将决定哪些将会被当成当前状态的输出。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。LSTM 提供了单独的输出门,其位置和计算公式如下

LSTM 提供了单独的输出门,其位置和计算公式

我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。

4. LSTM实现代码

def LSTMCELL(prev_ct,prev_ht,input):
    combine = prev_ht + input
    ft = forget_layer(combine)
    candidate = candidate_layer(combine)
    it = input_layer(combine)
    ct = prev_ct * ft + candidate * it
    ot = output_layer(combine)
    ht = ot * tanh(ct)
    return ht,ct


ct = [0,0,0]
ht = [0,0,0]
for input in inputs:
   ct,ht = LSTMCELL(ct,ht,input)

1. 首先,我们将先前的隐藏状态和当前的输入连接起来,这里将它称为 combine;

2. 其次将 combine 丢到遗忘层中,用于删除不相关的数据;

3. 再用 combine 创建一个候选层,候选层中包含着可能要添加到细胞状态中的值;

4. combine 同样要丢到输入层中,该层决定了候选层中哪些数据需要添加到新的细胞状态中;

5. 接下来细胞状态再根据遗忘层、候选层、输入层以及先前细胞状态的向量来计算;

6. 再计算当前细胞的输出;

7. 最后将输出与新的细胞状态逐点相乘以得到新的隐藏状态。

版权声明:本文为CSDN博主「weixin_45268911」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45268911/article/details/107468753

最新文章