携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
前言
在 Focal Loss 出现之前,具有较高精度的目标检测模型还是出自于 two-stage 阵营,虽然 one-stage 目标检测都具有很好性能,实时性,但是就准确度方面相对于 two-stage 还是略逊一筹。
整体来看 one-stage 因为其结构简单,性能又好,相对于 two-stage 来说可能更具有潜力。作者认为影响网络准确度主要就是正负样本不均衡,以及 loss 更多关注了那些容易识别负例样本上了。
为了检验 focal loss 有效性,作者设计出了一个简单 one-stage 网络 retinaNet。retinaNet 不负众望,凭借 focal loss 在准确度上和当时主流 two-stage 目标检测网络棋逢对手,但是速度要比他们快。
最近为了分享就一个问题会搜集看多篇关于同一个问题文章,发现关于一些关于一些关键概念,不同文章给出定义或者解释会有一些差异性,那么什么又是正确解释呢? 就拿关于难分正例样来说? 是模型预测是目标的概率比较低,但预测为正例样本的样本是难分正样本还是将正例样本分为了负例样本的正例样本算是难分正例样本呢? 带着这些疑惑我们开始搜索多篇文章,也看了不少视频,并且凭借对自己理解尝试去找到答案
正负样本不均衡问题
在两阶段目标检测中,因为存在候选框生成网络,这样就可以通过回归和前景和背景分类,通过候选框生成网络已经过滤掉了大部分负例样本,最后仅保留 1k-2k 的框做为候选框,这样就已经过滤掉大量背景的负样本。接下来在像 Faster RCNN 这样网络还会进行采样处理,让前景和背景的比例大概在 1:3 这样比例。
由此不难看出在两阶段那边,人家已经有了一套的方案来解决这个样本不均衡的问题。
Focal Loss
首先 Focal Loss 用于解决正负样本不均衡问题,首先我们样清除出在单阶段目标检测中,关于正负样本的定义,在单阶段目标检测中,首先会将图像划分为网格,然后在每一个网格中生成一系列宽高比不同、尺寸大小不同的先验框,那么与目标的真实框满足匹配条件的先验框就作为正例样本,而那些不满足匹配条件的样本就作为负例样本。
在正式开始 Focal Loss 介绍,我们还需要将什么是易于分类样本,什么又是难于分类的样本呢?
我们来看下面交叉熵这个损失函数
- 正样本情况下
- 负样本情况下
在这张图我们只看蓝色的线,因为蓝色线对应的是 也就是 crossEntropy 对应损失函数的曲线,接下来我们提到 crossEntropy 就是 focal Loss 的一个特例。为了推导接下来把公式化简一下
正负样本不均衡
因为存在大量负样本,例如在一张图像中对于一阶段目标检测模型 SSD 通常要生成 7308 如此多候选框,而其中可能只有 5,6 个甚至 1,2 为目标,大量候选框都是负例样本,即使通常一些方法降低负例候选框数量,不过这个并不算好的方法,而且依然存在不均衡的问题。正是因为大量候选框为负例样本,他们在 loss 中也占有比较大比重从而导致模型倾向于学习将候选框分类为负例样本,那么除了减少负例样本数量,可不可以通过降低负例样本对 Loss 的影响程度来解决正负例样本不均衡的问题呢?答案是可行的,我们引入
取值范围在 0 - 1 ,可以通过调整这个来控制正负样本在 Loss 所占的权重,当 在 0 - 0.5 之间取值时,这是就是增强了负例样本的权重,而 在 0.5 - 1 之间取值时增加正例样本的权重
难易程度
从图上不难看出对于分类效果比较好的区域(well-classified examples) loss 值就会相对小很多,这个区域可能是容易分类负例样本,因为很多背景是很容识别出来,但是对于容易分类区域,那么如果大量易分负样本累加起来就得到比较大损失比例,这样 loss 就会集中与那些容易分类样本上,例如对于 这样负例样本如果有 1000 个,那么损失值就是 。Focal loss 为了解决这个问题添加动态。
我们再来看这张图,这张图 x 轴为模型预测为正例样本概率,而 y 轴为 loss 值,也可以看出 gamma 取值不同 loss 对于 probability of ground truth class 不同曲线 ,当 gamma 取 0 时候也就是交叉熵损失函数,当 gamma 值增大在 well-classified examples 也即是易分类样本他们对曲线是低于交叉熵 loss 曲线而且随之 gamma 增大越来越低,也就是他们对 loss 损失贡献越来越小。
当我们输入的样本属于正例样本时候我们 pt 就等于 p 如果 p 预测概率非常接近 1 也即是网络可以很好识别这个样本时候,也就是说明这个样本就是容易分类的样本,那么 1 - pt 的值就非常小,因为取了 gamma 指数,所以得到他的权重就非常小,如果是难分类样本 pt 值就是比较小,1-pt 就比较大得到权重也就是比较大了。
这里不难看出 crossEntropy 是 focal Loss 的特例,也就是当 时,就是 crossEntropy
- 其中 是针对正负样本不均衡
- 是针对样本学习难易程度来
接下来我们通过一个例子来看 focal loss 的有效性,我们先假设 来,让 loss 忽略正负样本比例不均衡问题,然后将 设置为 2
- 首先当 比较小,也就是说明这个一个比较不容易分类的样本
-math.log(0.1)
-(1-0.1)**2 * math.log(0.1)
- 我们再去看一看 情况
我们现在不难看出在靠近于比较难分类样本,对比 CE 和 FL 两个 loss 差异,从数值来看差异并不大,但是对于容易分类的样本来说 FL 下降比较大。
简单总结一下,对于 FL 相对于 CE Loss 来说,当 接近于 0 FL 相对于 CE Loss 改变不会很大,但是当 接近于 1 说明分类效果已经很好,这是 FL 相对 CE 机会下降很多。