焦点损失(Focal Loss)概述
1. 背景与动机
- 在目标检测、图像分割等任务中,正负样本往往极度不平衡(如前景与背景比例可达 1:1000)。
- 传统的交叉熵(Cross‑Entropy)对每个样本的权重相同,导致大量易分类的负样本主导梯度,使模型难以学习少数、难分类的正样本。
- 为了让模型“聚焦”在这些困难样本上,Lin 等人在 2017 年提出了 Focal Loss,专为单阶段目标检测(如 RetinaNet)设计,以抑制易样本的贡献、提升难样本的学习效果。
2. 公式与核心思想
Focal Loss 是在二元交叉熵基础上加入 调制因子 的改进形式。
3. 与交叉熵的对比
项目 | 交叉熵 | 焦点损失 |
---|---|---|
对易样本的权重 | 相同 | 通过 大幅降低 |
对难样本的权重 | 相同 | 保持或放大 |
参数 | 无 | ɑ(类别平衡) γ(聚焦强度) |
适用场景 | 大多数分类任务 | 类别极度不平衡的检测/分割等任务 |
4. 典型应用
- 单阶段目标检测:RetinaNet 使用 Focal Loss 解决前景/背景比例失衡,实现了与两阶段检测相当的精度。
- 医学图像分割:在肺结节、肿瘤等少数目标的分割任务中,Focal Loss 与 Dice、Tversky 等结合,可显著提升分割质量。
- 图像分类:在长尾分布的分类数据集(如 ImageNet‑LT)中,加入 Focal Loss 能提升少数类的准确率。
- 自然语言处理:序列标注、摘要生成等类别不均衡的任务也可采用 Focal Loss 进行加权训练。
5. 常见变体与扩展
- Focal Tversky Loss:在 Dice/Tversky 基础上加入调制因子,进一步强化对难样本的关注。
- Unified Focal Loss:统一了 Dice 与交叉熵的优势,适用于 2D/3D 医学分割。
- AdaFocal:根据验证集的校准误差自适应调整 ,兼顾准确率与预测置信度。
6. 实现要点(PyTorch 示例)
import torch
import torch.nn.functional as F
class FocalLoss(torch.nn.Module):
def __init__(self, alpha=0.25, gamma=2.0, reduction='mean'):
super().__init__()
self.alpha = alpha
self.gamma = gamma
self.reduction = reduction
def forward(self, logits, targets):
# logits: (N, C) 未经 softmax 的输出
prob = torch.softmax(logits, dim=-1)
pt = prob.gather(1, targets.unsqueeze(1)).squeeze(1) # 预测正确类的概率
log_pt = torch.log(pt)
loss = -self.alpha * (1 - pt) ** self.gamma * log_pt
if self.reduction == 'mean':
return loss.mean()
elif self.reduction == 'sum':
return loss.sum()
return loss
- 关键是先得到 (正确类别的预测概率),再乘以调制因子 与平衡系数 。
7. 小结
Focal Loss 通过 调制因子 抑制大量易分类样本的梯度贡献,使模型在训练过程中更专注于 少数、难分类的样本。它在目标检测、医学分割、长尾分类等 类别极度不平衡 的场景中已被广泛验证为提升模型性能的有效手段,并衍生出多种适配不同任务的变体。
参考文献(对应证据编号)
- ① 何凯明等提出 Focal Loss(RetinaNet)
- ② 调制因子与公式解释
- ③ ɑ与 γ参数说明
- ④ 目标检测中的实际应用
- ⑤ 医学分割中的使用案例
- ⑥ 类别不平衡的通用场景
- ⑦ 变体(Unified Focal、AdaFocal 等)
- ⑧ 实现细节参考 PyTorch 示例
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!