外观
焦点损失(focal loss)
Focal loss

二分类任务通常使用二元交叉熵(cross-entropy,BCE)损失函数(loss function)来训练:
为了记号方便,如果我们把 p_t 定义如下:

……那么我们也可以将交叉熵损失函数写成:

也就是说,BCE 损失的一个局限在于它对两个类别的概率预测赋予相同的权重,这从它的对称性可以明显看出:

为了更清楚地说明,考虑下表,它描绘了两个样本,一个来自少数类,另一个来自多数类,两者的损失相同:

当我们在不平衡数据集上使用 BCE 时,这就会带来问题,因为其中多数类的绝大多数样本都是“容易分类”的。因此,比如来自多数类样本的 0.03 这样的损失值,理想情况下应当比来自少数类的相同损失值赋予更低的权重。

焦点损失(focal loss)是解决这一问题的一个相当好用且有效的替代方案。它的定义如下:

如上图所示,它引入了一个额外的乘性因子,称为降权(downweighing),其中参数 γ(Gamma)是一个超参数。
γ 绘制 BCE(类别 y=1)和焦点损失(类别 y=1 以及 γ=3)的曲线,我们得到如下曲线:

如上图所示,焦点损失降低了模型相当有把握的那些预测的贡献。此外,(Gamma)的值越大,降权作用就越强,如下面的图所示:

继续往下看,虽然焦点损失函数降低了高置信度预测的贡献,但我们的工作还没完成。
此时的焦点损失函数仍然像 BCE 一样是对称的:

α 为了解决这个问题,我们必须再加入一个权重参数(α),它是类别频率的倒数,如下图所示:

α 该参数是类别频率的倒数。因此,最终的损失函数如下:

通过同时使用降权和反频率加权,模型会逐渐学到针对困难样本的模式,而不是始终对预测简单样本过于自信。

为了测试焦点损失在类别不平衡(class imbalance)场景下的效果,我创建了一个不平衡比例为 90:10 的模拟分类数据集:
接下来,我训练了两个神经网络(neural network)模型,它们具有相同的架构,都包含 2 个隐藏层(hidden layer):
- 一个使用 BCE 损失
- 另一个使用焦点损失
这两个模型的决策区域图和测试准确率如下图所示:

可以清楚地看到:
- 使用 BCE 损失训练的模型(左)总是预测多数类。
- 使用焦点损失训练的模型(右)相对更关注少数类的模式。因此,它的表现更好。下载这个 Jupyter 笔记本来上手焦点损失:https://bit.ly/45XzNZC。