1. 多類分類(Multi-class Classification)
定義
多類分類是指目標變量(標簽)有超過兩個類別的分類任務。例如:
- 手寫數字識別:10個類別(0~9)。
- 圖像分類:區分貓、狗、鳥等。
- 新聞主題分類:政治、經濟、體育等。
特點
- 互斥性:每個樣本僅屬于一個類別(區別于多標簽分類)。
- 輸出要求:模型需輸出每個類別的概率分布,且概率之和為1。
實現方式
- One-vs-Rest (OvR):訓練K個二分類器(K為類別數),每個分類器判斷“是否屬于該類”。
- Softmax回歸:直接輸出多類概率分布(更高效,主流方法)。
2. Softmax函數
定義
Softmax將神經網絡的原始輸出(logits)轉換為概率分布,公式為:
[
\sigma(\mathbf{z})_i = \frac{e{z_i}}{\sum_{j=1}K e^{z_j}}}, \quad i = 1, \dots, K
]
- ( \mathbf{z} ):神經網絡的原始輸出向量(logits)。
- ( K ):類別總數。
- 輸出:每個類別的概率 ( \sigma(\mathbf{z})i \in (0,1) ),且 ( \sum{i=1}^K \sigma(\mathbf{z})_i = 1 )。
示例
假設神經網絡對3個類別的原始輸出為 ( \mathbf{z} = [2.0, 1.0, 0.1] ):
[
\begin{aligned}
\sigma(\mathbf{z})_1 &= \frac{e{2.0}}{e{2.0} + e^{1.0} + e^{0.1}}} \approx 0.659 \
\sigma(\mathbf{z})_2 &= \frac{e{1.0}}{e{2.0} + e^{1.0} + e^{0.1}}} \approx 0.242 \
\sigma(\mathbf{z})_3 &= \frac{e{0.1}}{e{2.0} + e^{1.0} + e^{0.1}}} \approx 0.099 \
\end{aligned}
]
最終概率分布:[0.659, 0.242, 0.099]
→ 預測為第1類。
特性
- 放大差異:較大的 ( z_i ) 會獲得顯著更高的概率。
- 數值穩定:實際計算時,通常減去最大值(( z_i - \max(\mathbf{z}) ))避免數值溢出。
exp_z = np.exp(z - np.max(z, axis=1, keepdims=True)) softmax = exp_z / np.sum(exp_z, axis=1, keepdims=True)
3. Softmax與交叉熵損失
組合使用
- Softmax:將logits轉為概率。
- 交叉熵損失(Cross-Entropy Loss):衡量預測概率與真實標簽的差異。
反向傳播
Softmax與交叉熵的梯度計算被合并優化,梯度形式簡潔:
[
\frac{\partial J}{\partial z_i} = \hat{y}_i - y_i
]
- 梯度直接反映預測與真實的差異。
4. 代碼實現
(1) Python(NumPy)
import numpy as npdef softmax(z):exp_z = np.exp(z - np.max(z, axis=1, keepdims=True)) # 防溢出return exp_z / np.sum(exp_z, axis=1, keepdims=True)# 示例:3個樣本,4個類別
logits = np.array([[1.0, 2.0, 3.0, 4.0],[0.5, 1.0, 2.0, 3.0],[-1.0, 0.0, 1.0, 2.0]])
probabilities = softmax(logits)
print("概率分布:\n", probabilities)
(2) PyTorch
import torch
import torch.nn as nnlogits = torch.tensor([[1.0, 2.0, 3.0], [0.1, 0.2, 0.3]])
softmax = nn.Softmax(dim=1)
probabilities = softmax(logits)
print(probabilities)
(3) TensorFlow/Keras
from tensorflow.keras.layers import Softmaxlogits = tf.constant([[1.0, 2.0, 3.0], [0.1, 0.2, 0.3]])
softmax = Softmax(axis=-1)
probabilities = softmax(logits)
print(probabilities.numpy())
5. 多類分類 vs 二分類
任務類型 | 輸出層激活函數 | 損失函數 | 標簽格式 |
---|---|---|---|
二分類 | Sigmoid | 二元交叉熵 | 0或1 |
多類分類 | Softmax | 分類交叉熵 | One-hot編碼 |
6. 常見問題
Q1:為什么Softmax輸出概率和為1?
- 設計目的即為生成概率分布,便于直觀解釋和優化。
Q2:Softmax和Sigmoid的區別?
- Sigmoid:用于二分類,獨立計算每個類別的概率(可非互斥)。
- Softmax:用于多分類,強制所有類別概率和為1(互斥)。
Q3:如何處理類別不平衡?
- 加權交叉熵:為少數類賦予更高權重。
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'],class_weight={0: 1, 1: 2, 2: 1}) # 類別1的權重加倍
7. 總結
-
多類分類:目標變量有多個互斥類別,需輸出概率分布。
-
Softmax:將logits轉換為歸一化概率,與交叉熵損失配合使用。
-
關鍵公式:
-
實踐建議:
- 輸出層用Softmax,隱藏層用ReLU。
- 標簽需為one-hot編碼(或稀疏類別標簽)。