Focal loss论文解析
Focal loss是目标检测领域的一篇十分经典的论文,它通过改造损失函数提升了一阶段目标检测的性能,背后关于类别不平衡的学习的思想值得我们深入地去探索和学习。正负样本失衡不仅仅在目标检测算法中会出现,在别的机器学习任务中同样会出现,这篇论文为我们解决类似问题提供了一个很好的启发,所以我认为无论是否从事目标检测领域相关工作,都可以来看一看这篇好论文。
论文的关键性改进在于对损失函数的改造以及对参数初始化的设置。
首先是对损失函数的改造。论文中指出,限制目标检测网络性能的一个关键因素是类别不平衡。二阶段目标检测算法相比于一阶段目标检测算法的优点在于,二阶段的目标检测算法通过候选框筛选算法(proposal stage)过滤了大部分背景样本(负样本),使得正负样本比例适中;而一阶段的目标检测算法中,需要处理大量的负样本,使得包含目标的正样本信息被淹没。这使得一阶段目标检测算法的识别准确度上比不上二阶段的目标检测算法。
为了解决这个问题,Focal loss使用了动态加权的思想,对于置信度高的样本,损失函数进行降权;对于置信度低的样本,损失函数进行加权,使得网络在反向传播时,置信度低的样本能够提供更大的梯度占比,即从未学习好的样本中获取更多的信息(就像高中时期的错题本一样,对于容易错的题目,包含了更多的信息量,需要更加关注这种题目;而对于屡屡正确的题目,可以少点关注,说明已经掌握了这类型的题目)。
其巧妙之处就在于,通过了网络本身输出的概率值(置信度)去构建权重,实现了自适应调整权重的目的。
公式的讲解
Focal loss是基于交叉熵损失构建的,二元交叉熵的公式为
-\log (p) & \text { if } y = +1 \\
-\log (1-p) & \text { y = -1 }
\end{array}\right.
\]
为了方便表示,定义\(p_t\)为分类正确的概率
p & \text { if } y = +1 \\
1-p & \text { y = -1 }
\end{array}\right.
\]
则交叉熵损失表示为\(CE(p,y)=CE(p_t)=-log(p_t)\)。如前文所述,通过置信度对损失进行缩放得到Focal loss。
\]
其中,\(\alpha_{1}=\left\{\begin{array}{ll}
\alpha & \text { if } y = +1 \\
1-\alpha & \text { y = -1 }
\end{array}\right.\)为缩放乘数(直接调整正负样本的权重),\(\gamma\)为缩放因子,\((1-p_t)\)可以理解为分类错误的概率。公式中起到关键作用的部分是\((1-p_t)^\gamma\)。为了给易分样本降权,通常设置\(\gamma>1\)。
对于正确分类的样本,\(p_t \to 1 \Rightarrow(1-p_t) \to 0\),受到\(\gamma\)的影响很大,\((1-p_t)^\gamma \approx 0\);
对于错误分类的样本,\(p_t \to 0 \Rightarrow(1-p_t) \to 1\),受到\(\gamma\)的影响较小,\((1-p_t)^\gamma \approx (1-p_t)\),对于难分样本的降权较小。
Focal loss本质上是通过置信度给易分样本进行更多的降权,对难分样本进行更少的降权,实现对难分样本的关注。
参数初始化
论文中还有一个比较重要的点是对于子网络最后一层权重的初始化方式,关系到网络初期训练的性能。这里结合论文和我看过的一篇博文进行详细的展开。常规的深度学习网络初始化算法,使用的分布是高斯分布,根据概率论知识,两个高斯分布的变量的乘积仍然服从高斯分布。假设权重\(w\sim N(\mu_w,\sigma_w^2)\),最后一层的特征\(x\sim N(\mu_x,\sigma_x^2)\),则\(wx \sim N(\mu_{wx},\sigma_{wx}^2)\)。
\sigma_{wx}=\frac{\sigma_x^2\sigma_w^2}{\sigma_x^2+\sigma_w^2}
\]
其中\(x\)的分布取决于网络的结果,\(w\)的分布参数为\(\mu_w=0,\sigma_w^2=10^{-4}\),只需\(x\)的分布参数满足\(\sigma_x^2\gg 10^{-4},\sigma_x^2\gg10^{-4}\mu_x\)成立,有如下的不等式。(一般情况下,这两个条件是成立的。)
\sigma_{wx}=\frac{\sigma_x^2\sigma_w^2}{\sigma_x^2+\sigma_w^2}=\frac{10^{-4}}{1+\frac{10^{-4}}{\sigma_x^2}}\approx10^{-4} \text{由于}\sigma_x^2\gg10^{-4}
\]
根据上述推导,\(wx\)服从一个均值为0,方差很小的高斯分布,可以在很大概率上认为它就等于0,所以网络最后一层的输出为
\]
令\(\pi\)为网络初始化时输出为正类的概率,设置为一个很小的值(0.01),则网络在训练初期,将样本都划分为负类,对于正类\(p_t=0.01\),负类\(p_t=0.99\),则训练初期,正类都被大概率错分,负类都被大概率正确分类,所以在训练初期更加关注正类,避免初期的正类信息被淹没在负类信息中。
总结
总的来说,Focal loss通过对损失函数的简单改进,实现了一种自适应的困难样本挖掘策略,使得网络在学习过程中关注更难学习的样本,在一定程度上解决了正负样本分布不均衡的问题(由于正负样本分布不均衡,对于稀少的正样本学习不足,导致正样本普遍表现为难分样本)。
参考资料
Focal loss论文解析的更多相关文章
- 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)
论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...
- Focal Loss for Dense Object Detection 论文阅读
何凯明大佬 ICCV 2017 best student paper 作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确 ...
- [论文理解]Focal Loss for Dense Object Detection(Retina Net)
Focal Loss for Dense Object Detection Intro 这又是一篇与何凯明大神有关的作品,文章主要解决了one-stage网络识别率普遍低于two-stage网络的问题 ...
- 论文阅读|Focal loss
原文标题:Focal Loss for Dense Object Detection 概要 目标检测主要有两种主流框架,一级检测器(one-stage)和二级检测器(two-stage),一级检测器, ...
- 深度学习笔记(八)Focal Loss
论文:Focal Loss for Dense Object Detection 论文链接:https://arxiv.org/abs/1708.02002 一. 提出背景 object detect ...
- Focal Loss笔记
论文:<Focal Loss for Dense Object Detection> Focal Loss 是何恺明设计的为了解决one-stage目标检测在训练阶段前景类和背景类极度不均 ...
- [Network Architecture]Mask R-CNN论文解析(转)
前言 最近有一个idea需要去验证,比较忙,看完Mask R-CNN论文了,最近会去研究Mask R-CNN的代码,论文解析转载网上的两篇博客 技术挖掘者 remanented 文章1 论文题目:Ma ...
- 处理样本不平衡的LOSS—Focal Loss
0 前言 Focal Loss是为了处理样本不平衡问题而提出的,经时间验证,在多种任务上,效果还是不错的.在理解Focal Loss前,需要先深刻理一下交叉熵损失,和带权重的交叉熵损失.然后我们从样本 ...
- 目标检测 | RetinaNet:Focal Loss for Dense Object Detection
论文分析了one-stage网络训练存在的类别不平衡问题,提出能根据loss大小自动调节权重的focal loss,使得模型的训练更专注于困难样本.同时,基于FPN设计了RetinaNet,在精度和速 ...
随机推荐
- VUE响应式原理-如何追踪变化
Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接 如何追踪变化 当你把一个普通的 Ja ...
- 你可能不了解的java枚举
枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型: public enum Color { RED, GREEN, BLUE, YELLOW; pub ...
- 微信小程序授权登录--PHP后端接口
由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...
- 如何配置node环境变量
1,安装node.js 最后安装的目录在 检测node安装成功 node -v 如果报错 没有默认装在c盘 pro 需要配置环境变量 Npm node package manag ...
- 小程序开发-Map地图组件
Map组件 是原生组件,使用时请注意相关限制.个性化地图能力可在小程序后台"设置-开发者工具-腾讯位置服务"申请开通. 设置subkey后,小程序内的地图组件均会使用该底图效果,底 ...
- 14_Python语法示例(面向对象)
1.自己写一个Student类,此类的对象有属性name, age, score, 用来保存学生的姓名,年龄,成绩 # 1)写一个函数input_student读入n个学生的信息,用对象来存储这些信息 ...
- 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)
上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现. 交并比IOU(Intersection over union) 在目标检 ...
- 计算Pi
程序: package pai; import java.math.BigDecimal; public class ComplexPi { BigDecimal result; public Com ...
- 20190923-01Linux帮助命令 000 009
man 获得帮助信息 1. 基本语法 man [命令或配置文件] (功能描述:获得帮助信息) 2.显示说明 表1-6 信息 功能 NAME 命令的名称和单行描述 SYNOPSIS 怎样使用命令 DES ...
- 蓝奏网盘CMD控制台
LanZouCloud-CMD 2.0 基于蓝奏云API开发的CMD版蓝奏云控制台 Github : https://github.com/zaxtyson/LanZouCloud-CMD 更新说明 ...