Focal Loss
焦点损失会调整交叉熵的权重,让简单样本几乎不起作用,而由罕见且困难的样本主导训练。涵盖公式、gamma、RetinaNet 和各种变体。
焦点损失是一种改进的交叉熵损失函数,它会降低模型已经能够正确分类的样本的权重,让训练集中处理难以分类和误分类的样本。Lin 等人在 2017 年的论文 Focal Loss for Dense Object Detection 中提出了焦点损失,并同时推出 RetinaNet 检测器,以处理目标检测中背景与物体之间极端的类别不平衡问题。如今,焦点损失广泛用于某个类别的样本数量远多于其他类别的分类问题。
类别不平衡问题#
单阶段目标检测器会对图像中的每个候选位置进行分类,而 RetinaNet 每张图像约评估 100,000 个候选位置。这些位置几乎全是背景,模型在训练初期就学会了将其排除。在标准交叉熵下,每个容易分类的负样本仍会产生少量损失;大量负样本累积起来,会主导总损失及其梯度,淹没少数包含物体的位置。两阶段目标检测器通过候选区域提议阶段过滤候选框,并按固定比例采样前景和背景,从而避免了这个问题;早期的单阶段检测器则依赖困难负样本挖掘。焦点损失直接在损失函数内部解决不平衡问题,因此无需采样即可训练每个候选位置。
焦点损失的工作原理#
将 p_t 记为模型对正确类别所分配的概率。交叉熵为 CE = -log(p_t),焦点损失则会将交叉熵乘以一个调制因子:
FL = -α_t (1 - p_t)^γ log(p_t)
- 聚焦参数
γ(gamma): 控制容易样本的损失缩小得有多快。当γ = 0时,焦点损失等于交叉熵。当p_t趋近于 1 时,(1 - p_t)^γ趋近于 0;而分类错误且p_t较小的样本,则几乎保留全部交叉熵损失。使用论文中效果最佳的设置γ = 2时,与交叉熵相比,分类置信度为p_t = 0.9的样本损失会降低 100 倍。 - 平衡权重
α_t(alpha): 为正类设置一个固定权重,负类则使用其补数。RetinaNet 使用α = 0.25和γ = 2;论文还会用分配给物体的锚框数量,对每张图像的总损失进行归一化。
torchvision 中的 sigmoid_focal_loss 函数实现了这个公式。设置 alpha=-1 会禁用平衡权重,从而单独观察 γ 对容易、一般和困难正样本的影响:
import torch
import torch.nn.functional as F
from torchvision.ops import sigmoid_focal_loss
# Logits for three positive examples: easy, moderate, and hard
logits = torch.tensor([4.0, 1.0, -2.0])
targets = torch.ones(3)
# alpha=-1 turns off class weighting so only the gamma focusing term differs
bce = F.binary_cross_entropy_with_logits(logits, targets, reduction="none")
focal = sigmoid_focal_loss(logits, targets, alpha=-1, gamma=2.0, reduction="none")
for p, b, f in zip(logits.sigmoid(), bce, focal):
print(f"p={p:.2f} cross-entropy={b:.6f} focal={f:.6f} ratio={b / f:,.1f}x")焦点损失会将容易样本的损失(p = 0.98)缩小约 3,091 倍,将一般样本(p = 0.73)的损失缩小 13.8 倍,而困难样本(p = 0.12)的损失仅缩小 1.3 倍,因此困难样本现在几乎承载了全部训练信号。
焦点损失的应用场景#
除了 RetinaNet,焦点损失及其变体还用于训练许多密集型和基于 Transformer 的检测器中的分类分支,包括 Deformable DETR 等 DETR 系列模型。在医学图像分析中,病变通常只占极少像素,因此图像分割模型通常会将焦点损失与 Dice 损失结合使用,避免忽略细小病灶并提高召回率。在 Ultralytics 中,RT-DETR 训练器使用 Varifocal Loss 对类别打分,而 ultralytics.utils.loss 模块提供了一个 FocalLoss 类,其默认值为 gamma=1.5 和 alpha=0.25。
焦点损失与相关技术的比较#
- 类别加权: 加权交叉熵会根据类别频率,为稀有类别的每个样本提供相同的固定权重提升。焦点损失则根据每个样本当前的难度为其加权,因此权重会随着模型学习而变化。
- 困难负样本挖掘: 只保留损失最高的负样本,并丢弃其余样本。焦点损失会保留所有样本,并平滑地降低容易样本的权重。
- Varifocal Loss: VarifocalNet 提出的一种非对称变体,只降低负样本的权重,并训练正样本,使其分数感知 IoU,因此类别置信度也能反映定位质量。
- 分布焦点损失(DFL): 来自广义焦点损失的一种边界框回归损失,将边界框的每条边视为离散概率分布。它与焦点损失仅名称相同,实际用于边界框回归。










