文章目录

  • 概述
  • 一、从RNN到LSTM
  • 二、LSTM模型结构剖析
  • 2.1 LSTM之遗忘门
  • 2.2 LSTM之输入门
  • 2.3 LSTM之细胞状态更新
  • 2.4 LSTM之输出门
  • 三、 LSTM前向传播算法
  • 四、 LSTM反向传播算法
  • 五、LSTM总结
  • 六、项目实战



概述

在循环神经网络RNN详细推导中,已经说明了RNN并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。所以,有学者就提出了LSTM来解决梯度消失的问题。

一、从RNN到LSTM

原始RNN的隐藏层只有一个状态,即时间embedding模型_时间embedding模型,它对于短期的输入非常敏感。所以,就假设再增加一个状态时间embedding模型_长短时间记忆模型_02,让它来保存长期的状态,如下图所示:

时间embedding模型_循环神经网络_03


新增加的状态c,称为单元状态(cell state)。把上图按照时间维度展开:

时间embedding模型_长短时间记忆模型_04


上图仅仅是一个示意图,可以看出,在时间embedding模型_LSTM_05时刻,LSTM的输入有三个:当前时刻网络的输入值时间embedding模型_激活函数_06、上一时刻LSTM的输出值、以及上一时刻的单元状态;LSTM的输出有两个:当前时刻LSTM输出值、和当前时刻的单元状态。需要注意的是,他们都是向量。LSTM的关键,就是怎样控制长期状态时间embedding模型_长短时间记忆模型_02。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:

时间embedding模型_循环神经网络_08

二、LSTM模型结构剖析

LSTM的结构如下:

时间embedding模型_激活函数_09


下边,就来看一下具体的每个门吧:

2.1 LSTM之遗忘门

遗忘门(forget gate),在LSTM中是以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:

 

时间embedding模型_时间embedding模型_10


 图中输入的有上时刻的隐藏状态时间embedding模型_循环神经网络_11和本序列数据时间embedding模型_循环神经网络_12,通过一个激活函数,一般是sigmoid,得到遗忘门的输出时间embedding模型_时间embedding模型_13。由于sigmoid的输出时间embedding模型_时间embedding模型_13在[0,1]之间,因此这里的输出时间embedding模型_时间embedding模型_13代表了遗忘上一层隐藏细胞状态的概率。用数学表达式即为:

 时间embedding模型_长短时间记忆模型_16

 其中时间embedding模型_LSTM_17为线性关系的系数和偏倚,和RNN中的类似。时间embedding模型_循环神经网络_18为sigmoid激活函数。

2.2 LSTM之输入门

输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:

时间embedding模型_LSTM_19


从图中可以看到输入门由两部分组成,第一部分使用了sigmoid激活函数,输出为时间embedding模型_循环神经网络_20,第二部分使用了时间embedding模型_LSTM_21激活函数,输出为时间embedding模型_LSTM_22, 两者的结果后面会相乘再去更新细胞状态。用数学表达式即为:

时间embedding模型_循环神经网络_23

时间embedding模型_激活函数_24

其中时间embedding模型_LSTM_25,为线性关系的系数和偏置,和RNN中的类似。时间embedding模型_循环神经网络_18为sigmoid激活函数。

2.3 LSTM之细胞状态更新

在研究LSTM输出门之前,我们要先看看LSTM之细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态时间embedding模型_时间embedding模型_27。我们来看看从细胞状态时间embedding模型_时间embedding模型_28如何得到时间embedding模型_时间embedding模型_27。如下图所示:

时间embedding模型_时间embedding模型_30


细胞状态时间embedding模型_时间embedding模型_27由两部分组成,第一部分是时间embedding模型_时间embedding模型_28和遗忘门输出时间embedding模型_时间embedding模型_13的乘积,第二部分是输入门的时间embedding模型_激活函数_34时间embedding模型_时间embedding模型_35的乘积,即:

时间embedding模型_激活函数_36

其中,⊙为Hadamard积,即:向量元素对应相乘。

2.4 LSTM之输出门

有了新的隐藏细胞状态时间embedding模型_时间embedding模型_27,我们就可以来看输出门了,子结构如下:

时间embedding模型_时间embedding模型_38


从图中可以看出,隐藏状态时间embedding模型_激活函数_39的更新由两部分组成,第一部分是时间embedding模型_时间embedding模型_40, 它由上一序列的隐藏状态时间embedding模型_循环神经网络_11和本序列数据时间embedding模型_循环神经网络_12,以及激活函数sigmoid得到,第二部分由隐藏状态时间embedding模型_时间embedding模型_27时间embedding模型_LSTM_21激活函数组成, 即:

时间embedding模型_长短时间记忆模型_45

时间embedding模型_LSTM_46

到这里,已经弄个清楚了LSTM的输入们、遗忘门、细胞更新和输出门了。接下来,就来推导一下LSTM的前向传播。

三、 LSTM前向传播算法

