【损失函数:Focal Loss】一、正负样本不均衡问题
Class (正负样本不平衡) 带来的问题就是:样本中会存在大量的easy , 且都是负样本(属于背景的样本) 。这样 , easy会对loss起主要贡献作用 , 会主导梯度的更新方向 , 网络学不到有用的信息 , 无法对进行准确分类 。
还有一个问题 , 为什么two stage不会有这样的问题呢或者为什么two stage没有one stage这么严重呢?
因为 , 对于two stage来说 , 首先利用RPN产生 , 这一步就已经删去了很多easy。我们对这些 进行筛选 , 可以人为控制正负样本的比例为1:3 。此外 , 对于负样本的选取 , 可以通过在线难例挖掘 , 选取有利于网络更新的难分样本 , 让网络学习到有用的信息 , 进行参数的更新 。
因此 , one stage在检测mAP上不如two stage 。
二、解决方案:Focal Loss
如下是未变化前的交叉熵(cross ) loss , 以二分类为例:
通过实验发现 , 即使是easy (Pt >> 0.5) , 它的loss也很高 , 所以当这种样本的数量较多的时候 , 累计起来就会比较大了 , 甚至会超过那些概率较小的样本(hard ) , 导致对于那些hard 的学习效果不佳 , 这也就是为什么正负样本不均衡会导致学习效果不佳 , 太多的简单样本 , 累加起来 , 会产生较大的影响 , 量变产生质变 。如下图蓝线:
![损失函数:Focal Loss](http://img.gansulong.com/230707/213I24591-0.png)
文章插图
可见普通的交叉熵对于正样本而言 , 输出概率越大损失越小 。对于负样本而言 , 输出概率越小则损失越小 。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优 。
因此 , 对于大量的easy , 这些loss会主导梯度下降的方向 , 淹没少量的正样本的影响 。所以 , 我们要解决:1> 正负样本不平衡;2>easy和hard 不平衡问题 。
1、正负样本不均衡问题
为交叉熵加一个权重alpha , 用来平衡正负样本本身的比例不均 , 其中权重因子的大小一般为相反类的比重 。即负样本越多 , 给它的权重越小 。这样就可以降低负样本的影响 。文中alpha取0.25 , 即正样本要比负样本占比小 , 这是因为负例易分 。
也可以这么理解:加一个小于1的超参数 , 相当于把算是Loss曲线整体往下拉一些 , 是的当概率较大的时候影响减小 。
2、easy和hard 不平衡问题
针对easy和hard样本 , 在原有的基础上加了一个因子 , 其中gamma>0使得减少易分类样本的损失 。使得更关注于困难的、错分的样本 。我们定义损失函数如下:
其中 , gamma range from 0 to 5. 例如gamma为2 , 对于正类样本而言 , 预测结果为0.95肯定是简单样本 , 所以(1-0.95)的gamma次方就会很小 , 这时损失函数值就变得更小 。而预测概率为0.3的样本其损失相对很大 。对于负类样本而言同样 , 预测0.1的结果应当远比预测0.7的样本损失值要小得多 。对于预测概率为0.5时 , 损失只减少了0.25倍 , 所以更加关注于这种难以区分的样本 。这样减少了简单样本的影响 , 大量预测概率很小的样本叠加起来后的效应才可能比较有效 。
举例:取γ=2 , 假如分类的概率是p=0.9 , 则原来的loss=-log(0.9) =0.046 , 现在-(1-0.9)^2 * log(0.9) = 0.00046,缩小了约100倍 , 加入分类概率是p=0.968 , 那么就会缩小约1000倍 , 如果概率小于0.5 , 如:p=0.4 , -log(0.4) == 0.39, -(1-0.4)^2 * log(0.4) = 0.14,只是减少了不到3倍 。
- 清朝覆灭后何物让中国损失很大?
- Excel学习笔记:P31-这个函数的功能强到像万能瑞士军刀?
- 史上规模最大的内战:激战十四年,人口损失七千万以上 中国历史损失人口之最
- 这个灰扒的损失惨重!唐玄宗这样扒了杨玉环
- 关羽失荆州:令蜀汉在此战中损失了多少人才
- 1923年日本损失了340万人以后对中国做了什么?
- 全球十部经典电影推荐,绝对是珍藏中的经典,少看一部都是损失! 世界十大著名电影
- 【损失函数】Keras Loss Function
- python的os.walk函数的使用及对于root,dirs
- 俄乌冲突一周年的5个数字:超2万平民伤亡,全球损失破万亿 俄乌战争导弹数量历史之最