文章目录
- 概述
- 一、从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的隐藏层只有一个状态,即,它对于短期的输入非常敏感。所以,就假设再增加一个状态,让它来保存长期的状态,如下图所示:
新增加的状态c,称为单元状态(cell state)。把上图按照时间维度展开:
上图仅仅是一个示意图,可以看出,在时刻,LSTM的输入有三个:当前时刻网络的输入值、上一时刻LSTM的输出值、以及上一时刻的单元状态;LSTM的输出有两个:当前时刻LSTM输出值、和当前时刻的单元状态。需要注意的是,他们都是向量。LSTM的关键,就是怎样控制长期状态。在这里,LSTM的思路是使用三个控制开关。第一个开关,负责控制继续保存长期状态c;第二个开关,负责控制把即时状态输入到长期状态c;第三个开关,负责控制是否把长期状态c作为当前的LSTM的输出。三个开关的作用如下图所示:
二、LSTM模型结构剖析
LSTM的结构如下:
下边,就来看一下具体的每个门吧:
2.1 LSTM之遗忘门
遗忘门(forget gate),在LSTM中是以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:
图中输入的有上时刻的隐藏状态和本序列数据,通过一个激活函数,一般是sigmoid,得到遗忘门的输出。由于sigmoid的输出在[0,1]之间,因此这里的输出代表了遗忘上一层隐藏细胞状态的概率。用数学表达式即为:
其中为线性关系的系数和偏倚,和RNN中的类似。为sigmoid激活函数。
2.2 LSTM之输入门
输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:
从图中可以看到输入门由两部分组成,第一部分使用了sigmoid激活函数,输出为,第二部分使用了激活函数,输出为, 两者的结果后面会相乘再去更新细胞状态。用数学表达式即为:
其中,为线性关系的系数和偏置,和RNN中的类似。为sigmoid激活函数。
2.3 LSTM之细胞状态更新
在研究LSTM输出门之前,我们要先看看LSTM之细胞状态。前面的遗忘门和输入门的结果都会作用于细胞状态。我们来看看从细胞状态如何得到。如下图所示:
细胞状态由两部分组成,第一部分是和遗忘门输出的乘积,第二部分是输入门的和的乘积,即:
其中,⊙为Hadamard积,即:向量元素对应相乘。
2.4 LSTM之输出门
有了新的隐藏细胞状态,我们就可以来看输出门了,子结构如下:
从图中可以看出,隐藏状态的更新由两部分组成,第一部分是, 它由上一序列的隐藏状态和本序列数据,以及激活函数sigmoid得到,第二部分由隐藏状态和激活函数组成, 即:
到这里,已经弄个清楚了LSTM的输入们、遗忘门、细胞更新和输出门了。接下来,就来推导一下LSTM的前向传播。
三、 LSTM前向传播算法
现在我们来总结下LSTM前向传播算法。LSTM模型有两个隐藏状态,,模型参数几乎是RNN的4倍,因为现在多了,,,,,,,,,,,这些参数。
前向传播过程在每个时刻的过程为:
1)更新遗忘门输出:
2)更新输入门两部分输出:
3)更新细胞状态:
4)更新输出门输出:
5)更新当前时刻预测输出:
四、 LSTM反向传播算法
有了LSTM前向传播算法,接下来推导反向传播算法, 思路和RNN的反向传播算法思路一致,也是通过梯度下降法迭代更新所有的参数,关键点在于计算所有参数基于损失函数的偏导数。
在RNN中,为了反向传播误差,我们通过隐藏状态的梯度一步步向前传播。在LSTM这里也类似。只不过我们这里有两个隐藏状态和。这里我们定义两个,即:
为了便于推导,我们将损失函数分成两块,一块是时刻t的损失,另一块是时刻t之后损失,即:
而在最后的时刻的和为:
接着我们由,反向推导,。
的梯度由本层t时刻的输出梯度误差和大于t时刻的误差两部分决定,即:
整个LSTM反向传播的难点就在于这部分的计算。仔细观察,由于, 在第一项中,包含一个的递推关系,第二项就复杂了,函数里面又可以表示成:
函数的第一项中,包含一个的递推关系,在函数的第二项中,和都包含的递推关系,因此,最终这部分的计算结果由四部分组成。即:
而的反向梯度误差由前一层的梯度误差和本层的从传回来的梯度误差两部分组成,即:
有了和, 计算这一大堆参数的梯度就很容易了,这里只给出的梯度计算过程,其他的,,,,,,,,,,,,的梯度大家只要照搬就可以了。
五、LSTM总结
LSTM虽然结构复杂,但是只要理顺了里面的各个部分和之间的关系,进而理解前向反向传播算法是不难的。当然实际应用中LSTM的难点不在前向反向传播算法,这些有算法库帮你搞定,模型结构和一大堆参数的调参才是让人头痛的问题。后边,会继续更新有关于用tensorflow实现LSTM的文章!
六、项目实战
项目实战请转至:tensorflow学习笔记(八):LSTM手写体(MNIST)识别。