1、LSTM简介
长短期记忆网络将信息存放在递归网络正常信息流之外的门控单元中,这些单元可以存储、写入或读取息就像计算机内存中的数据一样。但愿通过门的开关判定存储哪些信息,何时允许读取、写入或清除信息。这些门是模拟的,包含输出范围全部在0~1之间的Sigmoid函数的逐元素相乘操作。这些门依据接收到的信号开关,而且会用自身的权重集对信息进行筛选,根据强度和输入内容决定是否允许信息通过。这些权重会通过递归网络的学习过程进行调整。
LSTM主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
如上图所示,RNN只有一个门:输入门(输入和输出相当于一个门),而LSTM拥有三个门,分别为:遗忘门、输入门、输出门。
1.2、遗忘门
对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
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)
1.3、输入门
将这个阶段的输入有选择性地进行“记忆”。一个新的候选值,判断是否将其加入到元胞状态中。
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
~
=
t
a
n
h
(
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)
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~
1.4、输出门
决定哪些将会被当成当前状态的输出。选择重要的信息作为元胞状态的输出。
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
∗
t
a
n
h
(
C
t
)
h_t=o_t*tanh(C_t)
ht=ot∗tanh(Ct)
1.5、LSTM步骤如下:
- 决定从元胞状态中扔掉哪些信息。由叫做“遗忘门”的Sigmoid层控制。遗忘门会输出0~1之间的数,1表示保留该信息,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)
- 通过输入门将有用的新信息加入到元胞状态。首先,将前一状态和当前状态的输入输入到Sigmoid函数中滤除不重要信息。另外,通过tanh函数得到一个-1〜1之间的输出结果。这将产生一个新的候选值,后续将判断是否将其加入到元胞状态中。
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 ~ = t a n h ( 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) - 将上一步中Sigmoid函数和tanh函数的输出结果相乘,并加上第一步中的输出结果,从而实现保留的信息都是重要信息,此时更新状态即可忘掉那些不重要的信息。 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~
- 最后,从当前状态中选择重要的信息作为元胞状态的输出。首先,将前一隐状态和当前输入值通过Sigmoid函数得到一个0〜1之间的结果值。然后对第三步中输出结果计算tanh函数的输出值,并与得到的结果值相乘,作为当前元胞隐状态的输出结果,同时也作为下一个隐状态的输入值。
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 ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht=ot∗tanh(Ct)
1.6 LSTM训练过程
1.7 多隐藏层的LSTM
左边是2个隐藏层,右边是3个隐藏层。
2、Bi-LSTM(Bi-directional Long Short-Term Memory)
LSTM只关注了"上文",有时候我们需要感知"上下文",特别是在自然语言处理中。
前向的LSTM与后向的LSTM结合成BiLSTM。
例如:前向的依次输入“我”,“爱”,“中国”得到三个向量{
h
L
0
,
h
L
1
,
h
L
2
h_{L0},h_{L1},h_{L2}
hL0,hL1,hL2}。后向的依次输入“中国”,“爱”,“我”得到三个向量{
h
R
0
,
h
R
1
,
h
R
2
h_{R0},h_{R1},h_{R2}
hR0,hR1,hR2}。最后将前向和后向的隐向量进行拼接得到{
[
h
L
0
,
h
R
0
]
,
[
h
L
1
,
h
R
1
]
,
[
h
L
2
,
h
R
2
]
[h_{L0},h_{R0}],[h_{L1},h_{R1}],[h_{L2},h_{R2}]
[hL0,hR0],[hL1,hR1],[hL2,hR2]},即:{
h
0
,
h
1
,
h
2
h_0,h_1,h_{2}
h0,h1,h2}。
3、GRU(Gate Recurrent Unit)
GRU是循环神经网络的一种,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。为什么用GRU?相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。
门限循环单元本质上就是一个没有输出门的长短期记忆网络,因此它在每个时间步都会将记忆单元中的所有内容写入整体网络。
GRU只有两个门:重置门和更新门,将遗忘门和输入门合并为更新门,将细胞状态 与 隐藏层输出 合并在一起。
将元胞状态和隐状态合并,更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略的越多。这个模型比长短期记忆网络更加简化,也变得越来越流行。
来源:赵卫东《机器学习》