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 进行授权