# 0 前言

Focal Loss是为了处理样本不平衡问题而提出的，经时间验证，在多种任务上，效果还是不错的。在理解Focal Loss前，需要先深刻理一下交叉熵损失，和带权重的交叉熵损失。然后我们从样本权重的角度出发，理解Focal Loss是如何分配样本权重的。Focal是动词Focus的形容词形式，那么它究竟Focus在什么地方呢？(详细的代码请看Gitee)。

# 1 交叉熵

## 1.1 交叉熵损失（Cross Entropy Loss）

$\text{loss}\left( x,\text{class} \right) =-\log \left( \frac{\exp \left( x\left[\text{class} \right] \right)}{\sum_j{\exp\left( x\left[ j \right] \right)}} \right) =-x\left[\text{class} \right] +\log \left( \sum_j{\exp\left( x\left[ j \right] \right)} \right) \tag{1-1}$

$\operatorname{loss}(x, \text {class})=W[\text {class}]\left(-x[\text {class}]+\log \left(\sum_{j} \exp (x[j])\right)\right) \tag{1-2}$

$\ell = \begin{cases} \sum_{i}^{N}{\text{loss}(x^{(i)},\ \text{class}^{(i)})}&\text{, sum}\\ \dfrac{1}{N}\sum_{i}^{N}{\text{loss}(x^{(i)},\ \text{class}^{(i)})}&\text{, mean} \end{cases} \tag{1-3}$

## 1.2 二分类交叉熵损失(Binary Cross Entropy Loss)

$l = -y\log{\hat{y}}-(1-y)\log{(1-\hat{y})}$

$l = \begin{cases} -\log{\hat{y}_0} &y=0 \\ -\log{\hat{y}_1} &y=1 \end{cases}; \quad \text{where}\quad \hat{y}_0+\hat{y}_1 = 1$

$\ell = \begin{cases} \sum_{i}^{N}l^{(i)}&\text{, sum}\\ \dfrac{1}{N}\sum_{i}^{N}l^{(i)}&\text{, mean} \end{cases}; \ \ \ l^{(i)} = -y^{(i)}\log{\hat{y}^{(i)}}-(1-y^{(i)})\log{(1-\hat{y}^{(i)})}$

# 2 Focal Loss

## 2.1 基本思想

 图2-1 Hard Example 图2-2 Easy Example1 图2-3 Easy Example2 图2-4 Example Space

## 2.2 Focal Loss解决方案

 图2-6 Easy Example Classifier Output 图2-7 Hard Example Classifier Output

$\text{FL} = -(1-p_t)\log(p_t) \tag{2-1}$

$\text{FL} = -(1-p_t)^\gamma\log(p_t) \tag{2-2}$

$\text{FL} = -\alpha_t(1-p_t)^\gamma\log(p_t) \tag{2-3}$

# 3 Focal Loss实现(Pytorch)

## 3.1 交叉熵损失实现(numpy)

import numpy as np

def cross_entropy(output, target):
out_exp = np.exp(output)
out_cls = np.array([out_exp[i, t] for i, t in enumerate(target)])
ce = -np.log(out_cls / out_exp.sum(1))
return ce


## 3.2 Focal Loss实现

class FocalLoss(nn.Module):
def __init__(self, gamma=2, weight=None, reduction='mean'):
super(FocalLoss, self).__init__()
self.gamma = gamma
self.weight = weight
self.reduction = reduction

def forward(self, output, target):
# convert output to pseudo probability
out_target = torch.stack([output[i, t] for i, t in enumerate(target)])
probs = torch.sigmoid(out_target)
focal_weight = torch.pow(1-probs, self.gamma)

# add focal weight to cross entropy
ce_loss = F.cross_entropy(output, target, weight=self.weight, reduction='none')
focal_loss = focal_weight * ce_loss

if self.reduction == 'mean':
focal_loss = (focal_loss/focal_weight.sum()).sum()
elif self.reduction == 'sum':
focal_loss = focal_loss.sum()

return focal_loss


# 总结

