1 focal loss的概述
焦点损失函数 Focal Loss(2017年何凯明大佬的论文)被提出用于密集物体检测任务。
当然,在目标检测中,可能待检测物体有1000个类别,然而你想要识别出来的物体,只是其中的某一个类别,这样其实就是一个样本非常不均衡的一个分类问题。
而Focal Loss简单的说,就是解决样本数量极度不平衡的问题的。
说到样本不平衡的解决方案,想必大家是知道一个混淆矩阵的f1-score的,但是这个好像不能用在训练中当成损失。而Focal loss可以在训练中,让小数量的目标类别增加权重,让分类错误的样本增加权重。
先来看一下简单的二值交叉熵的损失:
- y’是模型给出的预测类别概率,y是真实样本。就是说,如果一个样本的真实类别是1,预测概率是0.9,那么
就是这个损失。
- 讲道理,一般我不喜欢用二值交叉熵做例子,用多分类交叉熵做例子会更舒服。
【然后看focal loss的改进】:
这个增加了一个
的权重值,怎么理解呢?就是如果给出的正确类别的概率越大,那么
就会越小,说明分类正确的样本的损失权重小,反之,分类错误的样本的损权重大。
【focal loss的进一步改进】:
这里增加了一个
,这个alpha在论文中给出的是0.25,这个就是单纯的降低正样本或者负样本的权重,来解决样本不均衡的问题。
两者结合起来,就是一个可以解决样本不平衡问题的损失focal loss。
【总结】:
解决了样本的不平衡问题;
解决了难易样本不平衡的问题。让样本更重视难样本,忽视易样本。
- 总之,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):
可以看出这个梯度模长,其实就是模型给出的置信度
与这个样本真实的标签之间的差值(距离)。g越小,说明预测越准,说明样本越容易分类。
下图中展示了g与样本数量的关系:
【从图中可以看到】
- 梯度模长接近于0的样本多,也就是易分类样本是非常多的
- 然后样本数量随着梯度模长的增加迅速减少
- 然后当梯度模长接近1的时候,样本的数量又开始增加。
GHM是这样想的,对于梯度模长小的易分类样本,我们忽视他们;但是focal loss过于关注难分类样本了。关键是难分类样本其实也有很多!,如果模型一直学习难分类样本,那么可能模型的精确度就会下降。所以GHM对于难分类样本也有一个衰减。
那么,GHM对易分类样本和难分类样本都衰减,那么真正被关注的样本,就是那些不难不易的样本。而抑制的程度,可以根据样本的数量来决定。
这里定义一个GD,梯度密度:
是计算在梯度g位置的梯度密度;
就是样本k的梯度
是否在
这个区间内。
就是
这个区间的长度,也就是
总之,
就是梯度模长在
内的样本总数除以
.
然后把每一个样本的交叉熵损失除以他们对应的梯度密度就行了。
表示第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的话,那么很可能出现不均衡的情况。
【我个人觉得的处理方法】
- 可以使用上一个epoch的梯度密度,来作为这一个epoch来使用;
- 或者一开始先使用mini-batch计算梯度密度,然后模型收敛速度下降之后,再使用第一种方式进行更新。