Focal loss是目标检测领域的一篇十分经典的论文,它通过改造损失函数提升了一阶段目标检测的性能,背后关于类别不平衡的学习的思想值得我们深入地去探索和学习。正负样本失衡不仅仅在目标检测算法中会出现,在别的机器学习任务中同样会出现,这篇论文为我们解决类似问题提供了一个很好的启发,所以我认为无论是否从事目标检测领域相关工作,都可以来看一看这篇好论文。

论文的关键性改进在于对损失函数的改造以及对参数初始化的设置。

首先是对损失函数的改造。论文中指出,限制目标检测网络性能的一个关键因素是类别不平衡。二阶段目标检测算法相比于一阶段目标检测算法的优点在于,二阶段的目标检测算法通过候选框筛选算法(proposal stage)过滤了大部分背景样本(负样本),使得正负样本比例适中;而一阶段的目标检测算法中,需要处理大量的负样本,使得包含目标的正样本信息被淹没。这使得一阶段目标检测算法的识别准确度上比不上二阶段的目标检测算法。

为了解决这个问题,Focal loss使用了动态加权的思想,对于置信度高的样本,损失函数进行降权;对于置信度低的样本,损失函数进行加权,使得网络在反向传播时,置信度低的样本能够提供更大的梯度占比,即从未学习好的样本中获取更多的信息(就像高中时期的错题本一样,对于容易错的题目,包含了更多的信息量,需要更加关注这种题目;而对于屡屡正确的题目,可以少点关注,说明已经掌握了这类型的题目)

其巧妙之处就在于,通过了网络本身输出的概率值(置信度)去构建权重,实现了自适应调整权重的目的。

公式的讲解

Focal loss是基于交叉熵损失构建的,二元交叉熵的公式为

