1 背景
之前学习过TF-IDF,它是根据词频统计来将文本抽象成向量。其实还有n-gram方法也都能将文本抽象成向量,但是它们对文本上下文的意思处理得不那么好。因此就有了循环神经网络,将上一时刻得状态引入到当前时刻,但随着网络深度得增加,不可避免的受到了梯度消失核梯度爆炸得诅咒。因此就有人整出了LSTM,它通过遗忘门选择丢弃掉哪些信息,通过输入门选择更新哪些信息,能够很好得规避梯度消失和梯度爆炸。
2 LSTM
LSTM的核心是细胞状态,细胞状态用用贯穿细胞的水平线表示,你可以将其想象成一个传送带,从输入到输出,信息不会变化。
LSTM通过门来对细胞状态进行添加或者删除,可以将门想象成高通滤波器,它可以选择让哪些信息通过。在实现中这个门是用sigmod函数和一个点乘操作组成的。
遗忘门
LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为遗忘门的sigmoid单元来处理的。它通过查看
h
t
−
1
h_{t-1}
ht−1和
x
t
x_t
xt信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态
C
t
−
1
C_{t-1}
Ct−1中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。遗忘门如下图所示。
表达式为:
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通过一个称为输入门的操作来决定更新哪些信息;然后利用
h
t
−
1
h_{t-1}
ht−1和
x
t
x_t
xt通过一个
t
a
n
h
tanh
tanh层得到新的候选细胞信息
C
~
t
\tilde{C}_t
C~t,这些信息可能会被更新到细胞信息中。这两步描述如下图所示。
其表达式为:
i
t
=
σ
(
W
i
⋅
[
h
t
−
1
,
x
t
]
+
b
i
)
C
t
~
=
t
a
n
h
(
W
C
⋅
[
h
t
−
1
,
x
t
]
+
b
C
)
i_t=\sigma(W_i \cdot[h_{t-1},x_t]+b_i) \\ \tilde{C_t}=tanh(W_C\cdot [h_{t-1},x_t]+b_C)
it=σ(Wi⋅[ht−1,xt]+bi)Ct~=tanh(WC⋅[ht−1,xt]+bC)
更新
下面将更新旧的细胞信息
C
t
−
1
C_{t-1}
Ct−1,变为新的细胞信息
C
t
C_{t}
Ct。更新的规则就是通过遗忘门选择遗忘旧细胞信息的一部分,通过输入门选择添加候选细胞信息
C
~
t
\tilde{C}_t
C~t的一部分得到新的细胞信息
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~
输出门
更新完细胞状态后需要根据输入的
h
t
−
1
h_{t-1}
ht−1和
x
t
x_t
xt来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个-1~1之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。该步骤如下图所示:
其表达式为:
o
t
=
σ
(
W
o
[
h
t
−
1
,
x
t
]
+
b
o
)
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
o_t=\sigma(W_o[h_{t-1},x_t]+b_o) \\ h_t=o_t*tanh(C_t)
ot=σ(Wo[ht−1,xt]+bo)ht=ot∗tanh(Ct)
感谢阅读。
如果觉得文章对你有所帮助,欢迎打赏哦~