训练循环网络通常涉及一种称为时间反向传播 (BPTT) 的算法。你可以将其视为将循环网络沿着序列步骤“展开”。这会形成一个看起来非常深的前馈网络,但有一个特点:权重在所有时间步骤(展开视图中的层)之间共享。计算梯度时,误差信号必须从最终输出一直反向流经整个展开结构,直至初始步骤。在BPTT中,梯度反向传播通过可能许多时间步骤会带来显著的困难。两个最显著的问题是梯度消失问题和梯度爆炸问题。梯度消失梯度计算的核心思想是微积分中的链式法则。在BPTT中,损失函数相对于早期时间步骤的参数或隐藏状态(例如 $h_t$)的梯度,需要将许多雅可比矩阵(偏导数矩阵)相乘,每一步梯度反向流动都对应一个雅可比矩阵:$$ \frac{\partial L}{\partial h_t} \approx \frac{\partial L}{\partial h_T} \left( \prod_{k=t+1}^{T} \frac{\partial h_k}{\partial h_{k-1}} \right) $$每一项 $\frac{\partial h_k}{\partial h_{k-1}}$ 表示步骤 $k$ 的隐藏状态相对于步骤 $k-1$ 的隐藏状态如何变化。这取决于循环权重和所用激活函数的导数。如果这些雅可比矩阵中的值趋于很小(具体来说,如果它们的范数或主导特征值始终小于1),那么随着梯度在时间上向后传播得更远($T-t$ 增加),这个长矩阵乘积将呈指数级缩小。梯度在到达对应于更早时间步骤的层之前,会有效地“消失”到接近零的值。有什么影响? 网络无法学习序列中相距较远元素之间的关系。如果时间 $T$ 的输出在很大程度上依赖于更早时间 $t$ 的输入或状态,梯度消失会阻止误差信号有效传递到连接该早期输入的权重。网络在处理序列末尾时,基本上会忘记序列的开头。这严重限制了RNN模拟长距离依赖的能力,而这通常是处理长句子或扩展时间序列等顺序数据时的主要目标。梯度爆炸如果雅可比矩阵 $\frac{\partial h_k}{\partial h_{k-1}}$ 中的值持续很大(范数或主导特征值大于1),就会出现相反的问题。在这种情况下,随着梯度在时间上反向传播,长矩阵乘积呈指数级增长。梯度“爆炸”,达到极大的数值。{"layout": {"title": "BPTT中的梯度流", "xaxis": {"title": "反向时间步 (T-t)"}, "yaxis": {"title": "梯度幅值 (对数刻度)", "type": "log", "range": [-3, 3]}, "legend": {"traceorder": "normal"}}, "data": [{"type": "scatter", "mode": "lines", "name": "消失", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "y": [1.0, 0.8, 0.64, 0.51, 0.41, 0.33, 0.26, 0.21, 0.17, 0.13, 0.11], "line": {"color": "#4263eb"}}, {"type": "scatter", "mode": "lines", "name": "爆炸", "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "y": [1.0, 1.2, 1.44, 1.73, 2.07, 2.49, 2.99, 3.58, 4.30, 5.16, 6.19], "line": {"color": "#f03e3e"}}]}说明了梯度幅值在BPTT中随着反向时间步传播可能如何变化。梯度消失时幅值趋近于零,而梯度爆炸时幅值迅速增长。(注意:y轴是对数刻度)。这对训练意味着什么? 梯度爆炸会导致优化过程中网络权重更新过大。这会破坏学习过程的稳定性,常导致模型参数剧烈振荡或完全发散。您可能会观察到训练损失突然飙升或变为 NaN(非数字),因为值超过了标准浮点表示的限制。梯度爆炸通常比梯度消失更容易检测和缓解。一种常用技术是梯度裁剪,即在权重更新步骤之前,如果梯度总体范数超过预定义阈值,则手动将其按比例缩小。这可以防止导致训练不稳定的巨幅更新。尽管裁剪有助于解决梯度爆炸,但梯度消失问题对于试图学习长时序模式的简单RNN来说,仍然是一个更基础的障碍。训练基本RNN的这些固有困难,促使了更复杂循环架构的出现,例如长短期记忆网络 (LSTM) 和门控循环单元 (GRUs)。这些模型包含了门控机制,其专门设计用于更好地控制信息流和梯度在扩展序列上的传播,我们接下来将对此进行介绍。