\[\mathrm{CE}(p, y)=\left\{\begin{array}{ll}
-\log (p) & \text { if } y = +1 \\
-\log (1-p) & \text { y = -1 }
\end{array}\right.
\]

为了方便表示,定义\(p_t\)为分类正确的概率

\[p_{t}=\left\{\begin{array}{ll}
p & \text { if } y = +1 \\
1-p & \text { y = -1 }
\end{array}\right.
\]

则交叉熵损失表示为\(CE(p,y)=CE(p_t)=-log(p_t)\)。如前文所述,通过置信度对损失进行缩放得到Focal loss。

\[FL(p_t)=-\alpha_t(1-p_t)^\gamma log(p_t)= \alpha_t(1-p_t)^\gamma\times CE(p_t)
\]

其中,\(\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)\)。

\[\mu_{wx}=\frac{\mu_w \sigma_x^2+\mu_x \sigma_w^2}{\sigma_x^2+\sigma_w^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\)成立,有如下的不等式。(一般情况下,这两个条件是成立的。)

\[\mu_{wx}=\frac{\mu_w \sigma_x^2+\mu_x \sigma_w^2}{\sigma_x^2+\sigma_w^2}=\frac{10^{-4}\mu_x}{\sigma_x^2+10^{-4}}\ll\frac{10^{-4}\mu_x}{10^{-4}\mu_x+10^{-4}}=\frac{1}{1+\frac{1}{\mu_x}}\approx0 \text{由于}\mu_x\text{一般为分数(网络的输入经过归一化到0至1,随着网络加深的连乘,分数会越来越小)}\\
\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,所以网络最后一层的输出为

\[p=sigmoid(wx+b)=sigmoid(b)=\frac{1}{1+e^{-b}}=\pi
\]

令\(\pi\)为网络初始化时输出为正类的概率,设置为一个很小的值(0.01),则网络在训练初期,将样本都划分为负类,对于正类\(p_t=0.01\),负类\(p_t=0.99\),则训练初期,正类都被大概率错分,负类都被大概率正确分类,所以在训练初期更加关注正类,避免初期的正类信息被淹没在负类信息中。

总结

总的来说,Focal loss通过对损失函数的简单改进,实现了一种自适应的困难样本挖掘策略,使得网络在学习过程中关注更难学习的样本,在一定程度上解决了正负样本分布不均衡的问题(由于正负样本分布不均衡,对于稀少的正样本学习不足,导致正样本普遍表现为难分样本)。

参考资料

论文原文

一篇不错的解析博客

Focal loss论文解析的更多相关文章

  1. 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)

    论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...

  2. Focal Loss for Dense Object Detection 论文阅读

    何凯明大佬 ICCV 2017 best student paper 作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确 ...

  3. [论文理解]Focal Loss for Dense Object Detection(Retina Net)

    Focal Loss for Dense Object Detection Intro 这又是一篇与何凯明大神有关的作品,文章主要解决了one-stage网络识别率普遍低于two-stage网络的问题 ...

  4. 论文阅读|Focal loss

    原文标题:Focal Loss for Dense Object Detection 概要 目标检测主要有两种主流框架,一级检测器(one-stage)和二级检测器(two-stage),一级检测器, ...

  5. 深度学习笔记(八)Focal Loss

    论文:Focal Loss for Dense Object Detection 论文链接:https://arxiv.org/abs/1708.02002 一. 提出背景 object detect ...

  6. Focal Loss笔记

    论文:<Focal Loss for Dense Object Detection> Focal Loss 是何恺明设计的为了解决one-stage目标检测在训练阶段前景类和背景类极度不均 ...

  7. [Network Architecture]Mask R-CNN论文解析(转)

    前言 最近有一个idea需要去验证,比较忙,看完Mask R-CNN论文了,最近会去研究Mask R-CNN的代码,论文解析转载网上的两篇博客 技术挖掘者 remanented 文章1 论文题目:Ma ...

  8. 处理样本不平衡的LOSS—Focal Loss

    0 前言 Focal Loss是为了处理样本不平衡问题而提出的,经时间验证,在多种任务上,效果还是不错的.在理解Focal Loss前,需要先深刻理一下交叉熵损失,和带权重的交叉熵损失.然后我们从样本 ...

  9. 目标检测 | RetinaNet:Focal Loss for Dense Object Detection

    论文分析了one-stage网络训练存在的类别不平衡问题,提出能根据loss大小自动调节权重的focal loss,使得模型的训练更专注于困难样本.同时,基于FPN设计了RetinaNet,在精度和速 ...

随机推荐

  1. python123期末四题编程题 -无空隙回声输出-文件关键行数-字典翻转输出-《沉默的羔羊》之最多单词

    1. 无空隙回声输出 描述 获得用户输入,去掉其中全部空格,将其他字符按收入顺序打印输出. ‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬ ...

  2. unimrcp plugin 分析

    摘要: unimrcp 访问媒体资源是通过插件实现,社区的代码给出了demo plugin,但是距离一个生产插件还是有一段的距离.这边文章介绍插件的整个逻辑过程,以及如何实现我们自己的插件.

  3. vue前端获取env中的常量

    process.env.常量名   如:process.env.MIX_APP_URL

  4. Python 快速验证代理IP是否有效

    有时候,我们需要用到代理IP,比如在爬虫的时候,但是得到了IP之后,可能不知道怎么验证这些IP是不是有效的,这时候我们可以使用Python携带该IP来模拟访问某一个网站,如果多次未成功访问,则说明这个 ...

  5. zabbix如何监控Nvidia显卡的各项指标?

    如何实现zabbix监控windows机器的N卡GPU指标呢? Nvidia卡在安装驱动程序的时候,已经自带安装了一个命令行工具来获取显卡的各个性能指标值 在windows机器上,我们可以把该路径加入 ...

  6. Mono生命周期小实验

    今天在写代码的时候,遇到一个初始化顺序问题,于是做了一个实验,下面记录结果: 情景: 1.在 脚本A中实例化 一个预制体,该预制体挂有脚本B 2.在 脚本A中,获取实例化物体 身上的 脚本B,并且设置 ...

  7. C# .NET容器的源码

    这里有List<T>的源码http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs

  8. CentOS7重装yum和python

    卸载现有的Python和Yum 1.删除现有Python ##强制删除已安装程序及其关联 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ...

  9. Java内部类使用场景和作用

    一.Java内部类的分类 Java内部类一般包括四种:成员内部类.局部内部类.匿名内部类和静态内部类 大多数业务需求,不使用内部类都可以解决,那为什么Java还要设计内部类呢. 二.内部类的使用场景 ...

  10. docker之windows安装&centOS安装

    按这个安装  没什么毛病 https://blog.csdn.net/vitaair/article/details/80894890 https://www.runoob.com/docker/ce ...