【机器学习笔记 Ⅱ】7 多类分类

发布于:2025-07-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

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类。

特性

  1. 放大差异:较大的 ( z_i ) 会获得显著更高的概率。
  2. 数值稳定:实际计算时,通常减去最大值(( 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 np

def 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 nn

logits = 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 Softmax

logits = 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编码(或稀疏类别标签)。

网站公告

今日签到

点亮在社区的每一天
去签到