Focal Loss 原理详解及 PyTorch 代码实现

Focal Loss 原理详解及 PyTorch 代码实现

介绍

一、Focal Loss 背景

Focal Loss 是为解决类别不平衡问题设计的损失函数,通过引入 gamma 参数降低易分类样本的权重,使用 alpha 参数调节正负样本比例。在目标检测等类别不平衡场景中表现优异。

二、代码逐行解析

1. 类定义与初始化

python 复制代码
class FocalLoss(nn.Module):
    """应用 Focal Loss 通过 gamma 和 alpha 参数改进 BCEWithLogitsLoss 以处理类别不平衡"""
    
    def __init__(self, loss_fcn, gamma=1.5, alpha=0.25):
        super().__init__()
        self.loss_fcn = loss_fcn  # 必须使用 nn.BCEWithLogitsLoss()
        self.gamma = gamma        # 调节难易样本权重的指数参数
        self.alpha = alpha        # 平衡正负样本比例的权重系数
        
        # 修改原损失函数的 reduction 为 'none' 进行逐元素计算
        self.reduction = loss_fcn.reduction
        self.loss_fcn.reduction = "none"

	def forward(self, pred, true):
	    # 计算基础交叉熵损失
	    loss = self.loss_fcn(pred, true)
	    
	    # 通过 sigmoid 获取概率预测值(范围0-1)
	    pred_prob = torch.sigmoid(pred)
	    
	    # 计算 p_t(真实类别对应的预测概率)(正确分类的概率)
	    p_t = true * pred_prob + (1 - true) * (1 - pred_prob)
	    
	    # 计算 alpha 因子:正样本乘 alpha,负样本乘 (1-alpha) (类别权重)
	    alpha_factor = true * self.alpha + (1 - true) * (1 - self.alpha)
	    
	    # 计算调制因子:难分类样本权重更大 (困难样本权重)
	    modulating_factor = (1.0 - p_t) ** self.gamma
	    
	    # 组合得到最终的 Focal Loss
	    loss *= alpha_factor * modulating_factor
	    
	    # 根据 reduction 设置返回结果
	    if self.reduction == "mean":
	        return loss.mean()
	    elif self.reduction == "sum":
	        return loss.sum()
	    else:  # 'none'
	        return loss

三、核心参数作用

  1. Gamma (γ)

    • γ > 0 时,降低易分类样本(p_t 接近 1)的损失权重
    • 典型取值范围:0.5-5.0
    • 示例:当 p_t=0.9,γ=2 → 调制因子 = 0.01
  2. Alpha (α)

    • 调节正负样本权重比例
    • α 接近 1 时强调正样本
    • α 接近 0 时强调负样本

四、使用示例

python 复制代码
# 初始化
criterion = FocalLoss(
    loss_fcn=nn.BCEWithLogitsLoss(),
    gamma=2.0,
    alpha=0.75
)

# 计算损失
pred = model(inputs)
loss = criterion(pred, targets)

五、应用场景

  • 目标检测(如 RetinaNet)
  • 医学图像分析
  • 任何存在严重类别不平衡的分类任务

六、总结

Focal Loss 通过两个关键参数实现了:

  1. 降低大量易分类样本的损失贡献
  2. 平衡正负样本的权重比例
  3. 改善模型对困难样本的学习能力
相关推荐
AC赳赳老秦几秒前
司法公开数据采集应用:OpenClaw 抓取裁判文书公开信息,批量整理同类参考案例
java·大数据·python·数据挖掘·数据分析·php·openclaw
HIT_Weston2 分钟前
151、【Agent】【OpenCode】启动分析(CLI 命令注册)
人工智能·agent·opencode
笑小枫7 分钟前
用 Claude Code 推翻重写笑小枫网站
java·人工智能·spring boot·ai编程
audyxiao00116 分钟前
人工智能顶会AAAI 2026论文分享|SlideBot:用于生成信息丰富、可靠、多模态幻灯片的多智能体框架
人工智能·大模型·aaai·智能体·幻灯片
用户9385156350719 分钟前
Workflow 与 Agent 之争:确定性执行与智能探索的深度剖析
人工智能
阿里云大数据AI技术26 分钟前
阿里云 EMR Serverless StarRocks(Stella 2.2.0) 发布:内表与湖表同时支持向量、全文与 AI Function,一条 SQL 完成多模态检索
人工智能
格林威27 分钟前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
怪奇云呼军31 分钟前
闪电智能Voice Agent:ASR 首字延迟和最终识别延迟怎么测?t0-t3 埋点实战
人工智能·科技·ai·语音识别
冬哥聊AI38 分钟前
百万行代码里跑Claude Code?三面这题80%的人答不上来
人工智能
甄同学39 分钟前
第二十三篇:Tasks系统,Claude Code如何统一管理7种后台任务
人工智能