现状
先来回顾一下常用的 BinaryCrossEntropyLoss 公式如下
不难看出,CE是个“笨学生”。
考前复习的时候,「他不会划重点,对所有知识点 “一视同仁”」。
如果教科书上有100道例题,包括: 90道加减乘除 + 10道 三角函数。CE同学就会吭哧吭哧的“平均用力”反复练习这100道例题,结果可想而知——他会精通那90道个位数加减乘除题目,然后其他题目基本靠蒙。那10道他不会的题,往往还是分值高的压轴题。
解决办法
机智如你,想必已经有办法了 —— 「给他指个方向,别再“平均用力”就好了」
方法一、分科复习
每个【科目】的难度是不同的;你要花 30%的精力在四则运算,70%的精力在三角函数。— 老师告诉CE同学 第一个技巧
对应到公式中,就是针对每个类别赋予不同的权重,即下述
α
t
\alpha_t
αt:
方法二、刷题战术
每道【题目】的难度是不同的;你要根据以往刷类似题时候的正确率来合理分配精力。
— 老师告诉CE同学 第二个技巧
观察CE中的
p
t
p_t
pt ,它反映了模型对这个样本的识别能力(即 “这个知识点掌握得有多好”);显然,对于
p
t
p_t
pt越大的样本,我们越要打压它对loss的贡献。
FL是这么定义的:
这里有个超参数
γ
\gamma
γ; 直观来看,
γ
\gamma
γ越大,打压越重。如下图所示:
方法三、综合上述两者
调参经验
总结
-
机器学习分类问题中,各类别样本数差距悬殊是很常见的情况;这会干扰模型效果
-
通过将CrossEntropyLoss替换为综合版的FocalLoss,可以有效缓解上述问题
-
具体思路就是引入两个额外的变量来区分对待每个样本
– α t \alpha_t αt根据类别加权
– ( 1 − p t ) γ (1-p_t)^{\gamma} (1−pt)γ根据难度加权 -
代码实现很简单、调参也不复杂,详见上文