五分钟学会:焦点损失函数 FocalLoss 与 GHM

2020-07-14 11:05:17 浏览数 (1)

1 focal loss的概述

焦点损失函数 Focal Loss(2017年何凯明大佬的论文)被提出用于密集物体检测任务。

当然,在目标检测中,可能待检测物体有1000个类别,然而你想要识别出来的物体,只是其中的某一个类别,这样其实就是一个样本非常不均衡的一个分类问题。

而Focal Loss简单的说,就是解决样本数量极度不平衡的问题的。

说到样本不平衡的解决方案,想必大家是知道一个混淆矩阵的f1-score的,但是这个好像不能用在训练中当成损失。而Focal loss可以在训练中,让小数量的目标类别增加权重,让分类错误的样本增加权重

先来看一下简单的二值交叉熵的损失:

  • y’是模型给出的预测类别概率,y是真实样本。就是说,如果一个样本的真实类别是1,预测概率是0.9,那么
-log(0.9)

就是这个损失。

  • 讲道理,一般我不喜欢用二值交叉熵做例子,用多分类交叉熵做例子会更舒服。

【然后看focal loss的改进】:

这个增加了一个

(1-y')^gamma

的权重值,怎么理解呢?就是如果给出的正确类别的概率越大,那么

(1-y')^gamma

就会越小,说明分类正确的样本的损失权重小,反之,分类错误的样本的损权重大


【focal loss的进一步改进】:

这里增加了一个

alpha

,这个alpha在论文中给出的是0.25,这个就是单纯的降低正样本或者负样本的权重,来解决样本不均衡的问题

两者结合起来,就是一个可以解决样本不平衡问题的损失focal loss。


【总结】:

alpha

解决了样本的不平衡问题;

beta

解决了难易样本不平衡的问题。让样本更重视难样本,忽视易样本。

  1. 总之,Focal loss会的关注顺序为:样本少的、难分类的;样本多的、难分类的;样本少的,易分类的;样本多的,易分类的。

2 GHM

  • GHM是Gradient Harmonizing Mechanism。

这个GHM是为了解决Focal loss存在的一些问题。

【Focal Loss的弊端1】让模型过多的关注特别难分类的样本是会有问题的。样本中有一些异常点、离群点(outliers)。所以模型为了拟合这些非常难拟合的离群点,就会存在过拟合的风险。

2.1 GHM的办法

Focal Loss是从置信度p的角度入手衰减loss的。而GHM是一定范围内置信度p的样本数量来衰减loss的。

首先定义了一个变量g,叫做梯度模长(gradient norm)

可以看出这个梯度模长,其实就是模型给出的置信度

p^*

与这个样本真实的标签之间的差值(距离)。g越小,说明预测越准,说明样本越容易分类。

下图中展示了g与样本数量的关系:

【从图中可以看到】

  • 梯度模长接近于0的样本多,也就是易分类样本是非常多的
  • 然后样本数量随着梯度模长的增加迅速减少
  • 然后当梯度模长接近1的时候,样本的数量又开始增加。

GHM是这样想的,对于梯度模长小的易分类样本,我们忽视他们;但是focal loss过于关注难分类样本了。关键是难分类样本其实也有很多!,如果模型一直学习难分类样本,那么可能模型的精确度就会下降。所以GHM对于难分类样本也有一个衰减。

那么,GHM对易分类样本和难分类样本都衰减,那么真正被关注的样本,就是那些不难不易的样本。而抑制的程度,可以根据样本的数量来决定。

这里定义一个GD,梯度密度

GD(g)=frac{1}{l(g)}sum_{k=1}^N{delta(g_k,g)}
GD(g)

是计算在梯度g位置的梯度密度;

delta(g_k,g)

就是样本k的梯度

g_k

是否在

[g-frac{epsilon}{2},g frac{epsilon}{2}]

这个区间内。

l(g)

就是

[g-frac{epsilon}{2},g frac{epsilon}{2}]

这个区间的长度,也就是

epsilon

总之,

GD(g)

就是梯度模长在

[g-frac{epsilon}{2},g frac{epsilon}{2}]

内的样本总数除以

epsilon

.

然后把每一个样本的交叉熵损失除以他们对应的梯度密度就行了。

L_{GHM}=sum^N_{i=1}{frac{CE(p_i,p_i^*)}{GD(g_i)}}
CE(p_i,p_i^*)

表示第i个样本的交叉熵损失;

GD(g_i)

表示第i个样本的梯度密度;

2.2 论文中的GHM

论文中呢,是把梯度模长划分成了10个区域,因为置信度p是从0~1的,所以梯度密度的区域长度就是0.1,比如是0~0.1为一个区域。

下图是论文中给出的对比图:

【从图中可以得到】

  • 绿色的表示交叉熵损失;
  • 蓝色的是focal loss的损失,发现梯度模长小的损失衰减很有效;
  • 红色是GHM的交叉熵损失,发现梯度模长在0附近和1附近存在明显的衰减。

当然可以想到的是,GHM看起来是需要整个样本的模型估计值,才能计算出梯度密度,才能进行更新。也就是说mini-batch看起来似乎不能用GHM。

在GHM原文中也提到了这个问题,如果光使用mini-batch的话,那么很可能出现不均衡的情况。

【我个人觉得的处理方法】

  1. 可以使用上一个epoch的梯度密度,来作为这一个epoch来使用;
  2. 或者一开始先使用mini-batch计算梯度密度,然后模型收敛速度下降之后,再使用第一种方式进行更新。

0 人点赞