损失函数选型:分类回归全解

损失函数(loss function)把「模型预测得好不好」翻译成一个可优化的标量。选错损失,模型就会优化错误的目标。按任务类型分,最常用的是回归损失与分类损失。

回归任务

均方误差(MSE)对大误差惩罚重,但对离群点敏感;平均绝对误差(MAE)更稳健但梯度在零处不平滑。Huber 损失在误差小时用 MSE、大时用 MAE,兼顾两者。平滑 L1 是 Huber 在目标检测中的常用形式。

分类任务

二分类常用二元交叉熵(BCE);多分类用带 softmax 的交叉熵(CCE)。当类别极不均衡时,可加类别权重或改用 focal loss 让模型关注难样本。标签平滑(label smoothing)能缓解过自信,提升校准。

import torch.nn as nn

criterion = nn.CrossEntropyLoss()           # 多分类,内置 softmax
mse = nn.MSELoss()                           # 回归
for x, y in loader:
    loss = criterion(model(x), y)
    loss.backward()

数值注意点

交叉熵常和对数、softmax 数值不稳定配合使用,框架一般提供融合实现(如 PyTorch 的 CrossEntropyLoss 已含 log-softmax),不要手写 softmax 再取 log,以免溢出。分类标签用整数而非 one-hot 配合内置实现更高效。

怎么选

先定任务是回归还是分类;回归看是否怕离群点(选 MSE 或 Huber);分类看是否多类、是否均衡(选 CCE、加权重或 focal)。有额外结构(排序、对比)时再上专门的损失(triplet、contrastive)。

小结

损失函数是模型的学习目标本身。回归优先 MSE/Huber,分类优先交叉熵,类别失衡加权重或 focal,并注意用框架融合实现保证数值稳定。选损失应先于调模型结构。

参考与延伸阅读

本文累计阅读