文章目录
一、LSTM是什么
长短时记忆(LSTM)体系结构的设计是为了使信息在能够在需要之前的很长一段时间内都很容易记住。
这个名字指的是一个网络的激活对应于短期记忆,而权重对应于长期记忆。如果这些激活可以长时间保存信息,那么它们就是长短时记忆。
二、实现的主要流程
1.sigmoid函数的使用
有sigmoid函数的地方就是一个门,sigmoid函数的范围在0~1,sigmoid只开0的话,以前的信息就不能得到,若开1的话,以前的信息就能很好的继承。
下图一共三个门,遗忘门、输入门和输出门。
C
t
−
1
是
t
−
1
时
刻
的
状
态
值
C_{t-1}是t-1时刻的状态值
Ct−1是t−1时刻的状态值
C
t
是
t
时
刻
的
状
态
值
C_t是t时刻的状态值
Ct是t时刻的状态值
C
′
是
新
的
输
入
C'是新的输入
C′是新的输入
相乘符号类似于信息过滤,相加符号类似信息融合
C
t
是
由
C
′
与
过
滤
后
的
C
t
−
1
的
融
合
得
到
C_t是由C'与过滤后的C_{t-1}的融合得到
Ct是由C′与过滤后的Ct−1的融合得到
2.LSTM的门(gate)
Forget gate(遗忘门)
Forget gate的开度计算:
f
t
=
σ
(
W
f
[
h
t
−
1
,
x
t
]
+
b
f
)
f_t=\sigma(W_f [h_{t-1},x_t]+b_f )
ft=σ(Wf[ht−1,xt]+bf)
根据上式得到
t
t
t时刻forget开度的量
f
t
f_t
ft。
红色线是由
C
t
−
1
C_{t-1}
Ct−1与
f
t
f_t
ft相乘得到得过滤后得信息,即过滤后的历史状态。
Input gate(输入门)
这一步决定在这个状态块中存储什么样的新状态。
Input gate的开度计算:
i
t
=
σ
(
W
i
[
h
t
−
1
,
x
t
]
+
b
i
)
i_t=\sigma(W_i[h_{t-1},x_t]+b_i)
it=σ(Wi[ht−1,xt]+bi)
根据上式得到
t
t
t时刻input开度的量
i
t
i_t
it。
利用tanh激活函数压缩至[-1,1]范围得到
C
t
′
C'_t
Ct′,并添加入状态块中:
C
t
′
=
t
a
n
h
(
W
i
[
h
t
−
1
,
x
t
]
+
b
C
)
C'_t=tanh(W_i[h_{t-1},x_t]+b_C)
Ct′=tanh(Wi[ht−1,xt]+bC)
此时红色线代表
C
t
′
C'_{t}
Ct′与
i
t
i_t
it相乘得到得过滤后得信息,即过滤后的新状态。
此时的
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*C'_t
Ct=ft∗Ct−1+it∗Ct′。
该式含义:把旧状态乘以遗忘开度决定忘记的东西。然后,添加新的状态,并根据输入开度决定更新每个状态值的比例进行调整。
Output gate(输出门)
此时
h
t
h_t
ht不理解为memory,将其作为输出理解,
C
t
C_t
Ct相当于memory。
首先,根据
o
t
=
σ
(
W
o
[
h
t
−
1
,
x
t
]
+
b
o
)
o_t=\sigma(W_o[h_{t-1},x_t]+b_o)
ot=σ(Wo[ht−1,xt]+bo),可知由sigmoid函数决定要输出的状态有哪些。
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
h_t=o_t*tanh(C_t)
ht=ot∗tanh(Ct)
将单元格状态通过tanh(将值推入到-1和1之间),并将其乘以输出门的开度,只输出我们决定输出的部分。
总结
根据输出门与遗忘门的开度,可以实现几种行为
输入门 | 输出门 | 行为 |
---|---|---|
1 | 1 | 增加先前值,即 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*C'_t Ct=ft∗Ct−1+it∗Ct′ |
0 | 0 | 擦除值,即 C t = 0 C_t=0 Ct=0 |
1 | 0 | 覆盖值,即 C t = C t ′ C_t=C'_t Ct=Ct′ |
0 | 1 | 记忆先前值,即 C t = C t − 1 C_t=C_{t-1} Ct=Ct−1 |
其实,LSTM在神经网络架构中是作为一个黑盒实现的,并且它可以在一定程度上解决梯度离散与梯度爆炸(相对于传统RNN的梯度计算,没有了 W h h k W_{hh}^k Whhk项)。
参考
图片来源:龙曲良老师的pytorch课程讲解PPT