1. 引言

深度学习作为机器学习的一个重要分支,近年来在图像识别、自然语言处理、语音识别等领域取得了突破性进展。在众多应用场景中,回归(Regression)与分类(Classification)是最基础也最核心的两类任务。无论是预测房价、股票价格,还是识别图片中的物体、判断邮件是否为垃圾邮件,本质上都可以归结为回归或分类问题。

本文将系统性地介绍深度学习中的回归与分类问题,包括它们的基本概念、核心区别、常用模型结构、损失函数、评估指标以及实际应用场景,帮助读者建立完整的知识框架。

2. 回归与分类的基本概念

2.1 什么是回归问题

回归问题是指预测连续数值型输出的任务。其目标是学习一个从输入特征到连续输出的映射函数,输出值可以是任意实数。

典型应用场景包括:

  • 房价预测:根据面积、位置、房龄等特征预测房价
  • 股票价格预测:根据历史数据预测未来股价
  • 温度预测:根据气象数据预测未来温度
  • 销售额预测:根据历史销售数据预测未来销量

2.2 什么是分类问题

分类问题是指预测离散类别标签的任务。其目标是将输入样本划分到预定义的类别中,输出是有限的类别集合。

分类问题根据类别数量可分为:

  • 二分类:只有两个类别,如垃圾邮件判断(是/否)、疾病检测(患病/健康)
  • 多分类:多个互斥类别,如图像识别(猫/狗/鸟/鱼)、手写数字识别(0-9)
  • 多标签分类:一个样本可同时属于多个类别,如一篇新闻可同时标注为"科技"和"国际"

2.3 回归与分类的核心区别

维度回归问题分类问题
输出类型连续数值离散类别
输出范围任意实数有限类别集合
损失函数MSE、MAE 等交叉熵、Hinge 等
输出层激活函数无(或线性)Sigmoid / Softmax
评估指标R²、MAE、RMSE准确率、精确率、召回率
典型应用预测、估计识别、判别

3. 深度学习解决回归问题

3.1 回归问题的网络结构

解决回归问题的神经网络通常采用以下结构:

  • 输入层:接收特征向量
  • 隐藏层:一个或多个全连接层(或卷积层、循环层等),通过非线性激活函数(如 ReLU)提取特征
  • 输出层:单个神经元,不使用激活函数(或使用线性激活),直接输出预测值

3.2 回归问题的损失函数

回归问题常用的损失函数包括:

均方误差(MSE)

MSE=1n∑i=1n(yi−y^i)2MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2MSE=n1​i=1∑n​(yi​−y^​i​)2

MSE 对异常值敏感,因为误差被平方放大。

平均绝对误差(MAE)

MAE=1n∑i=1n∣yi−y^i∣MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|MAE=n1​i=1∑n​∣yi​−y^​i​∣

MAE 对异常值更鲁棒,但梯度在零点不可导。

Huber Loss

Lδ(y,y^)={12(y−y^)2∣y−y^∣≤δδ(∣y−y^∣−12δ)otherwiseL_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & |y - \hat{y}| \le \delta \\ \delta(|y - \hat{y}| - \frac{1}{2}\delta) & \text{otherwise} \end{cases}Lδ​(y,y^​)={21​(y−y^​)2δ(∣y−y^​∣−21​δ)​∣y−y^​∣≤δotherwise​

Huber Loss 结合了 MSE 和 MAE 的优点,对异常值鲁棒且梯度平滑。

3.3 回归问题的评估指标

  • R²(决定系数):衡量模型解释方差的比例,取值范围 (−∞,1](-\infty, 1](−∞,1],越接近 1 越好
  • RMSE(均方根误差):MSE 的平方根,与原始数据同量纲
  • MAE:平均绝对误差,直观反映平均预测偏差

3.4 回归问题代码示例

import torch
import torch.nn as nn
import torch.optim as optim

# 定义回归网络
class RegressionNet(nn.Module):
    def __init__(self, input_dim):
        super(RegressionNet, self).__init__()
        self.fc1 = nn.Linear(input_dim, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, 1)  # 输出层:单神经元,无激活函数
        
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)  # 直接输出预测值
        return x

# 训练示例
model = RegressionNet(input_dim=10)
criterion = nn.MSELoss()  # 均方误差损失
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 假设已有训练数据 X, y
# for epoch in range(100):
#     optimizer.zero_grad()
#     pred = model(X)
#     loss = criterion(pred, y)
#     loss.backward()
#     optimizer.step()

4. 深度学习解决分类问题

4.1 分类问题的网络结构

分类问题的神经网络结构:

  • 输入层:接收样本特征
  • 隐藏层:特征提取层,结构与回归类似
  • 输出层:
    • 二分类:单个神经元 + Sigmoid 激活函数,输出属于正类的概率
    • 多分类:K 个神经元 + Softmax 激活函数,输出各类别的概率分布

4.2 分类问题的损失函数

二分类交叉熵(Binary Cross-Entropy)

L=−1n∑i=1n[yilog⁡(y^i)+(1−yi)log⁡(1−y^i)]L = -\frac{1}{n}\sum_{i=1}^{n}[y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]L=−n1​i=1∑n​[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]

多分类交叉熵(Categorical Cross-Entropy)

L=−1n∑i=1n∑k=1Kyiklog⁡(y^ik)L = -\frac{1}{n}\sum_{i=1}^{n}\sum_{k=1}^{K} y_{ik} \log(\hat{y}_{ik})L=−n1​i=1∑n​k=1∑K​yik​log(y^​ik​)

其中 KKK 为类别数,yiky_{ik}yik​ 为第 iii 个样本属于第 kkk 类的真实标签(one-hot 编码),y^ik\hat{y}_{ik}y^​ik​ 为预测概率。

4.3 分类问题的评估指标

  • 准确率(Accuracy):预测正确的样本比例
  • 精确率(Precision):预测为正类的样本中真正为正类的比例
  • 召回率(Recall):真正为正类的样本中被正确预测的比例
  • F1-Score:精确率和召回率的调和平均数
  • AUC-ROC:衡量分类器在不同阈值下的综合性能

4.4 分类问题代码示例

import torch
import torch.nn as nn
import torch.optim as optim

# 定义分类网络(多分类)
class ClassificationNet(nn.Module):
    def __init__(self, input_dim, num_classes):
        super(ClassificationNet, self).__init__()
        self.fc1 = nn.Linear(input_dim, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, num_classes)  # 输出层:K 个神经元
        
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)  # 原始 logits,训练时配合 CrossEntropyLoss
        return x

