
GRU:用重置门与更新门简化序列记忆的经典解读
本文是原创中文论文解读,主要参考 D2L 的英文章节 "Gated Recurrent Units (GRU)" 和 Cho 等人在 2014 年提出 RNN Encoder-Decoder 的经典论文。D2L 原文与图示采用 Creative Commons Attribution-ShareAlike 4.0 International License,文末列出来源与许可说明。
在 Transformer 成为默认选择之前,循环神经网络曾长期承担序列建模的主力角色。普通 RNN 的思想很直接:每来一个时间步,就把当前输入和上一个隐状态混在一起,得到新的隐状态。但这个机制太"勤快":它每一步都更新,也每一步都试图把旧记忆压进一个新的非线性变换里。序列一长,梯度和信息都容易被冲淡。
LSTM 用输入门、遗忘门、输出门和记忆单元解决了这个问题,但结构也更重。GRU(Gated Recurrent Unit,门控循环单元)可以看作一条更轻的路线:保留"门控记忆"的核心思想,把门的数量压到两个,让模型仍能决定什么时候记住、什么时候改写、什么时候忽略当前输入。
这就是 GRU 的经典价值:它不是为了取代所有 LSTM,而是在许多序列任务上给出一个更简洁、计算更轻、效果常常相近的折中方案。
一、GRU 想解决什么问题
普通 RNN 的隐状态更新通常可以写成:
Ht=ϕ(XtWxh+Ht−1Whh+bh) \mathbf{H}t = \phi(\mathbf{X}t\mathbf{W}{xh} + \mathbf{H}{t-1}\mathbf{W}_{hh} + \mathbf{b}_h) Ht=ϕ(XtWxh+Ht−1Whh+bh)
这里的问题不在公式复杂,而在选择能力太弱。所有历史信息都必须通过同一个更新函数继续往前传。模型没有显式机制去回答三个关键问题:
- 旧状态里哪些内容应该保留?
- 当前输入应该在多大程度上改写记忆?
- 某个时间步是否可以近似跳过?
GRU 的两个门正是围绕这些问题设计的:
- 重置门(reset gate):决定计算候选状态时,旧隐状态还有多少需要参与。
- 更新门(update gate):决定最终隐状态更接近旧状态,还是更接近新候选状态。
从这个角度看,GRU 不是给 RNN 加了复杂装饰,而是给"记忆更新"增加了可学习的刹车和旁路。
二、两个门:重置门和更新门

设当前时间步输入为:
Xt∈Rn×d \mathbf{X}_t \in \mathbb{R}^{n \times d} Xt∈Rn×d
上一时刻隐状态为:
Ht−1∈Rn×h \mathbf{H}_{t-1} \in \mathbb{R}^{n \times h} Ht−1∈Rn×h
其中 (n) 是 batch size,(d) 是输入维度,(h) 是隐状态维度。GRU 先用当前输入和上一隐状态计算两个门:
Rt=σ(XtWxr+Ht−1Whr+br),Zt=σ(XtWxz+Ht−1Whz+bz). \begin{aligned} \mathbf{R}t &= \sigma(\mathbf{X}t \mathbf{W}{xr} + \mathbf{H}{t-1} \mathbf{W}_{hr} + \mathbf{b}r),\\ \mathbf{Z}t &= \sigma(\mathbf{X}t \mathbf{W}{xz} + \mathbf{H}{t-1} \mathbf{W}{hz} + \mathbf{b}_z). \end{aligned} RtZt=σ(XtWxr+Ht−1Whr+br),=σ(XtWxz+Ht−1Whz+bz).
这里 (\mathbf{R}_t) 是重置门,(\mathbf{Z}_t) 是更新门。二者都经过 sigmoid,因此每个分量都落在 0 到 1 之间。这个范围很关键:门值不是硬开关,而是连续可学习的比例。
可以把两个门的职责粗略理解为:
- (\mathbf{R}_t) 控制"计算新内容时,要不要参考旧记忆";
- (\mathbf{Z}_t) 控制"最终输出时,要保留多少旧记忆"。
这两个问题看似接近,其实不同。前者影响候选记忆怎么产生,后者影响旧记忆和候选记忆怎么混合。
三、候选隐状态:先决定旧信息能否进入新计算

有了重置门以后,GRU 不是直接把 (\mathbf{H}_{t-1}) 送进候选状态计算,而是先做逐元素相乘:
\\tilde{\\mathbf{H}}_t = \\tanh(\\mathbf{X}*t \\mathbf{W}*{xh} * (\\mathbf{R}*t \\odot \\mathbf{H}*{t-1}) \\mathbf{W}_{hh} * \\mathbf{b}_h).
(\odot) 表示逐元素乘法。这个小动作非常重要:
- 如果 (\mathbf{R}_t) 接近 1,旧隐状态几乎完整参与计算,GRU 退化得接近普通 RNN 的候选更新。
- 如果 (\mathbf{R}_t) 接近 0,旧隐状态被大幅屏蔽,候选状态更像只由当前输入驱动的 MLP 结果。
因此,"reset"并不是把最终隐状态清零,而是在生成候选状态之前,控制旧状态对新内容的影响。它特别适合处理短期依赖:当局部上下文需要重新解释时,模型可以降低更早状态的干扰。
四、最终隐状态:更新门决定保留还是改写

