上一节介绍了循环神经网络RNN和它的几种变体结构,本节将介绍RNN的改进版,长短期记忆网络(long short term memory, LSTM)
(本节主要参考 《21个项目玩转深度学习》)。
LSTM的第一印象,与经典 RNN 的对比
仔细观察 RNN 网络的隐状态的计算方法: ,它是一个逐层迭代的公式,每一层的隐状态都是由前一层的结果变换而来,在训练时,反向传播的每一层的每一步梯度都会连乘。层数比较多时,若梯度小于 1,则经过多次连乘会导致梯度消失,若梯度大于 1,又会导致梯度爆炸。所以经典的循环神经网络RNN 很难学到序列中蕴含的间隔时间较长的规律。
虽然从外部来看,长短期记忆网络LSTM 和 RNN 的结构是相同的,都是每一步接受外部输入和前一阶段的隐状态,并输出一个值。但是 LSTM 与 RNN 相比,内部多了一个隐状态,并且在计算时以加法代替了 RNN 的迭代变换,这在一定程度上避免了梯度消失或者梯度爆炸的问题,网络更能学到长期的规律。
LSTM的网络结构
还是与 RNN 对比,RNN 的网络结构也可以如下图一样给出:
h(t)的状态根据 t-1 时刻的输入 x(t-1) 和 h(t-1) 计算,激活函数使用 tanh 函数。而 LSTM 的一个单元的结构要稍微复杂一点,如下图
可以看出,与 RNN 不同,每个单元有两个隐状态输入和两路隐状态输出,这里记作h
和c
。上面c(t-1)
直接到c(t)
的直线,可以看做 LSTM 的信息传递的“高速公路”。通过加法,隐状态c
可以无障碍的在这条高速公路上传递,因此较远的梯度也可以长距离传播,这是LSTM的核心思想
。
不过,从 c(t-1)
到c(t)
,并不是全部照搬,而是在c(t-1)
的基础上“遗忘”一些信息,以及“记住”一些新信息。
1. LSTM 的“遗忘”
下图红框中即为 LSTM 单元中的“遗忘门”,负责忘掉部分信息。框中的 s
是 sigmoid 函数(可参考第八节),如此一来,遗忘门会将接近 0 的内容忘记,保留接近 1 的内容。
2. LSTM 的“记忆”
只遗忘信息肯定是不行的,LSTM需要记住一些新东西,下图红框中是 LSTM 单元中的“记忆门”。
LSTM 的记忆和遗忘的输入都是上一阶段的输入和隐状态h
。所以
3. LSTM 的输出
这里说的输出,其实是去计算另一个隐状态的 h(t) 的值,真正的输出(如类别)需要根据 h(t) 做进一步的运算得到。
总结一下,LSTM 每一步的输入是 x(t),隐状态是 h(t) 和 c(t),最终输出是根据 h(t) 进一步计算得到的(可参考上一节)。
在大多数情况下,RNN 和 LSTM 都是可以相互替换的,因此在很多论文及文档中都会看到RNN(LSTM)
的写法,意思是二者可以互换。