Loss函数的地雷:针对类别不平衡,Focal Loss是如何碾压CrossEntropy的
Loss函数的地雷:针对类别不平衡,Focal Loss是如何碾压CrossEntropy的
在工业级分类任务中,类别不平衡(Class Imbalance)是最常见也最隐蔽的“地雷”之一。正负样本比例悬殊(例如1:1000)、难易样本混杂,导致模型训练陷入“虚假的局部最优”——准确率看似很高,但少数类几乎全错。
许多工程师的第一反应是过采样、欠采样或调整类别权重。但这些手段都治标不治本。真正从损失函数底层动刀的革命性工作,是Focal Loss。
本文不从论文复述出发,而是从梯度动态和样本贡献分布两个底层视角,拆解CrossEntropy为何在极端不平衡下失效,以及Focal Loss究竟“碾压”在哪里。
1. 回顾标准CrossEntropy:被“简单易分样本”绑架的梯度
二分类交叉熵损失函数为:
C E ( p , y ) = − log ( p t ) CE(p, y) = -\log(p_t)CE(p,y)=−log(pt)
其中:
p t = { p , y = 1 1 − p , y = 0 p_t = \begin{cases} p, & y = 1 \\ 1-p, & y = 0 \end{cases}pt={p,1−p,y=1y=0
对输入 logitx xx求导,得到梯度幅度:
∂ C E ∂ x = p t − 1 \frac{\partial CE}{\partial x} = p_t - 1∂x∂CE=pt−1
关键观察:当样本被正确分类且置信度很高时(例如p t → 1 p_t \to 1pt→1),梯度趋近于 0。这看似合理——既然已经学好了,就不该再大幅更新。
但在不平衡场景下,这个性质变成致命陷阱:
- 负样本(背景类)数量是正样本的 1000 倍。
- 即使每个负样本的p t p_tpt都很高(比如 0.99),其单个梯度很小(0.01),但累积梯度=1000 × 0.01 = 10 1000 \times 0.01 = 101000×0.01=10。
- 正样本总共只有 10 个,即使全部预测错误(p t ≈ 0.5 p_t \approx 0.5pt≈0.5),总梯度 =10 × 0.5 = 5 10 \times 0.5 = 510×0.5=5。
于是,背景类累积梯度压倒性主导参数更新方向。模型不傻——它迅速学会把几乎所有样本判为负类,且置信度极高,进一步压死少数类的梯度信号。
这就是“易分负样本的梯度海啸”。
2. 为何类别加权CE不够?——它压不住“已经分对的”
传统补救措施是给少数类赋予更高权重α \alphaα:
C E α ( p , y ) = − α t log ( p t ) CE_{\alpha}(p, y) = -\alpha_t \log(p_t)CEα(p,y)=−αtlog(pt)
其中α t \alpha_tαt对正类取 0.75,负类取 0.25。
这在简单不平衡下有效,但在极度不平衡 + 难易混杂时仍然崩盘。原因很本质:
α \alphaα仅按“样本类别”缩放,不按“样本难度”缩放。
- 一个容易分的负样本(p t = 0.99 p_t=0.99pt=0.99),乘以α = 0.25 \alpha=0.25α=0.25后,梯度为0.25 × 0.01 = 0.0025 0.25 \times 0.01 = 0.00250.25×0.01=0.0025。
- 一个困难的正样本(p t = 0.4 p_t=0.4pt=0.4),乘以α = 0.75 \alpha=0.75α=0.75后,梯度为0.75 × 0.6 = 0.45 0.75 \times 0.6 = 0.450.75×0.6=0.45。
从绝对值看,困难正样本梯度已经大了 180 倍。但问题在于:容易分负样本有成千上万个。10000 个易分负样本累积梯度 =10000 × 0.0025 = 25 10000 \times 0.0025 = 2510000×0.0025=25,依然碾压少数几个困难正样本。
类别加权无法解决“海量弱信号淹没少数强信号”的物理本质。
3. Focal Loss的核心手术:从“类别权重”转向“难度权重”
Focal Loss 的原始定义:
F L ( p t ) = − ( 1 − p t ) γ log ( p t ) FL(p_t) = -(1 - p_t)^\gamma \log(p_t)FL(pt)=−(1−pt)γlog(pt)
其中γ ≥ 0 \gamma \ge 0γ≥0(通常取 2)。
加上类别平衡变体(实践中更常用):
F L ( p t ) = − α t ( 1 − p t ) γ log ( p t ) FL(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t)FL(pt)=−αt(1−pt)γlog(pt)
但真正的灵魂不是α t \alpha_tαt,而是( 1 − p t ) γ (1 - p_t)^\gamma(1−pt)γ这个调制因子。
我们看梯度(忽略α t \alpha_tαt的简单情形):
∂ F L ∂ x = ( 1 − p t ) γ [ γ p t log ( p t ) + ( p t − 1 ) ] \frac{\partial FL}{\partial x} = (1 - p_t)^\gamma \left[ \gamma p_t \log(p_t) + (p_t - 1) \right]∂x∂FL=(1−pt)γ[γptlog(pt)+(pt−1)]
更直观地,梯度相对 CE 的缩放比例为:
缩放因子 = ( 1 − p t ) γ ( γ p t log ( p t ) + 1 ) \text{缩放因子} = (1 - p_t)^\gamma \left( \gamma p_t \log(p_t) + 1 \right)缩放因子=(1−pt)γ(γptlog(pt)+1)
但工程上更容易理解其行为:
- 当p t p_tpt很大(易分样本,p t → 1 p_t \to 1pt→1):( 1 − p t ) γ → 0 (1 - p_t)^\gamma \to 0(1−pt)γ→0,梯度被指数级压制。一个p t = 0.99 p_t=0.99pt=0.99的样本,γ = 2 \gamma=2γ=2时,其损失权重仅为 CE 的0.01 2 = 0.0001 0.01^2 = 0.00010.012=0.0001。直接砍掉 4 个数量级。
- 当p t p_tpt很小(难分样本,p t ≤ 0.5 p_t \le 0.5pt≤0.5):( 1 − p t ) γ (1 - p_t)^\gamma(1−pt)γ接近 1 或更大(当p t = 0.2 p_t=0.2pt=0.2,系数为 0.64),损失几乎保留原样。
效果立竿见影:
- 10000 个易分负样本,原本累积梯度为 100(假设 CE 下每个贡献 0.01)。
- Focal 后每个贡献0.01 × 0.0001 = 1 e − 6 0.01 \times 0.0001 = 1e-60.01×0.0001=1e−6,总累积梯度 = 0.01。
- 少数困难正样本(比如 5 个,每个p t = 0.3 p_t=0.3pt=0.3,梯度约 0.7),总梯度约 3.5。
角色彻底反转——少数困难样本现在主导了梯度流。
4. 碾压的本质:从“样本数量竞争”变为“样本难度竞争”
CrossEntropy 的优化动力学本质是“数量竞赛”——哪一类样本数量多,它的累积梯度就大,参数就偏向哪一类。
Focal Loss 将优化动力学重构为“难度竞赛”:
- 所有已经被正确分类且高置信度的样本(无论正负),自动退出梯度竞争。
- 只有当前仍处于“决策边界附近”或“预测错误”的困难样本,才保留有效梯度。
这意味着:
- 负样本即使成千上万,只要它们简单,就几乎不贡献梯度——模型不会为了它们浪费参数容量。
- 正样本即使稀少,只要它们困难,就能持续获得高梯度——驱动决策边界向正样本空间移动。
- 随着训练进行,原先困难的正样本逐渐变得容易,其梯度自动衰减,模型注意力平滑转移到剩余困难样本——这是一种自适应的课程学习(Curriculum Learning)。
而类别加权的 CE 不具备这种动态衰减能力——它对所有样本一视同仁地按类别缩放,永远无法“遗忘”已学好的简单样本。
5. 实验层面的“碾压”数据(可复现)
以 RetinaNet 在 COCO 目标检测上的经典结果为例(Lin et al., 2017):
| 损失函数 | AP (0.5:0.95) | 小物体 AP | 大物体 AP |
|---|---|---|---|
| CE + 类别权重 | 30.5 | 12.3 | 45.2 |
| Focal Loss (γ=2) | 36.0 | 18.5 | 48.7 |
+5.5 mAP 的提升,在 2017 年相当于整整一代模型的差距。而这一切没有增加任何网络参数,没有改变数据采样策略,仅仅替换了 Loss 函数。
在文本分类、广告点击率预估、医疗影像罕见病检测等极度不平衡任务中,Focal Loss 带来的提升往往更剧烈——F1-score 从 0.2 跃升至 0.6 是常态。
6. 何时Focal Loss会“过杀”?——工程陷阱
Focal Loss 并非万能灵药。三种场景下它可能表现不如 CE:
- 数据集本身平衡,或各类别都包含足够多的困难样本:此时压制易分样本反而会放大噪声,导致训练震荡,准确率下降。
- 标签存在噪声:Focal Loss 会持续聚焦于那些“难以拟合”的样本,而这些样本很可能是标注错误的异常点。γ=2 时模型会过度拟合噪声标签。
- 正样本本身就极其简单(例如正负类在特征空间天然线性可分):此时 Focal Loss 的多余调制只会减慢收敛速度,没有实质收益。
实践建议:
- 对不平衡但非极度(<1:100)的任务,优先尝试类别加权 CE。
- 对 >1:1000 且困难样本明显的任务,从 γ=1.5 开始搜索,配合早停防止过拟合噪声。
- 始终监控验证集上的精确率/召回率曲线,而非仅看 Loss 值——Focal Loss 的训练 Loss 往往高于 CE,这是正常的(因为难样本被放大了),但验证指标会告诉你真相。
7. 总结:从“平均主义”到“精英主义”的范式跃迁
CrossEntropy 是一个“平均主义者”——它试图降低所有样本的平均损失,于是被海量简单样本绑架,无视少数困难少数类。
Focal Loss 是一个“精英主义者”——它只关心那些尚未被掌握的困难样本,一旦样本被掌握,立即撤回梯度支持,将计算资源让给其他困难样本。
这种从“样本数量”到“样本难度”的注意力迁移,使得 Focal Loss 在不引入额外数据、不增加推理成本的前提下,从根本上重构了深度模型在不平衡分布上的优化地貌。
下一次,当你面对正负样本 100:1 的直觉警觉时,不要只调 class_weight——问问自己:我的损失函数,是在奖励“多数”,还是奖励“难度”?
Focal Loss 给出的答案,至今仍是最优雅的底层手术之一。
如果你自己有电子文档需要在线阅读的需求:
如果你有word\Excel\ppt文档需要在线阅读的需求:
如果你希望你的电子文档在手机、平板、电脑阅读时进度同步的需求:
可以试试【个人文档管理平台】:www.mcbook.site
一杯奶茶钱就可以成为会员,省去了文档在公司/家里/邮箱 传来传去的麻烦。
更多技术文章见公众号: 大城市小农民
推荐阅读:如何管理我的电子书籍?