Focal Loss从2017年提出至今，该论文已有2000多引用，足以说明其有效性。其实从本质上讲，它也只不过是给样本重新分配权重，它相对类别权重的分配方法，只不过是将样本空间进行更为细致的划分，从图2-4很容易理解，类别权重的方法，只是将样本空间划分为蓝色线上下两个部分，而加入难易样本的划分，又可以将空间划分为左右两个部分，如此，样本空间便被划分4个部分，这样更加细致。其实借助于这个思想，我们是否可以根据不同任务的需求，更加细致划分我们的样本空间，然后再相应的分配不同的权重呢？

## 处理样本不平衡的LOSS—Focal Loss的更多相关文章

1. 【深度学习】Focal Loss 与 GHM——解决样本不平衡问题

Focal Loss 与 GHM Focal Loss Focal Loss 的提出主要是为了解决难易样本数量不平衡(注意:这有别于正负样本数量不均衡问题)问题.下面以目标检测应用场景来说明. 一些 ...

2. Focal Loss笔记

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

3. focal loss和ohem

公式推导:https://github.com/zimenglan-sysu-512/paper-note/blob/master/focal_loss.pdf 使用的代码:https://githu ...

4. 深度学习笔记（八）Focal Loss

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

5. 论文阅读笔记四十四：RetinaNet:Focal Loss for Dense Object Detection(ICCV2017）

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

6. Focal Loss理解

1. 总述 Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题.该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘. 2. 损失函数形式 ...

7. Focal Loss(RetinaNet) 与 OHEM

Focal Loss for Dense Object Detection-RetinaNet YOLO和SSD可以算one-stage算法里的佼佼者,加上R-CNN系列算法,这几种算法可以说是目标检 ...

8. [论文理解]Focal Loss for Dense Object Detection（Retina Net）

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

9. Focal Loss 理解

本质上讲,Focal Loss 就是一个解决分类问题中类别不平衡.分类难度差异的一个 loss,总之这个工作一片好评就是了. 看到这个 loss,开始感觉很神奇,感觉大有用途.因为在 NLP 中,也存 ...

## 随机推荐

1. Vuforia图像追踪，动态创建的对象隐藏显示的坑

刚做的一个项目,使用Unity3D的Vuforia插件进行图像识别,其中有动态生成的游戏对象模型,地形模型放在ImageTarget下,作为ImageTarget的子物体. 动态生成的敌人则有Pref ...

2. PHP中文字符串编码转换

2016年2月26日 16:47:13 星期五 情景: PHP从csv导入数据时乱码 $name = mb_convert_encoding($name, 'UTF-8', 'ASCII,GBK,GB ...

3. 【转】SQL常用的语句和函数

原文链接:http://www.cnblogs.com/mailingfeng/archive/2013/01/07/2850116.html order by 的数值型灵活使用 select * f ...

4. 在ubuntu下安装chrome

To add PPA in Ubuntu 14.04 / 13.10 / 13.04 / 12.10 / 12.04 First download and install the key from G ...

5. topcoder算法练习2

Problem Statement      In most states, gamblers can choose from a wide variety of different lottery ...

6. Objective-C中NSString和NSMutableString的基本用法

int main(int argc, const char * argv[]) { @autoreleasepool { //----------------NSString------------- ...

7. 常用Latex公式

注意: 1 在博客中书写Latex公式时,需在公式两侧用$包括 2 大括号{ }在Latex有本身的含义,如果要输出为普通字符需要使用\{...\} 符号 公式 说明$ \in $\in 包含$ ...

8. IaaS，PaaS，SaaS 的区别和联系

原文:http://www.ruanyifeng.com/blog/2017/07/iaas-paas-saas.html 越来越多的软件,开始采用云服务. 云服务只是一个统称,可以分成三大类. Ia ...

9. Oracle SP2-0640

安装Oracle database 11g express edition后,使用自带的SQL命令行,执行 select 1 from dual; 报出错误:SP2-0640 未连接 解决方法:使用 ...

10. Redis实战（五）CentOS 7上搭建Redis集群

高可用Redis(十二):Redis Cluster https://www.cnblogs.com/renpingsheng/p/9862485.html https://www.cnblogs.c ...