网课学习:https://haoailab.com/cse234-w25/
Week2 autodiff 章节问题推导
Softmax Cross-Entropy Loss — 前向与梯度计算
1. 问题设定
给定一个分类任务,共有 C 个类别。对于一个样本,模型输出 logits 向量 \mathbf{x} \in \mathbb{R}^{C},真实标签为 t \in \{0, 1, \dots, C-1\}(也可用 one-hot 向量 \mathbf{t} \in \{0,1\}^{C} 表示)。
2. 前向传播 (Forward Pass)
2.1 Softmax 激活
其中 y_i 表示模型对第 i 类的预测概率,满足 \sum_i y_i = 1 且 y_i > 0。
2.2 交叉熵损失 (Cross-Entropy Loss)
对于单个样本(真实标签为类别 t):
由于 t_i 是 one-hot 向量(只有 t_t = 1,其余为 0),因此损失简化为仅对真实类别 t 的负对数似然:
3. 反向传播 (Backward Pass / 梯度计算)
我们需要计算损失 L 关于 logits \mathbf{x} 的梯度:\frac{\partial L}{\partial x_i}。
3.1 分情况推导
Softmax 函数关于 x_i 的偏导数为,令 e_{x_i} = u_i,T = \sum_{d=1}^{C} e^{x_d}
当 i\neq j 时,
当 i = j 时,
因此:
利用链式法则:
其中 \frac{\partial L}{\partial y_j} = -\frac{t_j}{y_j}。
代入后:
3.2 最终梯度公式
简洁而优雅的结果:
即:预测概率减去真实概率。
4. 直观理解
| 情况 | y_i | t_i | 梯度 \frac{\partial L}{\partial x_i} | 含义 |
|---|---|---|---|---|
| 正确类别 (i=t) | \approx 1 | 1 | \approx 0 | 预测正确,无需更新 |
| 正确类别 (i=t) | \approx 0 | 1 | \approx -1 | 预测错误,需要增大 x_t |
| 错误类别 (i \neq t) | \approx 0 | 0 | \approx 0 | 预测正确,无需更新 |
| 错误类别 (i \neq t) | \approx 1 | 0 | \approx 1 | 预测错误,需要减小 x_i |
5. 数值稳定性技巧 (Numerical Stability)
直接计算 e^{x_i} 容易溢出。实践中先减去最大值:
损失函数相应地变为:
梯度不变,因为减去常数不影响 softmax 输出:
6. 批量形式的矩阵表示
对于大小为 N 的 batch,logits 矩阵 \mathbf{X} \in \mathbb{R}^{N \times C}:
梯度:
总结
graph LR
A["Logits
x ∈ ℝC"] -->|softmax| B["Probabilities
y ∈ ℝC"]
B -->|"CE Loss
L = -Σ tᵢ log(yᵢ)"| C["Loss
L ∈ ℝ"]
C -->|"∂L/∂xᵢ = yᵢ - tᵢ"| D["Gradient
∇ ∈ ℝC"]
核心结论: Softmax + Cross-Entropy 组合的梯度计算极其简洁——\frac{\partial L}{\partial x_i} = y_i - t_i,这也是为什么这个组合在分类任务中如此流行的原因之一。