关注一个序列
重置门和更新门
数学描述,对于给定的时间步 t,假设输入是一个小批量 Xt∈Rn×d (样本个数:n,输入个数:d),上一个时间步的隐藏状态是 Ht−1∈Rn×h(隐藏单元个数:h)。然后,重置门 Rt∈Rn×h 和更新门 Zt∈Rn×h 的计算如下:
Rt=σ(XtWxr+Ht−1Whr+br),Zt=σ(XtWxz+Ht−1Whz+bz),
其中 Wxr,Wxz∈Rd×h 和 Whr,Whz∈Rh×h 是权重参数,br,bz∈R1×h 是偏置参数。【都是可学习参数】
请注意,在求和过程中会触发广播机制。我们使用 sigmoid 函数将输入值转换到区间 (0,1)。
候选隐藏状态(重置门的应用)
接下来,让我们将重置门 Rt 与常规隐状态更新机制集成,得到在时间步 t 的候选隐藏状态 H~t∈Rn×h。
H~t=tanh(XtWxh+(Rt⊙Ht−1)Whh+bh),
:eqlabel:gru_tilde_H
其中 Wxh∈Rd×h 和 Whh∈Rh×h 是权重参数,bh∈R1×h 是偏置项,符号 ⊙ 是哈达码乘积(按元素乘积)运算符。在这里,我们使用 tanh 非线性激活函数来确保候选隐藏状态中的值保持在区间 (−1,1) 中。
计算的结果是 候选者(candidate),因为我们仍然需要结合更新门的操作。与 rnn 相比 :eqref:gru_tilde_H
中的 Rt 和 Ht−1 的元素相乘可以减少以往状态的影响。
每当重置门 Rt 中的项接近 1 时,我们恢复一个如 rnn 中的普通的循环神经网络。
对于重置门 Rt 中所有接近 0 的项,候选隐藏状态是以 Xt 作为输入的多层感知机的结果【即,丢弃过往信息】。因此,任何预先存在的隐藏状态都会被 重置 为默认值。
隐藏状态(更新门的应用)
最后,我们需要结合更新门 Zt 的效果。
这确定新的隐藏状态 Ht∈Rn×h 在多大程度上就是旧的状态 Ht−1 ,以及对新的候选状态 H~t 的使用量。
更新门 Zt 仅需要在 Ht−1 和 H~t 之间进行按元素的凸组合就可以实现这个目标。这就得出了门控循环单元的最终更新公式:
Ht=Zt⊙Ht−1+(1−Zt)⊙H~t.
每当更新门 Zt 接近 1 时,我们就只保留旧状态。此时,来自 Xt 的信息基本上被忽略,从而有效地跳过了依赖链条中的时间步 t。
相反,当 Zt 接近 0 时,新的隐藏状态 Ht 就会接近候选的隐藏状态 H~t。
这些设计可以帮助我们处理循环神经网络中的梯度消失问题,并更好地捕获时间步距离很长的序列的依赖关系。
例如,如果整个子序列的所有时间步的更新门都接近于 1,则无论序列的长度如何,在序列起始时间步的旧隐藏状态都将很容易保留并传递到序列结束。
总结
门控循环单元具有以下两个显著特征:
- 重置门有助于捕获序列中的短期依赖关系。
- 更新门有助于捕获序列中的长期依赖关系。