Schwertlilien
As a recoder: notes and ideas.

2025-4-23-梯度消失/爆炸

梯度消失与梯度爆炸的定义

梯度消失(Vanishing Gradient)

  • 现象:反向传播中,梯度随着网络层数或时间步长增加而指数级减小,导致浅层参数更新缓慢,模型无法学习底层特征。
  • 案例:深层CNN或长序列RNN中,浅层权重几乎不更新。

梯度爆炸(Exploding Gradient)

  • 现象:反向传播中,梯度指数级增大,导致参数剧烈震荡,模型无法收敛(如权重变为NaN)。
  • 案例:未使用梯度裁剪的深层RNN,参数更新时出现数值不稳定。
现象 核心原因 常见模型 解决方法
梯度消失 激活函数导数小于 1 + 权重矩阵谱半径小于 1 的连乘 RNN、传统神经网络 换用 ReLU 激活函数、残差连接、LSTM/GRU
梯度爆炸 权重矩阵谱半径大于 1 的连乘 + 无界激活函数 LSTM、普通神经网络 梯度裁剪(Gradient Clipping)、权重初始化、正则化

关于softmax输出“尖锐”导致梯度消失的问题

假设点积结果为一个很大的正数 \(s\),softmax公式为:
\[ \text{softmax}(s_i) = \frac{e^{s_i}}{\sum_j e^{s_j}} \] 当某一位置的 \(s_i\) 远大于其他值时(如 \(s_i = 100\),其他 \(s_j = 0\)),\(e^{100}\) 会远大于其他项的和,导致 \(\text{softmax}(s_i) \approx 1\),其他位置趋近于0。此时输出概率分布非常“集中”(尖锐)。

softmax梯度推导

\(\text{softmax}(s_i) = p_i\),则:
\[ \frac{\partial p_i}{\partial s_j} = p_i (\delta_{ij} - p_j) \] 其中 \(\delta_{ij}=1\)\(i=j\),否则为0。
对于交叉熵损失 \(L = -\sum_k y_k \log p_k\),梯度为: (当\(k=j\)时,\(p_jy_k=p_j,\delta_{kj}=1\)) \[ \frac{\partial L}{\partial s_j} = \sum_k \frac{-y_k}{p_k} \cdot \frac{\partial p_k}{\partial s_j} = \sum_k -y_k (\delta_{kj} - p_j) = p_j - y_j \] 当真实标签 \(y_j=1\) 时,梯度为 \(p_j - 1\);当 \(y_j=0\) 时,梯度为 \(p_j\)
\(p_j \approx 1\)(尖锐分布),则两种情况的梯度均趋近于0。

以二元分类为例,假设softmax输出为 \([p, 1-p]\),真实标签为 \([1, 0]\),损失函数为交叉熵:

梯度为 \(\frac{\partial L}{\partial s_i} = p - 1\)

  • \(p \approx 1\) 时,梯度 \(\approx 0\),参数更新极慢;
  • 其他位置(如 \(s_j\))的梯度为 \(\frac{\partial L}{\partial s_j} = p\),也趋近于0。
    结果:无论最大值位置还是其他位置,梯度都趋近于0,导致模型难以更新参数,即梯度消失

RNN梯度消失

在 RNN 中,每个时间步的隐藏状态依赖于前一个时间步的隐藏状态,所以在反向传播时,梯度需要从最后一个时间步一直传回第一个时间步,这中间会经过多个时间步的权重矩阵乘法。 \[ h_t = tanh (W_xh x_t + W_hh h_{t-1} + b)\\ \delta_t = \frac{\partial L}{\partial h_t},\delta_{t-1} = \delta_t \cdot W_{hh}^T \cdot \text{tanh}'(h_t)\\ \] 传统的 RNN 可能使用 tanh 或 sigmoid 激活函数,它们的导数在输出接近饱和区时会变得很小,接近 0。当多个这样的导数相乘时,梯度就会指数级衰减,导致前面时间步的梯度几乎为 0,无法更新参数。

LSTM梯度爆炸

LSTM 通过门控机制(输入门 \(i_t\)、遗忘门 \(f_t\)、输出门 \(o_t\))来控制信息的流动,理论上可以缓解梯度消失问题,因为门控机制中的 sigmoid 函数输出接近 0 或 1,当门接近 1 时,信息可以几乎不变地传递,梯度也能较好地保留。

如果 LSTM 中的权重矩阵过大,或者在训练过程中权重变得过大,那么在反向传播时,梯度可能会指数级增长,导致梯度爆炸。此外,LSTM 虽然缓解了梯度消失,但并没有完全解决梯度爆炸的问题,尤其是在没有适当正则化或梯度裁剪的情况下。

\[ C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t\\ f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f),f_t\in(0, 1) \]

在反向传播时,细胞状态 \(C_{t-1}\) 的梯度: \[ \frac{\partial L}{\partial C_{t-1}} = \frac{\partial L}{\partial C_t} \cdot f_t + \cdots \]\(f_t \approx 1\)(遗忘门打开),梯度可直接传递至 \(C_{t-1}\)缓解了梯度消失(因无需经过激活函数导数的连乘)。

梯度爆炸的原因

  1. 权重矩阵的无界性:LSTM 中的权重矩阵 \(W_f, W_i, W_o, W_c\) 若初始化过大或训练中更新至过大值,会导致门控信号或细胞状态的计算值过大,进而在反向传播时使梯度指数级放大。
  2. 无激活函数约束的路径:细胞状态 \(C_t\) 的更新中,\(f_t \odot C_{t-1}\) 部分虽受门控控制,但 \(i_t \odot \tilde{C}_t\) 中的 \(\tilde{C}_t = \text{tanh}(W_c \cdot [h_{t-1}, x_t] + b_c)\) 仍涉及权重矩阵 \(W_c\),若 \(W_c\) 过大,\(\tilde{C}_t\) 的梯度可能因 \(W_c\) 的连乘而爆炸。
  3. 与 RNN 的本质区别:RNN 的梯度消失源于激活函数导数的衰减,而 LSTM 的梯度爆炸源于权重矩阵的无约束增长(类似普通神经网络的梯度爆炸)。
搜索
匹配结果数:
未搜索到匹配的文章。