GRU 是什么?和 LSTM 有什么区别?
简化版
GRU(门控循环单元) 是 LSTM 的简化版,同样用门控机制缓解梯度消失、捕捉长依赖,但结构更精简:只有两个门(LSTM 是三个),且没有单独的细胞状态(把 LSTM 的细胞状态和隐藏状态合并成一个 h)。两个门:① 重置门(reset gate)——决定忘掉多少过去的信息(控制新候选状态里用多少历史);② 更新门(update gate)——决定保留多少旧状态、写入多少新状态(相当于把 LSTM 的遗忘门和输入门合二为一)。所以 GRU 在相同输入与隐藏维度下参数和理论计算更少,真实速度取决于算子实现,效果和 LSTM 通常相近;实践中:数据/资源有限或要快用 GRU,不同数据与优化配置下胜负不固定,常两者都试。
详细版
GRU vs LSTM 结构对比:
| LSTM | GRU | |
|---|---|---|
| 门数量 | 3 个(遗忘、输入、输出) | 2 个(重置、更新) |
| 状态 | 细胞状态 C + 隐藏状态 h | 只有隐藏状态 h(合并) |
| 参数量 | 四组仿射变换 | 三组仿射变换(同维度常少约 25%) |
| 计算速度 | 慢 | 快 |
| 效果 | 长/复杂序列可能略优 | 多数任务相近 |
GRU 两个门:
| 门 | 作用 |
|---|---|
| 重置门 r_t | 决定忽略多少过去状态(算候选时用多少历史) |
| 更新门 z_t | 决定保留多少旧状态 vs 采用多少新状态(合并了遗忘+输入) |
GRU 更新(简化):
z_t = σ(...) 更新门
r_t = σ(...) 重置门
h̃_t = tanh(W·[r_t⊙h_{t-1}, x_t]) 候选状态(重置门控制用多少历史)
h_t = (1-z_t)⊙h_{t-1} + z_t⊙h̃_t 更新门在旧状态和新候选间插值
完整版教学
一、GRU 的定位:LSTM 的精简替代
LSTM 用三个门 + 细胞状态解决了 RNN 的长依赖问题,但结构较复杂、参数多、计算慢。GRU(Gated Recurrent Unit,门控循环单元) 是后来提出的简化版——它保留了「用门控机制控制信息流、缓解梯度消失」的核心思想,但简化了结构:门更少、状态更少、参数更少。目标是用更简单的结构达到和 LSTM 相近的效果。理解 GRU 的最好方式,就是看它相比 LSTM 简化了什么。
二、简化一:合并状态——只有隐藏状态
LSTM 有两条状态线:细胞状态 C(长期记忆)和隐藏状态 h(短期输出)。GRU 把它们合并成一个隐藏状态 h——不再区分「细胞状态」和「隐藏状态」,用一个 h 同时承担记忆和输出。
这减少了一套状态的维护,结构更简洁。
三、简化二:两个门(重置门 + 更新门)
LSTM 有三个门(遗忘、输入、输出),GRU 只有两个门:
① 重置门(Reset Gate)r_t——决定用多少过去信息
r_t = σ(W_r · [h_{t-1}, x_t])
重置门控制在计算「候选新状态」时,要用多少上一步的历史信息。r_t 接近 0 = 「忽略过去、只看当前输入」(适合序列出现新片段、要「重置记忆」时);接近 1 = 「充分利用历史」。
② 更新门(Update Gate)z_t——决定新旧状态的比例
z_t = σ(W_z · [h_{t-1}, x_t])
更新门决定最终隐藏状态里,保留多少旧状态、采用多少新候选状态。它相当于把 LSTM 的遗忘门和输入门合二为一——「保留旧的」和「写入新的」用同一个门(一个比例)控制。
四、GRU 的状态更新
① z_t = σ(...) 更新门
② r_t = σ(...) 重置门
③ h̃_t = tanh(W · [r_t ⊙ h_{t-1}, x_t]) 候选新状态(重置门筛选历史)
④ h_t = (1 - z_t) ⊙ h_{t-1} + z_t ⊙ h̃_t 在旧状态和新候选间插值
核心是第④步的插值:h_t = (1-z_t)·旧状态 + z_t·新候选——更新门 z_t 像一个「混合比例」,决定这一步的隐藏状态多大程度上更新、多大程度上保持不变。z_t 接近 0 = 几乎保持旧状态(长期记忆,类似 LSTM 遗忘门≈1);z_t 接近 1 = 大幅采用新信息。这个「保持旧状态」的能力,就是 GRU 缓解梯度消失、记住长依赖的机制(和 LSTM 加法更新异曲同工)。
五、GRU vs LSTM:怎么选
结构差异总结:
- GRU 少一个门(2 vs 3)、少一套状态(合并 C 和 h)、在相同维度与常见实现下参数常少约 25%。
实践取舍:
- GRU 优势:参数少、计算快、训练省内存,在数据量较小、算力有限、追求速度时更合适(参数少也不易过拟合)。
- LSTM 特点:三个门和独立细胞状态提供不同的控制方式,但是否优于 GRU 取决于数据、隐藏宽度与优化配置。
- 效果通常相近:大量实验表明两者在多数任务上性能差不多,没有绝对赢家。
结论:没有定论,常两者都试;资源紧/序列不太长优先 GRU,任务复杂/序列很长可试 LSTM。
六、和 Transformer 的关系(补充)
无论 LSTM 还是 GRU,都是串行处理序列、无法并行,且长依赖仍不如注意力机制。所以在很多任务上,两者都已被 Transformer(自注意力、可并行、任意位置直连)取代(详见 RNN vs Transformer 专题)。但在小数据、流式、资源受限场景,GRU/LSTM 仍有用武之地。
七、参数量对比与更新门约定
沿用 D_x=3,D_h=4,常见 GRU 的 reset、update、candidate 三组参数共 3(D_xD_h+D_h²+D_h)=96;同尺寸 LSTM 为 128,正好少 25%。这个比例依赖隐藏维度相同、偏置计法相同且无 projection 等变体,不能当成所有框架的固定结论。
| 单元 | 参数组数 | 本例参数量 | 相对 LSTM |
|---|---|---|---|
| GRU | 3 | 96 | 75% |
| LSTM | 4 | 128 | 100% |
还要注意更新门约定:有的资料写 h_t=(1-z_t)h_{t-1}+z_t h̃_t,有的把 z 定义为保留旧状态的比例并交换两项。两种写法可通过 z↔1-z 对应,面试时应先说明采用哪种定义,再解释 z 接近 0 或 1 的含义。
易错点:不要脱离公式死背“z=1 是保留还是更新”;先看 z 在旧状态项前还是候选项前。
八、常见误区与追问
- 误区:GRU 在所有实现中都固定比 LSTM 少四分之一参数。 只有同维度、常见三组对四组仿射结构下近似成立。
- 误区:更新门 z 越大一定表示保留旧状态。 不同资料的 z 定义相反,必须结合状态更新公式判断。
- 追问:重置门作用在哪一步? 它控制计算候选状态时使用多少旧隐藏状态,不直接完成最终插值。
- 追问:GRU 为什么也能缓解梯度消失? 加性插值允许状态沿保留分支较少改写地传播。
- 追问:GRU 和 LSTM 如何公平比较? 分别调隐藏宽度、学习率与正则,并比较精度、延迟和内存。
九、加强记忆
GRU 是 LSTM 的简化版:只有 2 个门(vs LSTM 3 个)、没有独立细胞状态(合并 C 和 h 成一个 h)、同维度常见实现参数约少 25%,理论计算与状态内存也较少。两个门:重置门 r_t(算候选新状态时用多少历史,≈0 则忽略过去)、更新门 z_t(在旧状态和新候选间插值 h_t=(1-z_t)⊙h_{t-1}+z_t⊙h̃_t,合并了 LSTM 的遗忘门+输入门)。更新门让状态能「保持不变」从而缓解梯度消失、记长依赖(类比 LSTM 加法通路)。选择:效果通常相近,同维度下 GRU 可先作为较轻基线;LSTM 与 GRU 的最终选择应分别调优后比较。两者都串行不能并行,很多任务已被 Transformer 取代。