候选隐状态只是"新建议"。最终是否采纳,还要看更新门:
\\mathbf{H}_t = \\mathbf{Z}*t \\odot \\mathbf{H}*{t-1} * (1 - \\mathbf{Z}_t) \\odot \\tilde{\\mathbf{H}}_t.
这个公式是理解 GRU 的核心。它不是简单地"用新状态替换旧状态",而是在旧状态和候选状态之间做逐维插值。
当 (\mathbf{Z}_t) 接近 1 时,(\mathbf{H}t) 更接近 (\mathbf{H}{t-1})。当前输入对状态影响较小,模型相当于沿着时间轴复制旧记忆,甚至可以近似跳过这个时间步。
当 (\mathbf{Z}_t) 接近 0 时,(\mathbf{H}_t) 更接近 (\tilde{\mathbf{H}}_t)。模型选择用当前输入和候选状态改写记忆。
这正是 GRU 处理长距离依赖的关键:长距离信息不必每一步都被重新非线性变换一次,它可以通过更新门沿时间传递下去。
五、从实现看 GRU:三组参数,三步计算
如果从代码角度看,GRU 的一轮前向计算可以压缩成下面的伪代码:
python
Z = sigmoid(X @ W_xz + H @ W_hz + b_z) # update gate
R = sigmoid(X @ W_xr + H @ W_hr + b_r) # reset gate
H_tilde = tanh(X @ W_xh + (R * H) @ W_hh + b_h)
H = Z * H + (1 - Z) * H_tilde
这段伪代码暴露了一个实用事实:GRU 比普通 RNN 多了门控参数,但比 LSTM 少了一部分状态与门的组合。它没有单独的 cell state,也没有输出门;隐状态本身同时承担记忆和输出的角色。
这带来两个结果:
- 参数与计算通常比 LSTM 更轻;
- 表达能力不一定在所有任务上超过 LSTM,但在许多中等长度序列任务中足够有效。
所以实践里经常会看到一个朴素选择:如果普通 RNN 明显不够,而 LSTM 又显得偏重,GRU 是很值得先试的基线。
六、GRU、LSTM 和普通 RNN 的关系
D2L 对 GRU 的总结很清楚:和 LSTM 相比,GRU 往往计算更轻;和普通 RNN 相比,GRU 通过门控机制更容易捕捉时间跨度较大的依赖。
更具体地说:
- 普通 RNN:每一步都更新隐状态,缺少显式保留/跳过机制。
- LSTM:有独立记忆单元和三个主要门,控制更细,但结构更重。
- GRU:把记忆控制压缩成重置门和更新门,减少结构复杂度,同时保留长短期依赖建模能力。
这也是为什么 GRU 在神经机器翻译、语音、时间序列和早期序列表示学习中很常见。它的贡献不只是"又一个 RNN 变体",而是证明了门控记忆可以做得更轻,并且仍然有很强的工程价值。
七、今天再看 GRU,它还重要吗
现在很多 NLP 任务已经默认使用 Transformer,但 GRU 仍然值得理解,原因有三点。
第一,GRU 是理解门控机制的好入口。Transformer 里没有 RNN 式的时间递推,但"保留、融合、跳过"的思想仍然在残差连接、门控 MLP、MoE 路由、状态空间模型等结构中反复出现。
第二,GRU 仍适合一些资源敏感或低延迟场景。对于小模型、边缘设备、短序列时间序列预测,循环结构的增量计算有时比全量注意力更直接。
第三,GRU 提供了一个很好的建模范式:不要盲目增加结构,而是把模型真正缺少的选择能力补上。普通 RNN 缺少"何时保留、何时更新"的机制,GRU 就用两个门把这个问题显式化。
这也是经典模型最值得反复读的地方。它们不只是历史节点,而是许多后来架构的设计母题。
参考来源与许可说明
- Aston Zhang, Zachary C. Lipton, Mu Li, Alexander J. Smola, "Gated Recurrent Units (GRU)", Dive into Deep Learning 1.0.3. 原文链接:https://d2l.ai/chapter_recurrent-modern/gru.html
- D2L README License Summary:D2L 开源书正文与图示采用 Creative Commons Attribution-ShareAlike 4.0 International License;示例/参考代码采用 modified MIT license。许可说明:https://github.com/d2l-ai/d2l-en
- Kyunghyun Cho, Bart van Merrienboer, Caglar Gulcehre, Dzmitry Bahdanau, Fethi Bougares, Holger Schwenk, Yoshua Bengio, "Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation", arXiv:1406.1078, submitted 2014-06-03, last revised 2014-09-03. 论文链接:https://arxiv.org/abs/1406.1078
- Junyoung Chung, Caglar Gulcehre, Kyunghyun Cho, Yoshua Bengio, "Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling", arXiv:1412.3555.
本文为原创中文解读,不是对 D2L 章节的逐段翻译。文中三张结构图来自 D2L GRU 章节,已按 CC BY-SA 4.0 进行来源署名与许可说明;原始论文图片未转载。