1 min read 291 words Updated Apr 25, 2026 Created May 03, 2026

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