现在我们来总结下LSTM前向传播算法。LSTM模型有两个隐藏状态时间embedding模型_激活函数_39,时间embedding模型_时间embedding模型_27,模型参数几乎是RNN的4倍,因为现在多了时间embedding模型_LSTM_49,时间embedding模型_LSTM_50,时间embedding模型_激活函数_51,时间embedding模型_长短时间记忆模型_52,时间embedding模型_长短时间记忆模型_53,时间embedding模型_LSTM_54,时间embedding模型_循环神经网络_55,时间embedding模型_激活函数_56,时间embedding模型_循环神经网络_57,时间embedding模型_循环神经网络_58,时间embedding模型_长短时间记忆模型_59,时间embedding模型_时间embedding模型_60这些参数。

前向传播过程在每个时刻的过程为:

1)更新遗忘门输出:
时间embedding模型_时间embedding模型_61

2)更新输入门两部分输出:
时间embedding模型_循环神经网络_23

时间embedding模型_激活函数_24

3)更新细胞状态:
时间embedding模型_激活函数_36

4)更新输出门输出:
时间embedding模型_长短时间记忆模型_45

时间embedding模型_LSTM_46

5)更新当前时刻预测输出:
时间embedding模型_循环神经网络_67

四、 LSTM反向传播算法

有了LSTM前向传播算法,接下来推导反向传播算法, 思路和RNN的反向传播算法思路一致,也是通过梯度下降法迭代更新所有的参数,关键点在于计算所有参数基于损失函数的偏导数。

在RNN中,为了反向传播误差,我们通过隐藏状态时间embedding模型_激活函数_68的梯度时间embedding模型_长短时间记忆模型_69一步步向前传播。在LSTM这里也类似。只不过我们这里有两个隐藏状态时间embedding模型_激活函数_39时间embedding模型_时间embedding模型_27。这里我们定义两个时间embedding模型_长短时间记忆模型_72,即:

时间embedding模型_激活函数_73

时间embedding模型_循环神经网络_74

为了便于推导,我们将损失函数时间embedding模型_LSTM_75分成两块,一块是时刻t的损失时间embedding模型_激活函数_76,另一块是时刻t之后损失时间embedding模型_LSTM_77,即:
时间embedding模型_LSTM_78

而在最后的时刻时间embedding模型_LSTM_79时间embedding模型_长短时间记忆模型_80时间embedding模型_LSTM_81为:
时间embedding模型_LSTM_82

时间embedding模型_LSTM_83

接着我们由时间embedding模型_循环神经网络_84,时间embedding模型_长短时间记忆模型_85反向推导时间embedding模型_激活函数_86,时间embedding模型_激活函数_87

时间embedding模型_激活函数_86的梯度由本层t时刻的输出梯度误差和大于t时刻的误差两部分决定,即:
时间embedding模型_长短时间记忆模型_89

整个LSTM反向传播的难点就在于时间embedding模型_LSTM_90这部分的计算。仔细观察,由于时间embedding模型_激活函数_91, 在第一项时间embedding模型_时间embedding模型_40中,包含一个时间embedding模型_时间embedding模型的递推关系,第二项时间embedding模型_时间embedding模型_94就复杂了,时间embedding模型_LSTM_21函数里面又可以表示成:
时间embedding模型_激活函数_36

时间embedding模型_LSTM_21 函数的第一项中,时间embedding模型_时间embedding模型_13包含一个时间embedding模型_时间embedding模型的递推关系,在时间embedding模型_LSTM_21函数的第二项中,时间embedding模型_时间embedding模型_101时间embedding模型_激活函数_102都包含时间embedding模型_时间embedding模型的递推关系,因此,最终时间embedding模型_时间embedding模型_104这部分的计算结果由四部分组成。即:

时间embedding模型_长短时间记忆模型_105

时间embedding模型_激活函数_106

时间embedding模型_激活函数_87的反向梯度误差由前一层时间embedding模型_循环神经网络_84的梯度误差和本层的从时间embedding模型_激活函数_39传回来的梯度误差两部分组成,即:

时间embedding模型_激活函数_110

有了时间embedding模型_激活函数_86时间embedding模型_激活函数_87, 计算这一大堆参数的梯度就很容易了,这里只给出时间embedding模型_LSTM_49的梯度计算过程,其他的时间embedding模型_LSTM_50,时间embedding模型_激活函数_51,时间embedding模型_长短时间记忆模型_52,时间embedding模型_长短时间记忆模型_53,时间embedding模型_LSTM_54,时间embedding模型_循环神经网络_55,时间embedding模型_激活函数_56,时间embedding模型_循环神经网络_57,时间embedding模型_循环神经网络_58,时间embedding模型_长短时间记忆模型_59,时间embedding模型_时间embedding模型_60时间embedding模型_LSTM_125,时间embedding模型_长短时间记忆模型_02的梯度大家只要照搬就可以了。
 
时间embedding模型_循环神经网络_127

五、LSTM总结

LSTM虽然结构复杂,但是只要理顺了里面的各个部分和之间的关系,进而理解前向反向传播算法是不难的。当然实际应用中LSTM的难点不在前向反向传播算法,这些有算法库帮你搞定,模型结构和一大堆参数的调参才是让人头痛的问题。后边,会继续更新有关于用tensorflow实现LSTM的文章!

六、项目实战

项目实战请转至:tensorflow学习笔记(八):LSTM手写体(MNIST)识别。