什么是焦点损失(Focal Loss)

焦点损失(Focal Loss)概述

1. 背景与动机

  • 目标检测图像分割等任务中,正负样本往往极度不平衡(如前景与背景比例可达 1:1000)。
  • 传统的交叉熵(Cross‑Entropy)对每个样本的权重相同,导致大量易分类的负样本主导梯度,使模型难以学习少数、难分类的正样本
  • 为了让模型“聚焦”在这些困难样本上,Lin 等人在 2017 年提出了 Focal Loss,专为单阶段目标检测(如 RetinaNet)设计,以抑制易样本的贡献、提升难样本的学习效果。

2. 公式与核心思想

Focal Loss 是在二元交叉熵基础上加入 调制因子 的改进形式。

3. 与交叉熵的对比

项目 交叉熵 焦点损失
对易样本的权重 相同 通过  大幅降低
对难样本的权重 相同 保持或放大
参数 ɑ(类别平衡)
γ(聚焦强度)
适用场景 大多数分类任务 类别极度不平衡的检测/分割等任务

4. 典型应用

  1. 单阶段目标检测:RetinaNet 使用 Focal Loss 解决前景/背景比例失衡,实现了与两阶段检测相当的精度。
  2. 医学图像分割:在肺结节、肿瘤等少数目标的分割任务中,Focal Loss 与 Dice、Tversky 等结合,可显著提升分割质量。
  3. 图像分类:在长尾分布的分类数据集(如 ImageNet‑LT)中,加入 Focal Loss 能提升少数类的准确率
  4. 自然语言处理序列标注、摘要生成等类别不均衡的任务也可采用 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 示例
来源:www.aiug.cn
声明:文章均为AI生成,请谨慎辨别信息的真伪和可靠性!