递归神经网络 (RNN) 的序列特性使其能够逐步处理序列,但在训练时会造成明显的障碍,尤其是对于深度网络或长序列。训练 RNN 的主要机制是时间反向传播 (BPTT),它本质上将递归网络沿序列长度展开,并应用标准的反向传播算法。这个过程涉及到通过对每个时间步重复应用链式法则反向传播,来计算损失函数相对于网络参数的梯度。考虑计算最终时间步 $T$ 处损失 $L$ 相对于某个较早时间步 $k$ 处隐藏状态 $h_k$ 的梯度。使用链式法则,这涉及将中间时间步的雅可比矩阵相乘:$$ \frac{\partial L}{\partial h_k} = \frac{\partial L}{\partial h_T} \frac{\partial h_T}{\partial h_{T-1}} \frac{\partial h_{T-1}}{\partial h_{T-2}} \dots \frac{\partial h_{k+1}}{\partial h_k} $$这个公式表明了核心问题。项 $ \frac{\partial h_t}{\partial h_{t-1}} $ 代表了时间 $t$ 的隐藏状态相对于时间 $t-1$ 的隐藏状态的变化方式。这个雅可比矩阵取决于循环权重矩阵 $W_{hh}$ 和循环转换中使用的激活函数的导数。来自最终损失的梯度信号必须通过这些雅可比矩阵的乘积反向传播。梯度消失如果这些雅可比矩阵 $ \frac{\partial h_t}{\partial h_{t-1}} $ 的范数(或更正式地说,奇异值)持续小于 1,它们的乘积在反向时间传播 ($T-k$ 步) 时会呈指数级缩小。$$ \frac{\partial L}{\partial h_k} \approx \frac{\partial L}{\partial h_T} \prod_{t=k+1}^{T} J_t \quad \text{这里 } J_t = \frac{\partial h_t}{\partial h_{t-1}} $$如果 $ ||J_t|| < 1 $ 平均而言,那么当 $T-k$ 增加时,$ || \prod_{t=k+1}^{T} J_t || $ 会非常迅速地趋近于零。这意味着梯度信号在到达较早的时间步之前就有效地消失了。影响:难以学习长程依赖: 网络难以学习序列中相距较远的输入和输出之间的关联。负责捕获这些长期效应(主要受来自早期时间步如 $k$ 的梯度影响)的权重获得的更新微乎其微。训练缓慢: 与序列开头相关的参数学习速度远慢于接近末尾的参数。双曲正切 (tanh) 或 Sigmoid 等激活函数的选择(这些在旧式 RNN 中常用)使这个问题更为严重,因为它们的导数严格小于 1(tanh 在单一点除外)。梯度爆炸相反,如果雅可比矩阵 $ \frac{\partial h_t}{\partial h_{t-1}} $ 的范数持续大于 1,它们的乘积在反向传播时会呈指数级增大。影响:训练不稳定: 梯度变得过大,导致权重的更新量巨大。这可能导致优化过程发散,常在计算中导致数值溢出(NaN,即“非数字”值)。破坏性更新: 即使训练没有完全发散,大的梯度更新也可能抹去先前学到的知识。虽然梯度爆炸通常更容易检测和缓解(例如,使用梯度裁剪,即当梯度超过某个阈值时将其缩小),但它们仍然对稳定训练构成明显挑战。{"layout": {"title": {"text": "梯度随时间传播示意图"}, "xaxis": {"title": {"text": "反向时间步 (T-k)"}}, "yaxis": {"title": {"text": "相对梯度幅度"}, "range": [0, 10]}, "template": "plotly_white", "legend": {"yanchor": "top", "y": 0.99, "xanchor": "left", "x": 0.01}, "margin": {"l": 20, "r": 20, "t": 40, "b": 20}, "height": 350}, "data": [{"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "y": [1.0, 0.8, 0.6400000000000001, 0.5120000000000001, 0.4096000000000001, 0.3276800000000001, 0.2621440000000001, 0.20971520000000012, 0.1677721600000001, 0.1342177280000001, 0.10737418240000008, 0.08589934592000007, 0.06871947673600006, 0.05497558138880005, 0.043980465111040046, 0.03518437208883204], "type": "scatter", "mode": "lines+markers", "name": "消失 (例如,||J|| = 0.8)", "line": {"color": "#1c7ed6"}}, {"x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "y": [1.0, 1.2, 1.44, 1.728, 2.0736, 2.48832, 2.985984, 3.5831808, 4.29981696, 5.159780351999999, 6.191736422399999, 7.430083706879999, 8.916100448255999, 10.699320537907198, 12.839184645488637, 15.407021574586364], "type": "scatter", "mode": "lines+markers", "name": "爆炸 (例如,||J|| = 1.2)", "line": {"color": "#f03e3e"}}]}该图显示了当梯度通过时间步反向传播时,重复乘以略小于 1 的值(蓝线,范数 0.8)会导致指数衰减(消失),而重复乘以略大于 1 的值(红线,范数 1.2)会导致指数增长(爆炸)。Y 轴被截断以呈现这两种趋势。这些梯度问题从根本上限制了简单 RNN 架构有效建模序列的能力,尤其是在存在长期模式时。这一限制是推动 LSTM 和 GRU 等更复杂循环单元发展的主要动力,我们将在接下来审视它们。