Focal Loss 是一种专门用于解决分类任务中**类别不平衡**和**难易样本差异**问题的损失函数,由何恺明团队在2017年提出,最初用于目标检测任务(如RetinaNet)。其核心思想是通过动态调整样本权重,让模型更关注难分类样本和少数类样本。 --- ### 一、Focal Loss 的核心原理 **1. 基础公式** Focal Loss 在交叉熵(Cross-Entropy Loss, CE)的基础上增加两个调节因子: - **平衡因子 α**:用于平衡正负样本的权重(如负样本多则降低其权重)。 - **聚焦因子 γ**:用于降低易分样本的权重,放大难分样本的损失贡献。 **公式推导**: - **标准交叉熵**: $$ CE(p_t) = -\log(p_t) $$ 其中 $p_t$ 表示模型对正确类别的预测概率。例如,若真实标签为1,则 $p_t = p$;若标签为0,则 $p_t = 1-p$。 - **加入平衡因子 α**: $$ CE(p_t) = -\alpha_t \log(p_t) $$ $\alpha_t$ 根据类别频率设置(如正样本少则 $\alpha=0.25$)。 - **加入聚焦因子 γ**: $$ FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t) $$ 当 $\gamma=0$ 时,Focal Loss 退化为带权重的交叉熵。 **2. 直观理解** - **易分样本**(如 $p_t=0.9$): 调制因子 $(1-p_t)^\gamma$ 趋近于0,导致损失贡献大幅降低。例如,若 $\gamma=2$,其损失权重是原交叉熵的 $0.01$ 倍。 - **难分样本**(如 $p_t=0.2$): 调制因子趋近于1,损失几乎不变,模型被迫学习这些样本。 --- ### 二、通过例子理解 Focal Loss #### **案例1:目标检测中的正负样本失衡** - **背景**:在目标检测任务中,一张图片可能生成10,000个候选框(Anchor),其中仅约10个是真实目标(正样本),其余均为背景(负样本)。 - **传统交叉熵的问题**: 大量负样本的损失总和会掩盖正样本的损失,导致模型被简单背景样本主导。 - **Focal Loss 的作用**: - 对负样本(如预测概率 $p=0.9$)的损失权重降低为 $(1-0.9)^2 = 0.01$。 - 对难分样本(如预测概率 $p=0.3$)的损失权重保持较高($0.7^2 = 0.49$),迫使模型优化这些样本。 #### **案例2:二分类中的难易样本对比** 假设任务为判断图片是否为“猫”: - **样本1**(易分负样本): 模型预测为非猫的概率 $p=0.9$ → 损失权重为 $(1-0.9)^2 = 0.01$。 - **样本2**(难分正样本): 模型预测为猫的概率 $p=0.4$ → 损失权重为 $(1-0.4)^2 = 0.36$。 - **结果**:样本2的损失贡献是样本1的36倍,模型优先优化难分样本。 #### **案例3:多分类任务中的应用** 假设任务为10类图像分类,其中“稀有动物”类样本极少: - **传统交叉熵**:模型可能将所有样本预测为多数类(如“猫”“狗”)。 - **Focal Loss**: - 对“稀有动物”类设置更高的 $\alpha$(如0.5),平衡类别权重。 - 对预测概率低的样本(如“稀有动物”预测概率0.2)提高损失权重,缓解少数类被忽略的问题。 --- ### 三、代码实现(PyTorch示例) ```python import torch import torch.nn as nn import torch.nn.functional as F class FocalLoss(nn.Module): def __init__(self, alpha=0.25, gamma=2): super().__init__() self.alpha = alpha # 正样本权重(若正样本少则调高) self.gamma = gamma # 难易样本调节因子 def forward(self, inputs, targets): ce_loss = F.cross_entropy(inputs, targets, reduction='none') pt = torch.exp(-ce_loss) # 计算 p_t focal_loss = self.alpha * (1 - pt)**self.gamma * ce_loss return focal_loss.mean() ``` --- ### 四、实际应用场景 1. **目标检测**:RetinaNet 通过 Focal Loss 解决密集候选框中的正负样本失衡。 2. **医学图像分析**:处理罕见病检测(如肿瘤)时,缓解正样本稀缺问题。 3. **NLP 任务**:序列标注中处理实体与非实体的不平衡(如命名实体识别)。 --- ### 五、优缺点总结 **优点**: - 显著缓解类别不平衡问题。 - 提升模型对难分样本的敏感性。 - 灵活适配多任务(二分类/多分类)。 **缺点**: - 对噪声样本敏感(如错误标注的样本会被过度关注)。 - 需通过实验调整 $\alpha$ 和 $\gamma$(一般 $\gamma=2$, $\alpha=0.25$)。 --- 通过动态调整损失权重,Focal Loss 让模型在复杂数据分布下更鲁棒。其核心思想——“让模型更关注错误”已成为解决不平衡问题的经典思路。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up