---
# System prepended metadata

title: 無標題

---

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 让模型在复杂数据分布下更鲁棒。其核心思想——“让模型更关注错误”已成为解决不平衡问题的经典思路。