梯度爆炸通过裁剪梯度进行控制,但是矩阵的长乘积会导致梯度消失或发散。梯度消失在实践中的含义:
- 我们可能会遇到这样的情况,早期观察对于预测所有将来的观察非常重要。第一token的影响至关重要,希望通过一些机制可以讲重要的早期信息存储在存储单元中。如果没有这种机制的话,一直传递下去会分配非常大的梯度。
- 可能会遇到某些符号没有观察结果的情况。例如在解析网页的时候,可能会存在用于评估页面上传达的情感无关的HTML代码,我们希望有一些机制可以跳过这些无关的符号。
- 可能会遇到序列各个部分之间存在逻辑中断的情况。例如,一本书各个章节之间的过渡,股市熊市和牛市之间的过渡。在这种情况下,最好有一种重置内部状态的机制。
目前已经有很多方法拉解决此类问题。最早的一种是长短期记忆(LSTM)。门控循环单元(GRU)是一种变体,通常可以提供足够的性能,并且计算速度更快。
1. 门控隐藏状态
GRU和常规RNN的主要区别在于,GRU支持隐藏状态的门控。也就是说具有专门的机制可以确定隐藏状态的更新和重置。这些机制可以解决上面列举的问题:
- 如果第一个token非常重要,那么可以使第一次观测后不再更新隐藏状态
- 可以学习跳过无关的观察如HTML代码
- 以及可以学习在需要的时候对隐藏状态进行重置
1.1 重置门和更新门
GRU中复位门和更新门的输入 X t X_t Xt 和上一个时间步的隐藏状态 H t − 1 H_{t−1} Ht−1 。输出由具有S形作为其激活功能的全连接层给出。
对于一个时间步长 t t t, 最小的批量输入为 X t ∈ R n × d \mathbf{X}_t \in \mathbb{R}^{n \times d} Xt∈Rn×d (样本数: n n n, 输入数: d d d) 最后一步的隐藏状态为 H t − 1 ∈ R n × h \mathbf{H}_{t-1} \in \mathbb{R}^{n \times h} Ht−1∈Rn×h (隐藏状态数为: h h h). 重置门 R t ∈ R n × h \mathbf{R}_t \in \mathbb{R}^{n \times h} Rt∈Rn×h, 更新门 Z t ∈ R n × h \mathbf{Z}_t \in \mathbb{R}^{n \times h} Zt∈Rn×h 计算如下:
R t = σ ( X t W x r + H t − 1 W h r + b r ) , Z t = σ ( X t W x z + H t − 1 W h z + b z ) . \begin{aligned} \mathbf{R}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xr} + \mathbf{H}_{t-1} \mathbf{W}_{hr} + \mathbf{b}_r),\\ \mathbf{Z}_t = \sigma(\mathbf{X}_t \mathbf{W}_{xz} + \mathbf{H}_{t-1} \mathbf{W}_{hz} + \mathbf{b}_z). \end{aligned} Rt=σ(XtWxr+Ht−1Whr+br),Zt=σ(XtW