文章目录

  • 1 Focal loss解决什么问题
    • 1.1 正/负样本 定义
    • 1.2 易/难分类样本 定义
    • 1.3 怎么解决呢?
  • 2 控制正负样本的加权 权重
  • 3 控制易/难分类样本的加权 权重
  • 4 两种权重控制方法合并
  • 5 代码演示权重合并
  • 6 Focal loss有点问题,继而引出GHM
  • 7 感谢链接

1 Focal loss解决什么问题

简而言之,Focal loss用于解决样本不均衡问题。不均衡表现在两个方面:

  • 正负样本数量不均衡
  • 易分类的样本难分类的样本数量不均衡

1.1 正/负样本 定义

一张图像可能会生成很多候选框,但其中只有很少一部分是包含目标的,有目标的就是正样本,没有目标的就是负样本

1.2 易/难分类样本 定义

一个二分类问题,样本1属于类别1的概率(置信度)为0.9,样本2属于类别1的概率(置信度)为0.6,显然前者更可能是类别1,其就是易分类样本;后者有可能是类别1,只是概率比较低,称其为难分类样本。

1.3 怎么解决呢?

都用来算损失,一方数量多,主导了总损失?加权解决!
负样本数量多,权重系数小点,正样本数量少,权重系数大点;
易分类样本数量多,权重系数小点,难分类样本数量少,权重系数大点。

提出Focal loss的作者认为:负样本、易分类样本对模型提升效果很小,模型应该主动关注那些正样本、难分类样本。(GHM,Gradient Harmonized Single-stage Detector认为这个假设是有问题的,比如样本中的离群点)

2 控制正负样本的加权 权重

二分类中,常用的交叉熵损失CE:

可以利用如下ptp_tpt​简化交叉熵loss:

此时,交叉熵损失可写为:

想要降低负样本的影响,可以在常规的损失函数前增加一个系数αtα_tαt​。与ptp_tpt​类似,当label=1的时候,αt=αα_t=ααt​=α;当label=otherwise的时候,αt=1−αα_t=1 - ααt​=1−α,ααα的范围为0到1。

此时便可以通过设置ααα实现控制正负样本对loss的贡献。

