GRU
GRU 用重置门和更新门在旧状态与新候选之间平滑选择。
学习目标
- 更新门如何控制旧状态保留
- GRU 是否完全没有记忆状态?
- 说明:更新门的方向依赖公式约定;GRU 更简洁不等于对所有数据更优。
为什么需要这个概念
GRU 以重置门影响候选状态,以更新门混合旧状态与新候选。这里采用 PyTorch 约定:h=(1-z)×n+z×h_prev,因此 z 越大越保留旧状态。
学习前需要掌握
背景与问题
LSTM 的多组门和两种状态增加了复杂度。GRU 将记忆控制压缩到单一隐藏状态,并用更新门与重置门调节历史和候选内容的结合。
概念定义
GRU 以重置门影响候选状态,以更新门混合旧状态与新候选。这里采用 PyTorch 约定:h=(1-z)×n+z×h_prev,因此 z 越大越保留旧状态。
直观理解
更新门像混合旋钮,在旧笔记和新建议之间分配比例;重置门决定构造新建议时要参考多少旧笔记。
核心原理
重置门 r 与更新门 z 都依赖输入及前一状态。候选 n 使用 tanh,随后做逐元素混合。不同教材可能把更新门 z 的命名互补,比较公式时必须看它乘的是旧状态还是候选状态。
PyTorch 在候选分支采用重置门乘在隐藏线性变换结果上的实现,和某些原始公式把 r 先乘 h 再做矩阵变换不完全相同。迁移手写权重时,不能只按三个门的名字机械复制。
GRU 没有独立 c 状态,同 hidden size 下通常比 LSTM 参数少,但不保证在每种任务更快或更准确。长序列、padding、初始状态和跨样本重置仍与其他循环模型一样需要处理。
数学表达
核心公式
GRU 以重置门影响候选状态,以更新门混合旧状态与新候选。这里采用 PyTorch 约定:h=(1-z)×n+z×h_prev,因此 z 越大越保留旧状态。
变量含义
Nbatch sizeD/H特征或隐藏维度
计算步骤
- 1z=0.2 时输出 0.8×0.5+0.2×2=0.8。
- 2z=0.8 时输出 0.2×0.5+0.8×2=1.7。
代码对应位置
示例 1更新门如何控制旧状态保留的最小验证:使用完整构造输入核对更新门如何控制旧状态保留,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | batch size |
D/H | 特征或隐藏维度 |
完整数值示例
更新门如何控制旧状态保留
已知条件
- h_prev=2,候选 n=0.5
- 比较 z=0.2 和 z=0.8
计算步骤
- z=0.2 时输出 0.8×0.5+0.2×2=0.8。
- z=0.8 时输出 0.2×0.5+0.8×2=1.7。
计算结果
较大的 z 让结果更接近旧状态 2。
处理前后对比
- 更新门的方向依赖公式约定;GRU 更简洁不等于对所有数据更优。
更新门如何控制旧状态保留
这是给定门值的代数演示,不要求完整 GRU 先计算门。它能防止一个常见误读:看到“更新门大”就断言更新更多新信息,却没有检查公式约定。
z=1 时完全保留旧状态,z=0 时完全使用候选。候选本身已经通过重置门参考历史,所以“选择候选”也不等于完全忘记过去。
计算与实现步骤
- z=0.2 时输出 0.8×0.5+0.2×2=0.8。
- z=0.8 时输出 0.2×0.5+0.8×2=1.7。
代码实现
示例 1
更新门如何控制旧状态保留的最小验证
example_01.py用途:使用完整构造输入核对更新门如何控制旧状态保留,输出只表示本例计算。
import torch
h_prev, candidate = torch.tensor(2.), torch.tensor(0.5)
for z in [0.2, 0.8]:
h = (1 - z) * candidate + z * h_prev
print(f"z={z:.1f} hidden={h.item():.1f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对更新门如何控制旧状态保留,输出只表示本例计算。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
h_prev, candidate = torch.tensor(2.), torch.tensor(0.5)
for z in [0.2, 0.8]:
h = (1 - z) * candidate + z * h_prev
print(f"z={z:.1f} hidden={h.item():.1f}")预期输出或运行结果
z=0.2 hidden=0.8 z=0.8 hidden=1.7
常见错误 · 3 条
- 门公式命名方向混淆
- 认为总优于 LSTM
- padding 未处理
实际应用
- 资源受限的循环序列基线
- 比较门控模型的状态成本
常见错误
- 门公式命名方向混淆
- 认为总优于 LSTM
- padding 未处理
常见问题
GRU 是否完全没有记忆状态?
不是,它用隐藏状态本身承载记忆,只是没有 LSTM 那样单独的细胞状态 c。
这个示例能说明什么边界?
更新门的方向依赖公式约定;GRU 更简洁不等于对所有数据更优。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。