Gated Recurrent Unit(GRU)
在上一篇博客里介绍了LSTM(Long Short-Term Memory),博客地址:LSTM(Long Short-Term Memory)。LSTM相比较最基本的RNN,在NLP的很多应用场景下都表现出了很好的性能,至今依然很常用。但是,LSTM存在一个问题,就是计算开销比较大,因为其内部结构相对复杂。GRU 也是为了旨在解决标准 RNN 中出现的梯度消失问题,可以看做是LSTM的一种变种。其实在大多数情况下GRU的性能和LSTM几乎相差无几(甚至有时候LSTM效果更好,且LSTM是1997年提出的,经受了更多的历史考验),但GRU最大的优势就是 简单(因为只有两个门),计算开销小,更加适用于大规模数据集。
首先上个图来看下GRU的结构(图片来自:colah’s blog《Understanding LSTM Networks》),为了让大家看的更明白,我把图片做了细微的改动,其实就是多加了几个箭头。。如下图所示:
其中
r
t
r_t
rt 表示重置门(reset gate),
z
t
z_t
zt 表示更新门(update gate)。下面就来具体看看这两个门:
一、更新门(update gate)
首先计算更新门,其值在0到1之间:
z
t
=
σ
(
W
z
⋅
[
h
t
−
1
,
x
t
]
)
z_t = \sigma(W_z\cdot[h_{t-1},x_t])
zt=σ(Wz⋅[ht−1,xt])
其中
h
t
−
1
h_{t-1}
ht−1为上一个隐藏状态,
x
t
x_t
xt为当前的输入。然后通过一个sigmoid函数得到0到1的结果,其决定了上一个隐藏状态有多少信息被保留下来,且新的内容有多少需要被添加进memory里(被记忆)。
二、重置门(reset gate)
重置门的主要作用就是过去的多少信息需要被遗忘,其计算公式为:
r
t
=
σ
(
W
r
⋅
[
h
t
−
1
,
x
t
]
)
r_t = \sigma(W_r\cdot[h_{t-1},x_t])
rt=σ(Wr⋅[ht−1,xt])
其实它和更新的计算公式是一样的,只不过是参数不同,更新门和重置门有各自的参数,这个参数都是训练过程中学习得到的。同样,其值在0到1之间。
重置门通过重置
h
t
−
1
h_{t-1}
ht−1,也就是有多少信息需要被遗忘,然后与当前输入
x
t
x_t
xt一起送到
t
a
n
h
tanh
tanh函数里得到新的记忆内容
h
~
t
\widetilde{h}_t
h
t,其计算公式为:
h
~
t
=
t
a
n
h
(
W
⋅
[
r
t
∗
h
t
−
1
,
x
t
]
)
\widetilde{h}_t = tanh(W\cdot[r_t*h_{t-1},x_t])
h
t=tanh(W⋅[rt∗ht−1,xt])
三、当前时间步的记忆
当前时间步的记忆计算公式为:
h
t
=
z
t
∗
h
~
t
+
(
1
−
z
t
)
∗
h
t
−
1
h_t = z_t*\widetilde{h}_t + (1 - z_t)*h_{t-1}
ht=zt∗h
t+(1−zt)∗ht−1
这个信息会被传递到下一个GRU单元里。
bengio组的论文Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling详细对比了GRU和LSTM,有兴趣的同学可以查看下。
参考文献
[1]:Understanding GRU Networks