# 训练示例
model = ClassificationNet(input_dim=10, num_classes=3)
criterion = nn.CrossEntropyLoss()  # 交叉熵损失(内部包含 Softmax)
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 假设已有训练数据 X, y(y 为类别索引)
# for epoch in range(100):
#     optimizer.zero_grad()
#     logits = model(X)
#     loss = criterion(logits, y)
#     loss.backward()
#     optimizer.step()

5. 回归与分类的进阶话题

5.1 从回归到分类的转化

在某些场景下,回归问题可以转化为分类问题。例如:

  • 将连续的温度值离散化为"低温/常温/高温"三个类别
  • 将房价预测转化为"低价/中价/高价"分类

这种转化虽然简化了问题,但会丢失部分信息,通常不推荐。

5.2 从分类到回归的转化

反之,分类问题也可以转化为回归问题。例如:

  • 将类别标签编码为数值(如 0、1、2),用回归模型预测
  • 但这种方式会引入类别间的顺序关系,可能误导模型

5.3 多任务学习

在实际应用中,回归和分类常常同时出现在一个模型中。例如:

  • 目标检测:同时预测物体的类别(分类)和边界框坐标(回归)
  • 自动驾驶:同时预测车辆位置(回归)和交通信号(分类)

这种多任务学习可以共享特征提取层,提高模型效率和泛化能力。

5.4 不平衡分类问题

当类别样本数量严重不均衡时(如罕见病检测),需要特殊处理:

  • 重采样:过采样少数类或欠采样多数类
  • 加权损失:为少数类分配更高的损失权重
  • Focal Loss:聚焦难分类样本,降低易分类样本的权重

6. 实际应用案例

6.1 回归应用:房价预测

# 使用 PyTorch 构建房价预测模型
import torch
import torch.nn as nn

class HousePriceModel(nn.Module):
    def __init__(self):
        super(HousePriceModel, self).__init__()
        self.net = nn.Sequential(
            nn.Linear(13, 64),
            nn.ReLU(),
            nn.Linear(64, 32),
            nn.ReLU(),
            nn.Linear(32, 1)
        )
    
    def forward(self, x):
        return self.net(x)

6.2 分类应用:手写数字识别

# 使用 PyTorch 构建 MNIST 分类模型
import torch
import torch.nn as nn

class DigitClassifier(nn.Module):
    def __init__(self):
        super(DigitClassifier, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
        self.fc1 = nn.Linear(64 * 12 * 12, 128)
        self.fc2 = nn.Linear(128, 10)  # 10 个数字类别
        
    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.max_pool2d(x, 2)
        x = torch.relu(self.conv2(x))
        x = torch.max_pool2d(x, 2)
        x = x.view(x.size(0), -1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

7. 总结

回归与分类是深度学习的两个基础任务类型,它们的核心区别在于输出的性质:

  • 回归预测连续数值,使用 MSE/MAE 等损失函数,输出层无激活函数
  • 分类预测离散类别,使用交叉熵损失函数,输出层使用 Sigmoid/Softmax

在实际工程中,两者常常结合使用(如多任务学习)。理解它们的本质区别和适用场景,是构建有效深度学习模型的基础。建议读者通过实际项目练习,加深对这两类问题的理解。

8. 参考资料

  • 《Deep Learning》— Ian Goodfellow
  • PyTorch 官方文档:https://pytorch.org/docs/
  • CS231n:Convolutional Neural Networks for Visual Recognition

更多推荐