递归神经网络 (neural network) (RNN) 的序列特性使其能够逐步处理序列,但在训练时会造成明显的障碍,尤其是对于深度网络或长序列。训练 RNN 的主要机制是时间反向传播 (backpropagation) (BPTT),它本质上将递归网络沿序列长度展开,并应用标准的反向传播算法。这个过程涉及到通过对每个时间步重复应用链式法则反向传播,来计算损失函数 (loss function)相对于网络参数 (parameter)的梯度。
考虑计算最终时间步 T 处损失 L 相对于某个较早时间步 k 处隐藏状态 hk 的梯度。使用链式法则,这涉及将中间时间步的雅可比矩阵相乘:
∂hk∂L=∂hT∂L∂hT−1∂hT∂hT−2∂hT−1…∂hk∂hk+1
这个公式表明了核心问题。项 ∂ht−1∂ht 代表了时间 t 的隐藏状态相对于时间 t−1 的隐藏状态的变化方式。这个雅可比矩阵取决于循环权重 (weight)矩阵 Whh 和循环转换中使用的激活函数 (activation function)的导数。来自最终损失的梯度信号必须通过这些雅可比矩阵的乘积反向传播。
梯度消失
如果这些雅可比矩阵 ∂ht−1∂ht 的范数(或更正式地说,奇异值)持续小于 1,它们的乘积在反向时间传播 (T−k 步) 时会呈指数级缩小。
∂hk∂L≈∂hT∂Lt=k+1∏TJt这里 Jt=∂ht−1∂ht
如果 ∣∣Jt∣∣<1 平均而言,那么当 T−k 增加时,∣∣∏t=k+1TJt∣∣ 会非常迅速地趋近于零。这意味着梯度信号在到达较早的时间步之前就有效地消失了。
影响:
- 难以学习长程依赖: 网络难以学习序列中相距较远的输入和输出之间的关联。负责捕获这些长期效应(主要受来自早期时间步如 k 的梯度影响)的权重 (weight)获得的更新微乎其微。
- 训练缓慢: 与序列开头相关的参数 (parameter)学习速度远慢于接近末尾的参数。
双曲正切 (tanh) 或 Sigmoid 等激活函数 (activation function)的选择(这些在旧式 RNN 中常用)使这个问题更为严重,因为它们的导数严格小于 1(tanh 在单一点除外)。
梯度爆炸
相反,如果雅可比矩阵 ∂ht−1∂ht 的范数持续大于 1,它们的乘积在反向传播 (backpropagation)时会呈指数级增大。
影响:
- 训练不稳定: 梯度变得过大,导致权重 (weight)的更新量巨大。这可能导致优化过程发散,常在计算中导致数值溢出(NaN,即“非数字”值)。
- 破坏性更新: 即使训练没有完全发散,大的梯度更新也可能抹去先前学到的知识。
虽然梯度爆炸通常更容易检测和缓解(例如,使用梯度裁剪,即当梯度超过某个阈值时将其缩小),但它们仍然对稳定训练构成明显挑战。
该图显示了当梯度通过时间步反向传播时,重复乘以略小于 1 的值(蓝线,范数 0.8)会导致指数衰减(消失),而重复乘以略大于 1 的值(红线,范数 1.2)会导致指数增长(爆炸)。Y 轴被截断以呈现这两种趋势。
这些梯度问题从根本上限制了简单 RNN 架构有效建模序列的能力,尤其是在存在长期模式时。这一限制是推动 LSTM 和 GRU 等更复杂循环单元发展的主要动力,我们将在接下来审视它们。