由于原始的RNN会在每一次输入时堆叠之前的隐藏状态,所以在nlp中面对长句子时RNN往往会忘掉之前比较重要的信息,故隐藏转态的更新与保留需要控制,所以出现了门的概念,具有代表性的就是LSTM与GRU。
GRU结构
原论文:Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
GRU(Gated Recurrent Unit)又称为门控循环单元,GRU在2014年被首次提出,用于统计机器翻译,和LSTM一样,它们都是循环神经网络的一种,GRU的出现晚于LSTM,但它的结构更为简单,可以看做是LSTM的简化的变体。
重置门与更新门
GRU 有两个门,一个重置门(reset gate)和一个更新门(update gate),重置门用于决定保留多少之前的隐状态,更新门用于决定更新隐藏状态,它们都是向量,GRU的思想就是通过重置门与更新门与原输入或者候选隐状态之间运算得到状态的更新。
重置门与更新门的计算公式如下:
R
t
=
σ
(
X
t
W
x
r
+
H
t
−
1
W
h
r
+
b
r
)
R_t=\sigma(X_tW_{xr}+H_{t-1}W_{hr}+b_r)
Rt=σ(XtWxr+Ht−1Whr+br)
Z
t
=
σ
(
X
t
W
x
z
+
H
t
−
1
W
h
z
+
b
z
)
Z_t=\sigma(X_tW_{xz}+H_{t-1}W_{hz}+b_z)
Zt=σ(XtWxz+Ht−1Whz+bz)
其中Xt表示t时刻输入,Wxr表示权重矩阵,Ht-1表示上一时刻的隐藏状态,br表示偏置项,下面一个类似,
σ
\sigma
σ为sigmoid变换,将向量所有元素控制在0-1范围。从上面公式看出,重置门与更新门由输入与隐状态决定,并且会不断变化,长度与隐状态长度相同。如下图所示:
候选隐藏状态
随后利用重置门计算保留的隐状态,称作候选隐状态:
H
t
~
=
t
a
n
h
(
X
t
W
x
h
+
(
R
t
⊙
H
t
−
1
)
W
h
h
+
b
h
)
\widetilde{H_t}=tanh(X_tW_{xh}+(R_t⊙H_{t-1})W_{hh}+b_h)
Ht
=tanh(XtWxh+(Rt⊙Ht−1)Whh+bh)
可以发现候选隐状态由输入、上一时刻隐状态与重置门决定,⊙表示Hadamard积(向量对应元素相乘),特别的,当重置门的元素全为0时,
R
t
⊙
H
t
−
1
R_t⊙H_{t-1}
Rt⊙Ht−1等于0,此时表示丢弃所有之前的隐状态。
如下图:
更新隐状态
得到候选隐状态后,通过更新门更新隐状态,更新后的隐状态由前一时刻隐状态与这一时刻候选隐状态决定。
H
t
=
Z
t
⊙
H
t
−
1
+
(
1
−
Z
t
)
⊙
H
t
~
H_t=Z_t⊙H_{t-1}+(1-Z_t)⊙\widetilde{H_t}
Ht=Zt⊙Ht−1+(1−Zt)⊙Ht
特别的,当Zt全部元素都为1时,更新的隐状态就是前一时刻的隐状态。
LSTM结构
原论文:LONG SHORT-TERM MEMORY
LSTM(Long Short-Term Memory)又称为长短期记忆网络,该论文首次发表于 1997 年。由德国慕尼黑工业大学的计算机科学家 Sepp Hochreiter 与 Jürgen Schmidhuber(现任瑞士 Dalle Molle 人工智能研究所的联合主任)共同完成。是具有长期记忆能力的一种时间递归神经网络 (Recurrent Neural Network),其网络结构含有一个或多个具有遗忘和记忆功能的单元。由于独特的设计结构,LSTM 适合于处理和预测时间序列中间隔和延迟非常长的重要事件。
忘记门、输入门与输出门
LSTM较GRU复杂,理解了GRU的思想,LSTM就比较容易,它有三个门:忘记门、输入门与输出门。它们的作用会在下面讲述,计算公式如下:
F
t
=
σ
(
X
t
W
x
f
+
H
t
−
1
W
h
f
+
b
f
)
F_t=\sigma(X_tW_{xf}+H_{t-1}W_{hf}+b_f)
Ft=σ(XtWxf+Ht−1Whf+bf)
I
t
=
σ
(
X
t
W
x
i
+
H
t
−
1
W
h
i
+
b
i
)
I_t=\sigma(X_tW_{xi}+H_{t-1}W_{hi}+b_i)
It=σ(XtWxi+Ht−1Whi+bi)
O
t
=
σ
(
X
t
W
x
o
+
H
t
−
1
W
h
o
+
b
o
)
O_t=\sigma(X_tW_{xo}+H_{t-1}W_{ho}+b_o)
Ot=σ(XtWxo+Ht−1Who+bo)
与GRU相同,Xt表示输入向量,W表示权重矩阵,Ht-1表示前一时刻隐状态,b为偏置项。
候选记忆单元
C
t
~
=
t
a
n
h
(
X
t
W
x
c
+
H
t
−
1
W
h
c
+
b
c
)
\widetilde{C_t}=tanh(X_tW_{xc}+H_{t-1}W_{hc}+b_c)
Ct
=tanh(XtWxc+Ht−1Whc+bc)
可以发现,候选记忆单元就是RNN隐状态的计算结果。
记忆单元
C
t
=
F
t
⊙
C
t
−
1
+
I
t
⊙
C
t
~
C_t=F_t⊙C_{t-1}+I_t⊙\widetilde{C_t}
Ct=Ft⊙Ct−1+It⊙Ct
其中忘记门主要是在更新记忆单元时对上一个时刻的记忆单元进行选择性忘记,输入门用于选择性记忆当前时刻的候选隐藏单元,它们的作用分别是从前一时刻与当前时刻提取信息更新记忆单元
隐状态
最后更新的隐状态由输出门与记忆单元决定。
H
t
=
O
t
⊙
t
a
n
h
(
C
t
)
H_t=O_t⊙tanh(C_t)
Ht=Ot⊙tanh(Ct)
输出门用于对记忆单元信息的留弃来更新隐状态。
总体结构图如下:
总结
总的来说,LSTM与GRU的一个不同就是LSTM使用记忆单元来更新隐状态,而GRU使用的是候选隐状态。但本质上都是对原有信息和现有信息的保留与丢弃的选择,最后的目的也都是隐状态的更新。实际应用中LSTM与GRU效果并没有大的差距,但GRU更加简便。经过发展,老驴时序数据的双向的顺序,后面也出现了双向LSTM与双向GRU。
参考资料:
https://blog.csdn.net/mrjkzhangma/article/details/103753375
https://www.jiqizhixin.com/articles/2017-12-24
https://www.bilibili.com/video/BV1JU4y1H7PC?spm_id_from=333.999.0.0
《动手学深度学习》
深度学习笔记 12/24