You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中二元Focal Loss的正确简洁实现方法咨询

二元分类场景下Focal Loss的正确实现

首先纠正你之前实现的核心问题:

  • 第一个版本仅计算正样本(target=1)的损失,完全忽略负样本(target=0)的惩罚,不符合Focal Loss的设计逻辑。
  • 第二个版本的错误在于缺少负号——二元交叉熵的本质是 -target*log(p) - (1-target)*log(1-p),你去掉负号后损失计算逻辑完全颠倒,这也是loss停滞的直接原因。

根据《Focal Loss for Dense Object Detection》论文的公式4,适配二元分类的Focal Loss正确形式为:

FL(p_t) = -α_t * (1-p_t)^γ * log(p_t)
其中p_t定义:当target=1时,p_t=p;当target=0时,p_t=1-p。α_t是正负样本的权重系数(可选,默认可设为0.5,或根据样本比例调整)。

简洁且数值稳定的PyTorch实现

推荐基于BCEWithLogitsLoss实现,避免单独计算sigmoid带来的数值不稳定问题:

import torch
import torch.nn as nn
import torch.nn.functional as F

class BinaryFocalLoss(nn.Module):
    def __init__(self, gamma=2.0, alpha=0.5, reduction='mean'):
        super().__init__()
        self.gamma = gamma
        self.alpha = alpha
        self.reduction = reduction

    def forward(self, logits, targets):
        # logits为模型输出的未经过sigmoid的张量,targets为二元标签(形状与logits一致)
        bce_loss = F.binary_cross_entropy_with_logits(logits, targets, reduction='none')
        pt = torch.exp(-bce_loss)  # pt = p(当target=1)或1-p(当target=0)
        focal_loss = self.alpha * (1 - pt)**self.gamma * bce_loss

        if self.reduction == 'mean':
            return torch.mean(focal_loss)
        elif self.reduction == 'sum':
            return torch.sum(focal_loss)
        else:
            return focal_loss

若已得到sigmoid输出p的实现

如果已经获取经过sigmoid的p值,正确计算方式如下:

def binary_focal_loss(p, targets, gamma=2.0, alpha=0.5, reduction='mean'):
    # p为sigmoid输出,范围(0,1)
    pt = torch.where(targets == 1, p, 1 - p)
    focal_loss = -self.alpha * (1 - pt)**self.gamma * torch.log(pt)
    
    if reduction == 'mean':
        return torch.mean(focal_loss)
    elif reduction == 'sum':
        return torch.sum(focal_loss)
    else:
        return focal_loss

关键注意点

  • 保留负号:交叉熵损失本质是负对数概率,Focal Loss在其基础上乘以调制系数,必须保留负号保证损失逻辑正确。
  • 数值稳定性:直接用logits输入(未经过sigmoid)结合binary_cross_entropy_with_logits,可避免sigmoid在极端值(p趋近0或1)时的数值溢出问题。
  • α与γ的调参:α用于平衡正负样本不平衡,样本均衡时设为0.5,正样本稀缺时可调大(如0.75);论文推荐γ=2,γ越大,对易分类样本的惩罚越弱,越聚焦难分类样本。

内容的提问来源于stack exchange,提问作者00__00__00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:11