LSTM简介
LSTM(Long Short-Term Memory)长短期记忆网络,RNN的升级款,主要解决RNN中长时序列中的梯度消失问题。在长时间序列中,原始的RNN由于梯度的乘性问题,前面的序列的影响近乎为0,LSTM将其修正为加性问题。
LSTM原理
先上原理图:
在LSTM中,第一阶段是遗忘门,遗忘层决定哪些信息需要从细胞状态中被遗忘,下一阶段是输入门,输入门确定哪些新信息能够被存放到细胞状态中,最后一个阶段是输出门,输出门确定输出什么值。 下面我们分析这三个门以及中间计算过程。
遗忘门
遗忘门是将上一时间点输出 h t − 1 h_{t-1} ht−1和当前时间点的数据 x t x_t xt作为输入,通过 s i g m o i d sigmoid sigmoid激活函数,得到 f t f_t ft的过程。由于 s i g m o i d sigmoid sigmoid函数的输出在 [ 0 , 1 ] [0, 1] [0,1]区间,即 f t f_t ft在 [ 0 , 1 ] [0, 1] [0,1]区间,因此 f t f_t ft可以表示上一层细胞状态被遗忘的概率, 1 1 1是“完全保留“, 0 0 0是”完全舍弃“。
计算公式及解释
遗忘门计算公式如下:
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f\cdot[h_{t-1}, x_t] + b_f) ft=σ(Wf⋅[ht−1,xt]+bf)
公式解释: 首先将 h t − 1 h_{t-1} ht−1和 x t x_t xt拼接为一个长的输入向量;然后对输入向量进行全连接计算,权重矩阵为 W f W_f Wf;在结果中加入偏置 b f b_f bf得到隐层向量;最后对隐层向量做 s i g m o i d sigmoid sigmoid激活,得到遗忘概率 f t f_t ft。
在实际编码时,还可以按如下公式描述的进行编码,即不拼接 h t − 1 h_{t-1} ht−1和 x t x_t xt,而是拆开 W f W_f Wf。
f t = σ ( W i f ⋅ x t + W h f ⋅ h t − 1 + b f ) f_t=\sigma(W_{if}\cdot x_t + W_{hf}\cdot h_{t-1}+b_f) ft=σ(Wif⋅xt+Whf⋅ht−1+bf)
输入门
输入门包含一个和遗忘门相同的结构,输出为 i t i_t it,表示当前时间点有多+少输入信息被保留,另一部分是对输入信息的处理,输出为 C t ~ \tilde{C_t} Ct~。
计算公式及解释
输入门计算公式有两个,分别如下:
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t=\sigma(W_i\cdot[h_{t-1},x_t]+b_i) it=σ(Wi⋅[ht−1,xt]+bi)
C t ~ = tanh ( W c ⋅ [ h t − 1 , x t ] + b c ) \tilde{C_t}=\tanh(W_c\cdot[h_{t-1},x_t]+b_c) Ct~=tanh(Wc⋅[ht−1,xt]+bc)
公式解释: 该公式格式和遗忘门相同,计算过程也是相同的,解释参考遗忘门。
细胞状态更新
计算了输入门和输出门之后,就可以对当前时刻细胞状态进行更新。
上图中的X
和+
都是pointwise
操作,逐元素操作。先计算
f
t
f_t
ft和前一时刻细胞状态
C
t
−
1
C_{t-1}
Ct−1的外积,遗忘掉部分前一时刻的细胞状态;然后计算
i
t
i_t
it和
C
t
~
\tilde{C_t}
Ct~的外积,保留部分本时刻的输入;最后将两部分向量做加法得到本时刻的细胞状态
C
t
C_t
Ct。这一部分计算公式如下:
C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t=f_t*C_{t-1}+i_t*\tilde{C_t} Ct=ft∗Ct−1+it∗Ct~
输出门
输出门决定当前时刻细胞状态被过滤程度。首先是和输入门相同的结构,计算得到输出被过滤概率
o
t
o_t
ot,然后将细胞状态
C
t
C_t
Ct使用tanh
函数激活;最后使用
o
t
o_t
ot过滤激活结果得到当前时刻输出
h
t
h_t
ht。其计算公式如下:
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t=\sigma(W_o\cdot[h_{t-1},x_t]+b_o) ot=σ(Wo⋅[ht−1,xt]+bo)
h t = o t ∗ tanh ( C t ) h_t=o_t*\tanh(C_t) ht=ot∗tanh(Ct)
LSTM的细胞状态 C t C_t Ct变动缓慢,表示长期记忆; h t h_t ht变动较快,表示短期记忆。另外,每一层的 W f , b f W_f,b_f Wf,bf, W i , b i W_i,b_i Wi,bi, W c , b c W_c,b_c Wc,bc以及 W o , b o W_o,b_o Wo,bo都是层内共享的。
LSTM优缺点
- 优点:有效解决了RNN梯度消失问题。对于长时序列能较好拟合。
- 缺点:LSTM虽然部分解决了rnn梯度消失问题,但是信息在过远的距离传播中损失很厉害;另外,其无法很好的并行(工业上影响很大)。
双向LSTM
双向LSTM,由两个普通LSTM组成,能够同时利用过去和未来时刻的信息,推导当前时刻的信息。下图是其结构。
多层LSTM
LSTM变体
GRU
GRU是LSTM最流行的一个变体,其结构如下:
GRU取消了LSTM中的cell state,只使用了hidden state,并且使用update gate更新门来替换LSTM中的输入们和遗忘门,取消了LSTM中的输出门,新增了reset gate重置门,图中的 z t z_t zt和 r t r_t rt分别表示更新门和重置门。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门控制前一状态有多少信息被写入到当前的候选集 h t ~ \tilde{h_t} ht~上,重置门越小,前一状态的信息被写入的越少。这样做的好处是在达到LSTM相近的效果下,GRU参数更少,训练的计算开销更小,训练速度更快。
后记
标准RNN结构如下:
该结构和LSTM对比起来非常好理解。但是实际使用场景中,有根据问题域不同,也有不同的使用结构。下图是一些RNN的实际使用场景下的结构。
将上面两图结合就是Encoder-Decoder模型,也可以称之为Seq2Seq模型。
LSTM和RNN一样,根据使用场景不同,LSTM可能有单输入多输出,多输入单输出,多输入多输出等输入输出结构。