1️⃣ LSTM介绍
标准的RNN存在梯度消失
和梯度爆炸
问题,无法捕捉长期依赖关系。那么如何理解这个长期依赖关系呢?
例如,有一个语言模型基于先前的词来预测下一个词,我们有一句话 “the clouds are in the sky”,基于"the clouds are in the",预测"sky",在这样的场景中,预测的词和提供的信息之间位置间隔是非常小的,如下图所示,RNN可以捕捉到先前的信息。
然而,针对复杂场景,我们有一句话"I grew up in France… I speak fluent French","French"基于"France"推断,但是它们之间的间隔很远很远,RNN 会丧失学习到连接如此远信息的能力。这就是长期依赖关系。
为了解决该问题,LSTM通过引入三种门遗忘门
,输入门
,输出门
控制信息的流入和流出,有助于保留长期依赖关系,并缓解梯度消失【注意:没有梯度爆炸昂】。LSTM在1997年
被提出
2️⃣ 原理
下面这张图是标准的RNN结构:
- x t x_t xt是t时刻的输入
- s t s_t st是t时刻的隐层输出, s t = f ( U ⋅ x t + W ⋅ s t − 1 ) s_t=f(U\cdot x_t+W\cdot s_{t-1}) st=f(U⋅xt+W⋅st−1),f表示激活函数, s t − 1 s_{t-1} st−1表示t-1时刻的隐层输出
- h t h_t ht是t时刻的输出, h t = s o f t m a x ( V ⋅ s t ) h_t=softmax(V\cdot s_t) ht=softmax(V⋅st)
LSTM的整体结构如下图所示,第一眼看到,反正我是看不懂。前面讲到LSTM引入三种门遗忘门
,输入门
,输出门
,现在我们逐一击破,一个个分析一下它们到底是什么。
这是3D视角的LSTM:
首先来看遗忘门
,也就是下面这张图:
遗忘门输入包含两部分
- s t − 1 s_{t-1} st−1:表示t-1时刻的短期记忆(即隐层输出),在LSTM中当前时间步的输出 h t − 1 h_{t-1} ht−1就是隐层输出 s t − 1 s_{t-1} st−1
- x t x_t xt:表示t时刻的输入
遗忘门输出为 f t f_t ft,公式表示为:
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t=\sigma\left(W_f\cdot[h_{t-1},x_t] + b_f\right) ft=σ(Wf⋅[ht−1,xt]+bf)
其中, W f W_f Wf和 b f b_f bf是遗忘门的参数, [ s t − 1 , x t ] [s_{t-1},x_t] [st−1,xt]表示concat操作。 σ ( ) \sigma() σ()表示sigmoid函数。
遗忘门定我们会从长期记忆中丢弃什么信息【理解为:删除什么日记】,输出一个在 0 到 1 之间的数值,1 表示“完全保留”,0 表示“完全舍弃”。
然后来看输入门
:
输入门的输入包含两部分:
- s t − 1 s_{t-1} st−1:表示t-1时刻的短期记忆
- x t x_t xt:表示t时刻的输入
输入门的输出为新添加的内容 i t ∗ C ~ t i_t * \tilde{C}_t it∗C~t,其具体操作为:
i