LSTM的工作原理分析
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门的层完成。该门会读取h_(t-1)和x_t ,输出一个在 0到 1之间的数值给每个在细胞状态C_(t-1)中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
f
t
=
σ
(
W
f
∗
[
h
(
t
−
1
)
,
x
t
]
+
b
f
)
f_t=σ(W_f*[h_(t-1),x_t ]+b_f)
ft=σ(Wf∗[h(t−1),xt]+bf)
下一步是决定让多少新的信息加入到 cell 状态 中来。实现这个需要包括两个步骤:首先,一个叫做“input gate layer ”的 sigmoid 层决定哪些信息需要更新;一个 tanh 层生成一个向量,也就是备选的用来更新的内容,
(
C
t
′
)
(C'_t )
(Ct′)。在下一步,我们把这两部分联合起来,对 cell 的状态进行一个更新。
i
t
=
σ
(
W
i
∗
[
h
(
t
−
1
)
,
x
t
]
+
b
i
)
i_t=σ(W_i*[h_(t-1),x_t ]+b_i)
it=σ(Wi∗[h(t−1),xt]+bi)
(
C
t
′
)
=
t
a
n
h
(
W
C
∗
[
h
(
t
−
1
)
,
x
t
]
+
b
C
)
(C'_t ) =tanh(W_C*[h_(t-1),x_t ]+b_C)
(Ct′)=tanh(WC∗[h(t−1),xt]+bC)
上面的两个门,“遗忘门”和“输入门”已经决定好了什么要遗忘,什么要更新保留了,现在要真的在cell state上执行了:
C
t
C_t
Ct=
f
t
f_t
ft *
C
t
−
1
C_{t-1}
Ct−1 +
i
t
i_t
it*
C
t
′
C'_t
Ct′
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
o
t
=
σ
(
W
o
∗
[
h
(
t
−
1
)
,
x
t
]
+
b
o
)
o_t=σ(W_o*[h_(t-1),x_t ]+b_o)
ot=σ(Wo∗[h(t−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.细胞状态
C
t
C_t
Ct保存的是内容,它会根据遗忘门和输入门来进行更新;
2.隐层状态
h
t
h_t
ht保存的是当前细胞的各项内容存在与否的数值标志,所以隐层状态
h
t
h_t
ht的更新需要在细胞状态
C
t
C_t
Ct更新后进行更新;
3.LSTM是先根据遗忘门和旧的细胞状态和输入门和新的更新内容来更新细胞状态,然后再用新的细胞状态
C
t
C_t
Ct来更新隐层状态
h
t
h_t
ht的过程。