1. Focal Loss 核心思想解析
Focal Loss 最初由何恺明团队在2017年提出,主要针对目标检测任务中前景-背景类别极度不平衡的问题。传统交叉熵损失函数在面对样本数量差异极大的分类任务时,容易被多数类样本主导训练过程。举个例子,在一张典型的COCO数据集的图片中,可能包含数十万个背景像素点(负样本),但只有几十个目标物体像素点(正样本)。
Focal Loss 的创新点在于引入了两个关键调节因子:
- 平衡因子α:用于调节正负样本的权重
- 调制因子(1-pt)^γ:用于降低易分类样本的损失贡献
数学表达式为:
FL(pt) = -αt(1-pt)^γ log(pt)
其中pt表示模型对真实类别的预测概率。当γ=0时,Focal Loss退化为标准的交叉熵损失。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术实现细节剖析
2.1 参数选择经验
在RetinaNet的原始论文中,作者通过实验得出:
- γ=2时效果最佳
- α=0.25时能取得较好的平衡
实际应用中我们发现:
- 对于极度不平衡的数据(如1:1000),可以适当增大α值
- γ值增大虽然能更关注难样本,但训练初期可能导致不稳定
- 最佳参数组合需要通过验证集进行网格搜索
2.2 PyTorch实现示例
python复制class FocalLoss(nn.Module):
def __init__(self, alpha=0.25, gamma=2, reduction='mean'):
super(FocalLoss, self).__init__()
self.alpha = alpha
self.gamma = gamma
self.reduction = reduction
def forward(self, inputs, targets):
BCE_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction='none')
pt = torch.exp(-BCE_loss)
loss = self.alpha * (1-pt)**self.gam
