GRU(Gate Recurrent Unit)是一种 RNN,LSTM 也是一种 RNN,这两者都是为了解决 RNN 长程问题中的记忆衰减问题。一般来说,GRU $\approx$ LSTM,但是 GRU 的计算损耗更低,所以 GRU > LSTM。
LSTM
核心就是,如何去记忆重要的关键词,并且需要适当的遗忘。

那么我们就可以引入三个组件以及一个新的记忆变量 $C_t \in {\mathbb R}^h$,这里设 $x_t \in {\mathbb R}^d$:
非常需要注意一下,我这里没有考虑行列向量的问题,默认来说,$x_t, h_t$ 都应该是列向量,所以 $[h_{t-1}, x_t]$ 严格应该写为 $[h_{t-1}^T, x_t^T]^T$,但是很丑陋且麻烦,所以简写了。原文中用的是 $W \cdot [h_{t-1}, x_t]$ 的写法,我不是很明白,
- 遗忘门
- 首先计算需要怎么去遗忘:$f_t = \sigma(W_f [h_{t - 1}, x_t] + b_f) \in {\mathbb R}^h$
- 其中 $W_f \in {\mathbb R}^{h \times (h + d)}$
- 这里利用 sigmoid 函数去激活,$1 \to keep, 0 \to forget$
- 记忆门
- 接下来我们需要计算需要新加入什么记忆:$\tilde c_t = {\rm tanh}(W_c [h_{t - 1}, x_t] + b_c) \in {\mathbb R}^h$
- 但同时,也需要衡量其重要性(magnitude):$m_t = {\rm sigmoid}(W_m[h_{t - 1}, x_t] + b_c) \in {\mathbb R}^h$
- 其中 $W_c, W_m \in {\mathbb R}^{h \times (h + d)}$
- 那么于是,记忆就可以更新为:$c_t = c_{t - 1} \odot f_t + \tilde c_t \odot m_t$
- 输出门
- 根据记忆和状态输出即可:
- $h_t = \sigma(W_h [h_{t - 1}, x_t] + b_h) \odot {\rm tanh} (c_t)$
- 其中 $W_h \in {\mathbb R}^{h \times (h + d)}$
非常的简单,但是确实有点计算复杂。
GRU
我们为什么不能把 $h_t$ 和 $c_t$ 放一起呢?这样我们只需要两个门了,重置门和更新门:
- 重置门:
- 依旧怎么遗忘起手:$r_t = \sigma(W_r [h_{t - 1}, x_t] + b_r)$
- 于是可以得到当前的需求状态是什么:
- $\tilde h_t = {\rm tanh}(W_h [r_t \odot h_{t - 1}, x_t] + b_h)$
- 更新门
- 依旧是需要需要多少信息起手:$z_t = \sigma(W_z [h_{t - 1}, x_t] + b_z)$
- 于是新的状态自然是:$h_t = (1 - z_t) \odot h_{t - 1} + z_t\odot \tilde h_t$
需要注意的是,这两个框架的输出 $h_t$ 都表示的是隐状态,而不是真实的输出,对于 RNN 任务,还需要进一步使用其他的东西处理。
我在想,如果我只保留 GRU 中的两个门,这样这个结构可以抽象为:
$$\begin{aligned} \tilde h_t &= f(h_{t - 1}, x_t) \\ z_t &= \sigma(g(h_{t - 1}, x_t)) \\ h_t &= (1 - z_t) \odot h_{t - 1} + z_t\odot \tilde h_t \end{aligned} $$
对于 $f, g$,我能不能换成一个 FC NN 或者 MLP 之类的,甚至在 $h_t$ 的聚合过程中,再来点 Transformer 的想法,将 $h_{t - 1}$ 和 $\tilde h_t$ 通过 QKV 聚合。
简单搜索了一下,有相关的工作了:
- Minimal RNN
- Recurrent Attention
- Transformer-XL、RWKV