Gated Recurrent Unit (GRU)
门控循环单元(GRU)是一种循环单元,其更新门和重置门会控制它记住的内容。涵盖方程、GRU 与 LSTM 的比较以及代码。
门控循环单元(GRU)是一种循环神经网络(RNN)单元,它逐步处理序列,并使用两个可学习的门(更新门和重置门)来决定每一步保留多少记忆、覆盖多少记忆。Kyunghyun Cho 及其同事于 2014 年在用于机器翻译的 RNN 编码器-解码器中提出了 GRU。这些门让梯度可以跨越许多时间步传播,因此相比受梯度消失问题困扰的简单 RNN,GRU 能学习更长距离的依赖关系。GRU 是长短期记忆网络(LSTM)的简化版本:它只有一个隐藏状态,而不是两个;只有三个权重块,而不是四个。GRU 可用于时间序列分析、语音和其他序列数据。
GRU 的工作原理#
在每个时间步 t,GRU 会结合当前输入 xₜ 和前一个隐藏状态 hₜ₋₁。两个门使用 sigmoid 函数为状态中的每个元素输出 0 到 1 之间的值:
- 重置门:rₜ = σ(Wᵣxₜ + Uᵣhₜ₋₁ + bᵣ),用于决定生成新内容时要使用多少先前状态。接近 0 的值会让单元忽略历史信息,这在新短语开头等边界位置很有帮助。
- 更新门:zₜ = σ(W_z xₜ + U_z hₜ₋₁ + b_z),用于决定要保留多少先前状态。接近 1 的值会让旧状态几乎原样传递,这正是信息能够在长序列中留存的方式。
- 候选状态:h̃ₜ = tanh(Wxₜ + U(rₜ ⊙ hₜ₋₁) + b),根据输入和经过重置门缩放的历史信息生成新的候选内容,并使用 tanh 将值限制在 −1 到 1 之间。
- 新状态:hₜ = (1 − zₜ) ⊙ h̃ₜ + zₜ ⊙ hₜ₋₁,逐元素将候选状态与旧状态混合。
当更新门保持接近 1 时,新状态几乎就是旧状态的副本,梯度会沿副本反向传递,衰减很小。这条加法路径发挥的作用与 LSTM 中的单元状态相同。以上公式遵循原始论文,其中 zₜ 对旧状态加权;有些资料会互换 zₜ 和 1 − zₜ 的作用,但描述的仍是同一个单元。PyTorch 的 nn.GRU 使用相同的混合方式,但在矩阵乘法后应用重置门,即 rₜ ⊙ (Uhₜ₋₁ + b),这是广泛使用的候选状态变体。
PyTorch 中的 GRU#
下面的代码片段会让 GRU 处理一系列特征向量,例如视频中每一帧的特征,并比较它与相同宽度的 LSTM 的参数规模:
import torch
from torch import nn
# A sequence of 64-dim features from 5 video frames: (batch, time, features)
frames = torch.randn(1, 5, 64)
# A GRU with a 128-dim hidden state, and an LSTM of the same size for comparison
gru = nn.GRU(input_size=64, hidden_size=128, batch_first=True)
lstm = nn.LSTM(input_size=64, hidden_size=128, batch_first=True)
# outputs holds the hidden state at every step; h_n is the final state
outputs, h_n = gru(frames)
print(f"Outputs: {tuple(outputs.shape)}, final state: {tuple(h_n.shape)}")
# GRU weights cover 3 blocks (reset, update, candidate); LSTM weights cover 4
gru_params = sum(p.numel() for p in gru.parameters())
lstm_params = sum(p.numel() for p in lstm.parameters())
print(f"GRU: {gru_params:,} parameters, LSTM: {lstm_params:,} parameters")它会输出 Outputs: (1, 5, 128), final state: (1, 1, 128) 和 GRU: 74,496 parameters, LSTM: 99,328 parameters。GRU 会为每一帧返回一个 128 维状态,以及一个概括整个序列、可供下游分类器使用的最终状态;其参数量恰好是 LSTM 的四分之三。
GRU 与 LSTM 和 Transformer#
- LSTM:除了隐藏状态,还保留单独的单元状态,并使用三个门(输入门、遗忘门和输出门)。GRU 合并这两个状态并去掉输出门,因此每一步的训练速度更快,参数也更少。Junyoung Chung 及其同事在 2014 年进行的实证比较中发现,GRU 在复调音乐和语音信号建模任务上的表现与 LSTM 相当;实际上,两者并没有哪一个能在所有任务中始终胜出。
- 简单 RNN:每一步都会覆盖整个状态,没有任何门,因此在长序列中梯度会消失或爆炸,也难以关联间隔很长的事件。
- Transformer:使用注意力并行处理序列中的所有位置,在 GPU 上训练速度快得多,也更擅长处理长距离上下文,因此 Transformer 已在大多数语言任务中取代循环网络。无论序列有多长,GRU 都能保持固定大小的状态和每步固定的计算成本,因此仍适用于流式音频、传感器数据和小型设备。
应用场景#
- 光流:获得 ECCV 2020 最佳论文奖的 RAFT 使用卷积 GRU,通过多次迭代不断优化光流估计。卷积 GRU 会用卷积替代矩阵乘法,因此其状态是特征图。
- 预测性维护与预测:GRU 会读取振动、温度或需求数据流,并预测故障或未来数值;这类模型通常部署在嵌入式硬件上,因为小模型很重要。
- 语音和音频:设备端音频模型会使用 GRU,因为它能以较小且固定的内存逐帧处理音频。RNNoise 降噪器会在普通 CPU 上实时运行其 GRU 层。
- 动作识别:GRU 会读取逐帧特征或关键点序列,并为视频片段输出动作标签。YOLO26 的跟踪模式会为每个人分配跨帧保持不变的 ID,从而生成每个人对应的边界框或姿态关键点序列,供 GRU 进行分类。