CE(p,y,α)={−α∗log(p)当y=1时−(1−α)∗log(1−p)otherwiseCE(p,y,α)=\begin{cases} -α * log(p) & 当y=1时 \\ -(1-α) * log(1-p) & otherwise \end{cases} CE(p,y,α)={−α∗log(p)−(1−α)∗log(1−p)​当y=1时otherwise​
注意:

  • 理论上讲,正样本少,它对loss的贡献应该大,故alpha应该大于0.5;
  • 但是,当与下面难易样本中操作结合到一起时,形式还逆转了,反而在这里要对正样本降权!大神论文中: α=0.25\alpha = 0.25α=0.25,下面的γ=2γ=2γ=2。

3 控制易/难分类样本的加权 权重

一个二分类问题,样本1属于类别1的概率ptp_tpt​(置信度)为0.9,样本2属于类别1的概率ptp_tpt​(置信度)为0.6,理解为 是某个类的概率越大,其越容易分类。

容易分类的样本有很多,越容易,ptp_tpt​越大,但每个容易样本对loss的贡献应该小点,可以用(1−pt)(1-p_t)(1−pt​)来作为其加权权重。

具体实现方式如下:

其中(1−pt)γ(1-p_t)^{γ}(1−pt​)γ称为调制系数(modulating factor)。

  • 当ptp_tpt​趋于0时,调制系数趋于1,对于总的loss的贡献很大。当ptp_tpt​趋于1时,调制系数趋于0,对于总的loss的贡献很小。
  • 当γ=0时,Focal loss就是传统的交叉熵损失,可以通过调整γ实现调制系数的改变。

4 两种权重控制方法合并

通过如下公式就可以实现控制正负样本的加权 权重控制易分类和难分类样本的加权 权重

5 代码演示权重合并

直接看代码注释,或者看下方b站链接的大佬视频讲解。

import numpy as np# --------------------------------------------------------------------------#
#   理论上讲,正样本少,它对loss的贡献应该大,故alpha应该大于0.5
#   但是,与下面难易样本中操作结合到一起时,形式还逆转了,反而在这里要对正样本降权!
#   这里与论文中保持一致,alpha=0.25,γ=2
# --------------------------------------------------------------------------#
alpha = 0.25
y_true = np.array([1,0,1,0])
y_pred = np.array([0.9,0.1,0.6,0.6])
alpha_weights = [alpha if y==1 else 1-alpha for y in y_true]
print("alpha_weights:", alpha_weights)p_t = np.zeros(4)
index1 = np.argwhere(y_true==1)
index0 = np.argwhere(y_true==0)
print("index1:", index1)
print("index0:", index0)# -------------------------------------------------------#
#   越容易分,y_pred中概率越大,对贡献应该越小,故用 1-y_pred
# -------------------------------------------------------#
p_t[index1] = (1-y_pred[index1])**2
p_t[index0] = (y_pred[index0])**2
print("p_t:", p_t)# -------------------------------#
#   两个权重相乘即得到最后的权重
# -------------------------------#
weights = p_t * alpha_weights
print("weights:", weights)

输出:

alpha_weights: [0.25, 0.75, 0.25, 0.75]
index1: [[0][2]]
index0: [[1][3]]
p_t: [0.01 0.01 0.16 0.36]
weights: [0.0025 0.0075 0.04   0.27  ]

这个结果,品,细品…

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

Focal loss易受噪音干扰,所以标注时一定别标错了!

6 Focal loss有点问题,继而引出GHM

Focal Loss让模型过多的关注特别难分类的样本是会有问题的
例如,样本中有一些异常点、离群点(outliers)。
当模型为了拟合这些非常难拟合的离群点时,会存在过拟合的风险。

继而,引出GHM。

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

具体的,以后再学,可参考链接:

https://www.cnblogs.com/PythonLearner/p/13416128.html
https://zhuanlan.zhihu.com/p/80594704

7 感谢链接

https://blog.csdn.net/weixin_44791964/article/details/102853782
https://www.bilibili.com/video/BV1E7411J72R

【Focal Loss】Focal Loss理解相关推荐

  1. CE Loss,BCE Loss以及Focal Loss的原理理解

    一.交叉熵损失函数(CE Loss,BCE Loss) 最开始理解交叉熵损失函数被自己搞的晕头转向的,最后发现是对随机变量的理解有偏差,不知道有没有读者和我有着一样的困惑,所以在本文开始之前,先介绍一 ...

  2. 《Focal Loss GHM Loss Dice Los》论文笔记

    Focal Loss 在二分类问题中,交叉熵损失定义如下: yyy 表示真实值,取值0与1,ppp表示模型预测正类的概率,取值0到1. 为了表述方便,将上述公式重新表述为: 对于类别不平衡问题,我们可 ...

  3. L1/L2/smooth_l1_loss/center_loss+Dice Loss+focal loss+各种IOU loss+kl散度

    一.L1/L2/smooth_l1_loss/center_loss公式与代码 1.公式 L2公式: smooth_L1公式: 2.三种函数numpy代码实现 import numpy as np i ...

  4. Loss——Focal Loss

    Loss--Focal Loss 一.简介 Focal Loss论文地址:https://arxiv.org/pdf/1708.02002.pdf Focal Loss是基于Cross Entropy ...

  5. 类别不均衡问题之loss大集合:focal loss, GHM loss, dice loss 等等

    数据类别不均衡问题应该是一个极常见又头疼的的问题了.最近在工作中也是碰到这个问题,花了些时间梳理并实践了类别不均衡问题的解决方式,主要实践了"魔改"loss(focal loss, ...

  6. OHEM,Focal loss,GHM loss二分类pytorch代码实现(减轻难易样本不均衡问题)

    https://mp.weixin.qq.com/s/iOAICJege2b0pCVxPkvNiA 综述:解决目标检测中的样本不均衡问题 该综述主要介绍了OHEM,Focal loss,GHM los ...

  7. BCE loss和 CE理解

    1. BCE loss:Binary Cross Entropy Loss BCE loss pytorch官网链接 1.1 解释 pytorch中调用如下.设置weight,使得不同类别的损失权值不 ...

  8. 一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss

    一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss 翻译自FesianXu, 2020/1/13, 原文链接 h ...

  9. Focal Loss与GHM 理解与使用

    一.理解 5分钟理解Focal Loss与GHM--解决样本不平衡利器 https://zhuanlan.zhihu.com/p/80594704 二.使用 GHM论文理解及实现 https://zh ...

  10. l1-norm loss l2-norm loss (l1范数和l2范数作为正则项的比较)

    l1-norm loss & l2-norm loss (l1范数和l2范数作为正则项的比较) l1-norm 和 l2-norm是常见的模型优化过程中的正则化项,对应到线性回归的领域分别为l ...

最新文章

  1. shell中单引号的嵌套
  2. TensorFlow example示例 Process finished with exit code -1073741819 (0xC0000005)
  3. Keil MDK-ARM下载 安装与和谐教程
  4. Linux网络监测在线工具
  5. 将用int型存储的时间转换成time时间格式笔记
  6. mui 时间样式错乱_微信公众号素材样式中心在哪?公众号动态分割线怎么添加?...
  7. stl vector 函数_vector :: crbegin()函数,以及C ++ STL中的示例
  8. springboot maven项目打jar包
  9. cnn风格迁移_愚蠢的CNN,换个马甲就认不出猫!但,这病能治 | ICLR Oral
  10. 业务逻辑实现方式的讨论:存储过程 good or bad?
  11. HEVC中的样点自适应补偿——Sample Adaptive Offset (SAO)
  12. 前端实现在线预览Word文件
  13. 关于苹果绕ID的一些注意事项,A6-A7 Sliver 6.2 小白少走弯路。
  14. python朋友圈点赞统计_微信公众号所有历史文章的标题/点赞数/阅读数统计
  15. 如果你是互联网创业者,这个视频值1万元
  16. SQL 存储过程使用
  17. 小米联系人删除怎么恢复
  18. cut out数据增强_数据增强:Mixup,Cutout,CutMix | Mosaic
  19. Python爬虫进阶(十):实战,Scrapy爬取贴吧
  20. 如何利用社交媒体进行跨境电商营销—扬帆际海

热门文章

  1. 10行代码玩转弹性调度的小把戏
  2. 日语动词变形(转载)
  3. css实现3d立体魔方
  4. tp6使用workman实现定时任务
  5. 原创:职场最忌讳的几大“想当然”
  6. 等到花儿也谢了的await
  7. Email - Boss's concerns
  8. SQL中Date 函数
  9. mysql报错不停止继续执行_mysql 8 启动失败(本地计算机上的mysql服务启动后停止。某些服务再未由其他服务或程序使用时将自动停止)...
  10. python下载电影_python爬取电影并下载