Loss Function
损失函数用于衡量模型预测与真实值之间的差距,训练过程会将其最小化。了解常见损失函数以及各自的适用场景。
损失函数衡量模型的预测与训练数据中的真实标签相差多远,并将误差汇总为一个数值,数值越低越好。训练神经网络意味着调整模型权重,尽可能减小这个数值。“代价函数”和“目标函数”是常见的同义词,不过有些资料会把单个样本的误差称为“损失”,把一个批次或数据集上的平均值称为“代价”。
损失如何推动训练#
训练会针对每个数据批次重复相同的循环。模型生成预测,损失函数根据标签为预测打分,反向传播计算损失相对于每个权重的梯度。随后,优化器(例如随机梯度下降(SGD)或 Adam 优化器)会沿着梯度的反方向对每个权重做小幅更新,步长由学习率设定。由于这个过程依赖梯度,损失函数必须几乎处处可微。每个轮次后绘制训练损失和验证损失,是监控训练运行的标准方法:验证损失上升而训练损失继续下降,是过拟合的典型迹象。
常见损失函数#
合适的损失函数取决于模型要预测什么;PyTorch 等框架都内置了大多数标准选项:
- 均方误差(MSE):预测值与真实值之间的平方差的平均值,用于回归任务。平方运算会放大大误差,因此离群值的影响很大。
- 平均绝对误差(L1)和 Huber 损失:误差较大时线性增长的回归损失,因此对离群值不那么敏感。Huber 损失在小误差时呈二次增长,超过阈值后呈线性增长。
- 交叉熵:图像分类的标准损失函数,根据互斥类别上的 softmax 概率计算。
- 二元交叉熵(BCE):通过 sigmoid 将每个类别作为独立的“是或否”预测进行评分,适用于多标签问题和检测器类别分数。
- 焦点损失:交叉熵的一种变体,会降低简单样本的权重,使困难的稀有样本在类别严重不平衡时推动模型学习。
- 基于 IoU 的损失:基于交并比(IoU)构建的框回归损失,其变体包括 DIoU 和 CIoU;这些变体增加了对中心距离的惩罚,CIoU 还会惩罚宽高比差异。
- Dice 损失:用于图像分割的重叠损失;即使前景只占少量像素,也能提供有效的学习信号。
- 对比损失:用于对比学习的损失,会在嵌入空间中拉近匹配的样本对,并推远不匹配的样本对。
交叉熵取真实类别所分配概率的负对数,因此,自信地预测错误的代价远高于犹豫不决,而自信地预测正确几乎没有代价。PyTorch 的 CrossEntropyLoss 展示了两个置信度相同的预测会产生怎样的差异:
import torch
from torch import nn
# CrossEntropyLoss applies softmax to raw scores (logits) internally
loss_fn = nn.CrossEntropyLoss()
# Logits for 3 classes; the true class is index 0
target = torch.tensor([0])
confident_right = torch.tensor([[4.0, 0.5, -1.0]])
confident_wrong = torch.tensor([[-1.0, 4.0, 0.5]])
print(f"Confident and right: {loss_fn(confident_right, target).item():.4f}")
print(f"Confident and wrong: {loss_fn(confident_wrong, target).item():.4f}")自信且正确的预测损失为 0.0363,而相同置信度下预测错误类别的损失为 5.0363,约高出 139 倍。
目标检测中的复合损失#
目标检测模型需要预测每个目标的位置和类别,因此训练损失是多个项的加权和。YOLO26结合 CIoU 框损失、BCE 分类损失,以及对归一化框距离计算的 L1 损失;这种 L1 损失取代了早期 YOLO 模型中的 Distribution Focal Loss。这些损失项分别由 box、cls 和 dfl训练参数加权,默认值为 7.5、0.5 和 1.5。随着训练推进,其渐进式损失还会将权重从一对多头逐步转向用于无 NMS 推理的一对一头。
损失函数与相关术语的比较#
- 评估指标:准确率和平均精度均值(mAP)等指标会根据人们关心的方面报告性能,但大多数指标会以离散步幅变化,无法提供梯度。训练时会最小化可微损失,将其作为这些指标的替代目标。
- 正则化:添加到损失中的惩罚项,用于抑制模型复杂度。L2 正则化会加上平方权重和的倍数,使优化器倾向于选择更小、泛化能力更好的权重。
- 奖励函数:强化学习中的优化目标,智能体要最大化累积奖励,而不是最小化损失,因此奖励的作用相当于负损失。










