文章

33 训练一个使用了 Softmax 的分类器

33 训练一个使用了 Softmax 的分类器

🧠 一、Softmax 激活函数回顾

  Softmax 是用于多分类任务($C \geq 2$)的输出层激活函数,将线性输出 $z^{[L]} \in \mathbb{R}^C$ 转换为概率分布:

\[a^{[L]} = \text{Softmax}(z^{[L]}) = \frac{e^{z^{[L]}}}{\sum_{j=1}^C e^{z_j^{[L]}}}\]
  • 其中 $a^{[L]}j = \frac{e^{z_j^{[L]}}}{\sum{k=1}^C e^{z_k^{[L]}}}$,满足 $\sum_{j=1}^C a^{[L]}_j = 1$ 且 $a^{[L]}_j \in (0,1)$。
  • 若 $z^{[L]} = \begin{bmatrix} 5 \ 2 \ -1 \ 3 \end{bmatrix}$,则最大值对应类别(第1类)获得最高概率。

💡 Softmax vs Hardmax

  • Hardmax:输出为 one-hot 向量(如 $\begin{bmatrix}1\0\0\0\end{bmatrix}$),只保留最大值位置为1。
  • Softmax:输出平滑的概率分布,更“温和”,适合梯度优化。

🔁 二、Softmax 与 Logistic 回归的关系

  • 当类别数 $C = 2$ 时,Softmax 退化为 Logistic 回归
  • 原因:两个输出概率之和为1,只需计算一个(如 $p$ 和 $1-p$),其形式等价于 sigmoid 函数。
  • 因此,Softmax 是 Logistic 回归在多分类上的自然推广

📉 三、损失函数:交叉熵损失(Cross-Entropy Loss)

  对于单个训练样本 $(x^{(i)}, y^{(i)})$,真实标签 $y^{(i)}$ 为 one-hot 向量(如猫为第2类:$y = [0,1,0,0]^T$),模型预测为 $\hat{y} = a^{[L]}$。

单样本损失函数:

\[\mathcal{L}(\hat{y}, y) = -\sum_{j=1}^C y_j \log \hat{y}_j\]
  • 由于 $y$ 是 one-hot 向量,仅真实类别 $c$ 处 $y_c = 1$,其余为0。
  • 因此简化为:

    \[\mathcal{L}(\hat{y}, y) = -\log \hat{y}_c\]
  • 目标:最大化真实类别的预测概率 $\hat{y}_c$,即最小化 $-\log \hat{y}_c$。

✅ 这等价于 最大似然估计(Maximum Likelihood Estimation, MLE)

整个训练集的代价函数(平均损失):

  设训练集大小为 $m$,则总损失为:

\[J(W^{[1]}, b^{[1]}, \dots, W^{[L]}, b^{[L]}) = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(\hat{y}^{(i)}, y^{(i)})\]

🧮 四、向量化表示(Batch 计算)

  为高效训练,使用矩阵形式处理整个 batch:

  • 真实标签矩阵:$Y = \begin{bmatrix} y^{(1)} & y^{(2)} & \cdots & y^{(m)} \end{bmatrix} \in \mathbb{R}^{C \times m}$
  • 预测概率矩阵:$\hat{Y} = \begin{bmatrix} \hat{y}^{(1)} & \hat{y}^{(2)} & \cdots & \hat{y}^{(m)} \end{bmatrix} \in \mathbb{R}^{C \times m}$

  此时总损失可向量化计算(常借助 np.sum(Y * np.log(Y_hat)) 实现)。


🔁 五、反向传播关键公式

  在 Softmax 输出层,反向传播所需的梯度为:

\[dz^{[L]} = \frac{\partial \mathcal{L}}{\partial z^{[L]}} = \hat{y} - y\]
  • 对于单个样本:$dz^{[L]} \in \mathbb{R}^C$
  • 对于 batch:$dZ^{[L]} = \hat{Y} - Y \in \mathbb{R}^{C \times m}$

✅ 这是 Softmax + 交叉熵组合下的简洁梯度形式,极大简化了实现。

推导提示:利用 Softmax 导数与交叉熵的链式法则,可得该结果(课程建议自行推导加深理解)。

  有了 $dz^{[L]}$,即可继续反向传播到前面各层,更新所有参数。


⚙️ 六、实际训练中的注意事项

  • 在现代深度学习框架(如 TensorFlow、PyTorch)中:

    • 只需定义前向传播(包括 Softmax 输出);
    • 框架会自动计算梯度(包括 $dz^{[L]} = \hat{y} - y$);
    • 通常不显式实现 Softmax + 交叉熵分开,而是使用 softmax_cross_entropy_with_logits(TF)或 CrossEntropyLoss(PyTorch),后者内部数值更稳定(避免 log(0))。

💡 数值稳定性技巧:实际计算 Softmax 时,常减去最大值:

\[\text{Softmax}(z)_j = \frac{e^{z_j - \max(z)}}{\sum_k e^{z_k - \max(z)}}\]

防止指数溢出。


✅ 总结要点

内容关键点
Softmax 作用将 logits 转为概率分布,适用于 $C$ 类分类
与 Logistic 关系$C=2$ 时等价于 Logistic 回归
损失函数交叉熵:$\mathcal{L} = -\sum y_j \log \hat{y}_j$
优化目标最大化真实类别的预测概率
反向传播梯度$dz^{[L]} = \hat{y} - y$(极其简洁!)
工程实践使用框架内置的 softmax + cross-entropy 联合函数
本文由作者按照 CC BY 4.0 进行授权