损失函数选型:分类回归全解
损失函数(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,并注意用框架融合实现保证数值稳定。选损失应先于调模型结构。
参考与延伸阅读
- PyTorch 损失函数文档(含 CrossEntropyLoss、MSELoss、SmoothL1Loss)。已核验。https://pytorch.org/docs/stable/nn.html#loss-functions
- 标签平滑出自《Rethinking the Inception Architecture》(Szegedy 等, 2016, CVPR)。待核实。https://arxiv.org/abs/1512.00567
- scikit-learn 中的损失与评分说明。已核验。https://scikit-learn.org/stable/modules/model_evaluation.html
本文累计阅读 — 次