Focal Loss损失函数的个人理解

一、交叉熵损失函数原理

提示:本文仅为自己学习过程记录,借录了很多大佬的东西,仅供自己以后知识点翻阅使用。

1.信息量

信息的定义是用来消除随机不确定性的东西。也就是说衡量信息的大小是看信息消除不确定性东西的程度。信息量的大小与信息发生的概率成反比。

设某一时间发生的概率为P(x),其信息量表示为:

I(x)=log(P(x))I(x)=-log(P(x))
其中I(x)I(x)表示信息量,这里loglog表示以e为底的自然对数。

2.交叉熵

信息熵:也称为熵,用来表示所有信息量的期望。

期望是试验中每次可能结果的概率乘以其结果的总和。
信息熵可以表示为(这里的XX是一个离散型随机变量):
H(X)=i=1nP(xi)log(P(xi))(X=x1,x2,x3...,xn)H(X)=-\sum_{i=1}^n P(x_i)log(P(x_i)) (X=x_1,x_2,x_3...,x_n)
对于0-1分布问题:设某一时间发生的概率为P(x)P(x),则另一事件发生的概率为1P(x)1-P(x)。计算熵的公式可以简化如下:
H(X)=n=1nP(xilog(P(xi)))=[P(x)log(P(x))+(1P(x))log(1P(x))]=P(x)log(P(x))(1P(x))log(1P(x))H(X)=-\sum_{n=1}^nP(x_ilog(P(x_i)))\\ =-[P(x)log(P(x))+(1-P(x))log(1-P(x))]\\=-P(x)log(P(x))-(1-P(x))log(1-P(x))

相对熵(KL)散度:如果对于随机变量X有两个单独的概率分布P(x)P(x)Q(x)Q(x),那我们就可以用KL散度来衡量着两个概率分布之间的差异。

在机器学习中,我们常用P(x)P(x)来表示样本的真实分布,Q(x)Q(x)来表示模型预测的分布。
DKL(PQ)=i=0nP(xi)log(P(xi)Q(xi)))D_{KL}(P||Q)=\sum_{i=0}^nP(x_i)log(\frac{P(x_i)}{Q(x_i)}))
例如在三分类任务中,XX的真实分布P(x)=[1,0,0]P(x)=[1,0,0],预测分布为Q(x)=[0.7,0.2,0.1]Q(x)=[0.7,0.2,0.1],计算XX的KL散度?

Focal Loss损失函数的个人理解
KL散度越小,表示P(x)P(x)Q(x)Q(x)的分布更加接近,可以通过反复训练Q(x)Q(x)来接近P(x)P(x)

交叉熵: 交叉熵 = KL散度 - 信息熵

公式推导: 先将KL散度公式拆开Focal Loss损失函数的个人理解
前者H(p(x))H(p(x))表示信息熵,后者即为交叉熵。
交叉熵公式表示为:
Focal Loss损失函数的个人理解
在机器学习中,输入数据与标签常常已经确定,真实概率分布P(x)P(x)也就确定。所以信息熵变成了常量。
=KL+()交叉熵=KL散度+常量(信息熵)
由于KL散度的值表示真实概率分布P(x)P(x)与预测概率分布Q(x)Q(x)之间的差异。值越小表示预测值越接近真实值。所以我们需要最小化KLKL散度。交叉熵这里也有相同的作用,所以机器学习中常常使用交叉熵损失函数来计算loss。

二、Focal Loss函数

通过上面部分已了解交叉熵损失函数。二分类损失函数公式如下:
Focal Loss损失函数的个人理解
其中yy为真实样本的标签,yy'为经过sigmoid的预测输出(取值在[0,1]之间)。
普通的交叉熵对正样本而言,输出概率越大,损失越小。对负样本而言:输出概率越小,损失越小。
问题来了:此时的损失函数在大量样本的简单迭代中比较缓慢且可能无法优化至最优。

作者由此提出Focal Loss函数:
Focal Loss损失函数的个人理解

控制易分类样本和难分类样本的权重

可以看看有什么不同?在原有基础上添加了一个因子。若γ>0\gamma>0,则降低了易分类样本对loss的贡献。使得模型更加关注于难分类样本。

例如分类任务,样本A属于类别1的概率为0.9,属于易分类样本。样本B属于类别2的概率为0.56,属于难分类样本。也就是某个类的概率越大,其越容易分类。

解决类别不平衡问题

Focal Loss损失函数的个人理解
在原有基础上再添加平衡因子α\alpha,可以用来平衡正负样本本身的数量不均问题。
这里的两个参数α\alphaγ\gamma协调来控制,文章作者采用α=0.25γ=2\alpha=0.25,\gamma=2时效果最好。

三、总结

one-stage和two-stage的表现差异主要原因是大量前背景类别不平衡导致,以此提出Focal Loss。

作者设计了一个简单密集型网络RetinaNet,采用Focal Loss函数来训练,在保证速度的同时达到了精度最优,验证了效果。

Focal Loss损失函数的个人理解

Two-Stage算法,在产生region proposal阶段,通过score筛选和nms筛选过滤掉了大量的负样本,然后在分类、回归阶段又固定了正负样本比例(1:3),或者通过OHEM技巧使得前景和背景相对平衡。类别不平衡的问题并不明显,算法精度得以保证。

One-Stage算法需要产生超大量的预选框,训练被大量负样本所主导,Focal Loss对此种情况卓有成效。

参考:
[1].剖析 Focal Loss 损失函数: 消除类别不平衡+挖掘难分样本
[2].交叉熵损失函数原理详解
[3].Focal loss详解及其实现