1. 图像分类里为什么需要 Focal Loss?
在真实的图像分类任务中,你经常会遇到:
-
类别不均衡 / 长尾分布
头部类别样本很多,尾部类别样本很少(例如 10000:10)。
-
训练被"容易样本"主导
多数类样本多、而且往往更容易,模型很快就能把它们分对;但它们数量巨大,导致训练过程中的++梯度贡献仍主要来自这些样本++,尾部类/难样本的信号被淹没。
Focal Loss 的核心目标就是一句话:
降低"容易样本"的损失权重,让训练更关注"难样本"和"少数类"
2. 基线:多分类交叉熵(Cross Entropy)在做什么?
图像分类常见是 多分类 softmax。设:
-
类别数为 (C)
-
模型输出 logits 为
,为一组实数。++(如果把模型比作一个法官,Logits 就是他心里对各个选项的"原始评分",还没有转换成百分比形式)++
-
softmax 概率为
-
真实标签为
softmax公式定义:。++(将 Logits 映射到 [0, 1]之间,且总和为 1)++
多分类交叉熵:
交叉熵在长尾场景的问题:
交叉熵会对每个样本都"认真对待"。当多数类样本数量巨大时,即使它们早已变成 easy samples(
接近 1),总体上仍会累积出大量损失/梯度贡献,使优化方向更偏向多数类。
3. Focal Loss:在交叉熵上加一个"聚焦因子"
Focal Loss 的关键做法是:给交叉熵乘上一个随样本难度变化的权重项。
在多分类中,直接令,真实类别概率:
3.1 多分类 Focal Loss 公式
其中:
-
:聚焦参数(focusing parameter),控制"压制 easy 样本"的力度
-
:类别权重(每一类一个权重),用来缓解类别不均衡
4. 这条公式到底解决了什么?
关键在这项:
-
当样本很容易(模型很自信且正确):
则
,损失被大幅降低
-
当样本很难(模型不自信或预测错):
则
,损失基本保留,模型会更关注这些样本
给一个"可读性强"的小例子(不依赖公式渲染也能看懂):
-
若
,
,则
easy 样本的损失会被压到原来的万分之一量级
-
若
,
,则
难样本损失仍然很大,继续驱动模型学习
5. 两个超参数怎么设?(图像分类实战建议)
5.1
:聚焦难样本的强度
-
:Focal Loss 退化为"带类权重的交叉熵"
-
常用范围:
-
常见默认:
经验判断:
-
如果你发现 多数类精度很高、少数类 recall 很差 ,可尝试增大
-
如果训练变慢、或对噪声数据很敏感,可尝试减小
5.2
:处理类不均衡(长尾分类里很关键)
在图像分类长尾中, 通常设置为"每类一个权重"。常见做法包括:
- 按类别频次的反比或幂次:
6. 在图像分类任务里,Focal Loss 适合哪些场景?
-
长尾分类(最典型):尾部类别样本少,模型容易忽略
-
难例较多:例如细粒度分类(鸟类、车型)、易混淆类别多
-
你关心宏平均指标:如 macro-F1、balanced accuracy,而不只是 overall accuracy
++不太建议直接上 Focal Loss 的情况:++
-
数据比较均衡、且训练中不存在"easy 样本淹没问题"
-
标签噪声较多:Focal Loss 会更强调"难样本",噪声样本往往也"难",可能被放大
7. 总结
Focal Loss 可以看作是"交叉熵 + 动态难度加权"。在长尾图像分类中,它通过 自动降低大量 easy 样本的影响,让训练把更多注意力放在难样本与少数类上 ;配合
的类别权重,通常能显著改善尾部类别的召回与 macro 指标( 确保那些样本稀少的类别也能被正确地识别*)*。