一、为什么需要 GRU?
因为 LSTM 虽然能够通过 Cell State 和三个门更好地处理长期依赖,但结构比较复杂、参数较多、计算成本也更高。GRU 希望用更简单的结构,实现类似的记忆控制能力。GRU 不是为了"解决 RNN 完全不同的问题",而是对 LSTM 的一种简化。
二、GRU 做了什么简化?
GRU 主要做了三个重要改变:
- 取消了独立的 Cell State
- 把记忆统一放进 Hidden State
- 把 LSTM 的多个门简化成两个主要门
LSTM
Cₜ
+
hₜ
+
3个门
GRU
hₜ
+
2个门
三、GRU 有哪两个门?
Update Gate 是干什么的?
Update Gate 决定上一时刻的 Hidden State 有多少应该保留,以及当前新的候选信息有多少应该加入。简单理解:旧记忆和新记忆,我到底更相信谁?
如果updat gate很大,更相信旧记忆,反之。
Reset Gate 是干什么的?
Update Gate 决定上一时刻的 Hidden State 有多少应该保留,以及当前新的候选信息有多少应该加入。简单理解:计算新记忆的时候,我还要不要参考过去?rt=0;基本不考虑过去,反之。
四、GRU 的核心结构
当前输入 xₜ
│
↓
┌──────────────┐
│ Reset Gate │
└──────┬───────┘
↓
过去信息要保留多少?
↓
候选 Hidden State
│
↓
┌──────────────┐
│ Update Gate │
└──────┬───────┘
↓
旧状态和新状态怎么组合?
↓
hₜ
五、我们手算一个简单例子
假设:
h(t-1) = 0.8
候选状态:
ht = 0.2
update gate
zt = 0.3
ht = 0.62(70% 旧状态 + 30% 新状态)
Update Gate 越小,越倾向于保留旧记忆。
Update Gate 越大,越倾向于更新成新的状态。
六、LSTM 和 GRU 对比
| LSTM | GRU | |
|---|---|---|
| Hidden State | ✅ | ✅ |
| Cell State | ✅ | ❌ |
| Forget Gate | ✅ | ❌ |
| Input Gate | ✅ | ❌ |
| Output Gate | ✅ | ❌ |
| Reset Gate | ❌ | ✅ |
| Update Gate | ❌ | ✅ |
| 结构复杂度 | 较高 | 较低 |
| 参数量 | 较多 | 较少 |
七、GRU 为什么不需要 Cell State?
因为 GRU 把长期记忆和当前隐藏状态统一到一个 Hidden State 中,不再像 LSTM 那样把 Cell State 和 Hidden State 分开维护。
八、GRU 一定比 LSTM 好吗?
GRU 并不是在所有任务上都优于 LSTM。两者都是门控循环网络,具体效果取决于数据、任务和训练设置。
九、现在看 RNN → LSTM → GRU
RNN
│
├── Hidden State
│
└── 问题:
长期依赖困难
↓
LSTM
│
├── Hidden State
├── Cell State
├── Forget Gate
├── Input Gate
└── Output Gate
↓
解决长期依赖
↓
GRU
│
├── Hidden State
├── Reset Gate
└── Update Gate
我们不应该只是关注这些名词,而是关注它背后的问题,发现问题->提出解决方案-> 发现新问题->继续改进