损失函数(loss function)把模型的预测结果映射成一个标量,用来衡量预测与目标之间的差异。训练过程通常是在最小化经验风险:
其中, 是参数为 的模型, 是输入, 是标签, 是单个样本的损失。损失函数并不只是一个“打分器”:它实际上定义了模型要重视什么、忽略什么,以及参数更新时的方向和幅度。
先看三个选择标准
选择损失函数时,可以先问三个问题:
- 标签是什么类型? 连续值、类别、概率分布,还是集合或序列?
- 错误的代价是否对称? 预测偏大和偏小是否同样严重?少数类漏检是否比误报更昂贵?
- 数据中是否有异常值或类别不平衡? 它们会决定损失是否需要更加鲁棒或重新加权。
还要区分训练目标与评估指标。例如,分类任务常用交叉熵训练,却用 accuracy、F1 或 AUROC 评估;检测任务常把分类损失、边界框回归损失和 IoU 损失组合起来。一个好的损失函数,应该让优化目标与真正关心的结果尽量一致。
回归损失
回归任务的标签通常是连续值。设误差为 。
MSE:均方误差
MSE 对误差进行平方,因此大误差会被快速放大。它在误差服从高斯分布、且大误差确实应该受到更重惩罚时很自然;最小化 MSE 也对应于拟合条件均值。
优点是连续、光滑、容易优化。缺点是对异常值敏感:一个极大的误差可能主导整个 batch 的梯度。如果标签的长尾很明显,可以考虑对目标做标准化,或改用更鲁棒的损失。
MAE:平均绝对误差
MAE 对误差进行线性惩罚,相比 MSE 不容易被异常值牵着走。它更接近拟合条件中位数,因此当数据中存在离群点、或者大误差不应该被过度放大时很有用。
MAE 在 处不可导。实际实现会使用次梯度,通常不会造成问题,但它的梯度幅度基本不随误差变大而增加,可能使训练收敛速度不如 MSE。
Huber Loss:MSE 与 MAE 的折中
Huber Loss 在小误差区域像 MSE,在大误差区域像 MAE。参数 决定两种行为的切换位置: 越大,损失越接近 MSE; 越小,损失越接近 MAE。
它经常用于目标检测中的边界框回归,因为模型早期可能产生较大的定位误差,而这些误差不应让梯度完全失控。Smooth L1 Loss 可以看作 Huber Loss 的一个常见实现形式或缩放版本。
对数双曲余弦损失
在小误差附近,;在大误差区域,它近似 。因此它同时具有 MSE 的平滑性和 MAE 的鲁棒性。它的梯度是 ,天然被限制在 。
分类损失
分类损失通常来自概率建模:模型输出一个概率分布,损失衡量真实标签在该分布下的负对数似然。
Binary Cross-Entropy:二分类交叉熵
对标签 和预测概率 :
BCE 会强烈惩罚“自信但错误”的预测。例如真实标签为 1,而模型给出接近 0 的概率时,损失会很大。多标签分类中,每个类别都可以独立使用 BCE。
工程上更推荐直接使用 logits 版本的实现,例如 PyTorch 中的 BCEWithLogitsLoss,让 sigmoid 与数值稳定的 log-sum-exp 计算在同一个算子中完成。不要先手动 sigmoid,再把结果传给 logits 版本。
Multi-Class Cross-Entropy:多分类交叉熵
对于 个互斥类别,模型输出 logits ,softmax 概率为:
若真实类别为 ,交叉熵为:
它等价于 softmax 输出分布与 one-hot 标签分布之间的交叉熵,也是多分类中最常见的默认选择。实现时通常直接传入 logits 和整数类别索引,而不是手动计算 softmax。
Label Smoothing:标签平滑
硬标签会把真实类别的目标概率设为 1,其余类别设为 0。标签平滑把目标改为:
它能减弱模型过度自信,通常对泛化和校准有帮助,尤其适用于训练标签存在轻微噪声的场景。但平滑过强会降低类别之间的学习信号; 应作为正则化超参数,而不是越大越好。
Focal Loss:聚焦损失
在二分类中,令 表示真实类别对应的预测概率:
其中 控制对容易样本的降权程度, 用来平衡类别权重。当样本已经被正确分类、且 很大时, 会压低它的贡献,让训练更集中于难样本和少数类。
Focal Loss 常用于目标检测和严重类别不平衡的分类任务。如果数据并不失衡,或者难样本本身含有大量噪声,过度聚焦可能让模型过分追逐异常样本。
Hinge Loss:合页损失
二分类 SVM 常使用:
它不仅要求分类正确,还要求样本位于分类间隔之外。与交叉熵相比,Hinge Loss 更直接地优化间隔;但它在间隔已经满足后不再提供梯度,因此在现代深度分类网络中通常不如交叉熵常见。
分割与重叠区域损失
像素级分割常面临前景稀疏、类别不平衡和边界质量难以用逐像素损失表达的问题。这时,基于区域重叠的损失很有价值。
Dice Loss
Dice 系数为:
对应的 Dice Loss 通常写成:
它直接衡量预测区域与真实区域的重叠程度,对前景占比很小的任务比较友好,例如医学图像分割。实践中常把 Dice Loss 与 BCE 或 CE 相加:前者关注区域重叠,后者提供更稳定的逐像素概率监督。
IoU / Jaccard Loss
IoU Loss 可以写为 。它与最终的交并比指标更一致,但梯度行为有时不如交叉熵稳定。和 Dice 一样,需要在分母中加入 ,以避免前景为空时出现数值问题。
度量学习损失
度量学习不一定直接预测类别,而是学习一个嵌入空间:相似样本靠近,不相似样本分离。
Contrastive Loss:对比损失
设 是两个样本嵌入之间的距离, 表示相似, 表示不相似:
相似样本会被拉近,不相似样本只有在距离小于 margin 时才会被推远。margin 太小会导致负样本分离不足,太大则可能让训练持续受到大量无关负样本影响。
Triplet Loss:三元组损失
给定 anchor、positive 和 negative,常见形式为:
它要求 negative 至少比 positive 远一个 margin。Triplet Loss 的效果高度依赖样本挖掘策略;随机采样的三元组往往太容易,产生的梯度接近于零,因此 batch 内 hard negative 或 semi-hard negative mining 通常很重要。
概率模型与生成模型中的损失
KL Divergence:KL 散度
对两个离散分布 和 :
KL 散度衡量用 近似 时损失了多少信息。它不是对称距离, 与 一般不同。
在变分自编码器(VAE)中,KL 项通常用于让近似后验接近先验:
控制重构质量与潜变量规整程度之间的平衡。KL 权重过大可能导致 posterior collapse,训练时常需要 warm-up 或调小权重。
Negative Log-Likelihood:负对数似然
NLL 是一个非常通用的概率训练目标。回归中的 MSE、分类中的交叉熵,都可以从特定概率分布的负对数似然推导出来:高斯假设导出平方误差,伯努利或 categorical 分布导出交叉熵。
这个视角很有用,因为它提醒我们:损失函数隐含了对标签噪声和不确定性的假设。若预测目标本身具有多峰、不确定或异方差,仅优化一个点估计的 MSE 可能会把多个合理答案平均成一个并不存在的答案。
损失函数如何组合
复杂任务通常需要多项损失共同约束模型:
常见的组合方式包括:
- 分割:
Cross-Entropy + Dice Loss,兼顾像素级监督和区域重叠。 - 目标检测: 分类损失 + Huber/Smooth L1 回归损失 + IoU 类损失。
- VAE: 重构损失 + KL 散度。
- 表征学习: 分类交叉熵 + 对比学习损失,兼顾任务性能和嵌入结构。
组合损失时,首先要检查各项的数值尺度和梯度尺度。某一项数值更大,并不一定意味着它更重要;真正影响训练的是它在反向传播中提供的梯度。可以记录每个损失项及其梯度范数,再决定是否需要归一化、重新加权或使用动态权重。
一个实用选择表
| 任务 | 默认起点 | 需要特别关注 |
|---|---|---|
| 连续值回归 | MSE | 异常值、目标尺度 |
| 含离群点的回归 | Huber 或 MAE | 收敛速度与鲁棒性的平衡 |
| 二分类 | BCE with logits | 类别不平衡、概率校准 |
| 多分类 | Cross-Entropy | 标签噪声、过度自信 |
| 多标签分类 | 对每个类别使用 BCE | 正负样本比例 |
| 像素级分割 | CE + Dice | 空前景、边界质量 |
| 嵌入检索 | Contrastive 或 Triplet | 负样本挖掘、margin |
| VAE | Reconstruction + KL | KL 权重、posterior collapse |
训练前的最后检查
- 先确认输出与损失匹配。 例如,
CrossEntropyLoss接收 logits,不需要提前 softmax;BCEWithLogitsLoss接收未经过 sigmoid 的 logits。 - 检查标签编码。 类别索引、one-hot、概率标签和
{-1, +1}标签对应的损失不同。 - 处理 reduction。
mean、sum和按样本保留损失会改变梯度尺度,尤其要留意不同 batch size 下的行为。 - 观察难例是否真的在起作用。 使用 Focal、Triplet 或 hard mining 后,应确认模型是在学习有意义的难例,而不是追逐错误标签。
- 让损失服务于指标。 如果业务真正关心召回率、IoU 或排序质量,就不要只因为某个损失函数常见而机械使用它。
损失函数是任务目标的可微近似。先明确什么样的错误最值得惩罚,再选择能够稳定表达这种偏好的函数。