交叉熵损失函数和focal loss_目标检测分类损失函数——Cross entropy、Focal loss

一、Cross Entropy Loss

交叉熵是用来判定实际的输出与期望的输出的接近程度,刻画的是实际输出与期望输出的距离,也就是交叉熵的值越小,两个概率分布就越接近。

1. CE Loss的定义

假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则:

时,交叉熵取得最小值,因此可以利用交叉熵比较一个分布与另一个分布的吻合情况。交叉熵接近于熵,
便是针对
更好的逼近,事实上模型的输出与期望的输出越接近,交叉熵也会越小,这正是损失函数所需要的。

2. CE Loss推导

在这以逻辑回归做一次交叉熵及其反向传播的推导:

逻辑回归估计的是概率,则用联合概率分布衡量损失:

似然函数如下:

取对数求极大似然估计:

将求极大值转换成求极小值乘上

反向传播采用梯度下降法求

的最小值:

其中:

所以

3. CE Loss优缺点

均方误差也是一种比较常见的损失函数,为什么用交叉熵而不用MSE做分类损失呢?主要是因为逻辑回归配合MSE损失函数时采用梯度下降法进行学习时,其偏导值在输出概率值接近0或者接近1的时候非常小,会出现模型一开始训练时,学习速率非常慢的情况。

假设MSE Loss为:

其中:

反向传播的过程是要对损失函数进行链式法则求导:

sigmoid函数如下图所示:

交叉熵损失函数和focal loss_目标检测分类损失函数——Cross entropy、Focal loss_第1张图片

值接近0或者1的时候,
的值都会接近于0。这导致模型在一开始学习的时候速率非常慢,而使用交叉熵作为损失函数则不会导致这样的情况发生。

但是在目标检测领域,一张图像上负样本数量太大,占总loss的大部分,这种样本类别不均衡的情况会导致模型的优化方向存在偏差,标准的交叉熵损失函数在这个问题上存在不足。

4. Balanced Cross Entropy

针对上面的问题平衡交叉熵损失函数在标准交叉熵的基础上增加权重参数

解决类别不平衡导致的模型优化偏差。其定义为:

可以事先根据数据集计算出

加在正样本判别上,
的计算逻辑:假设训练集有M类,每类的样本数目为
从1到M。求出M个样本数目的中位数,假设是
,所有的
除以
,得到新的一组系数,这组系数取倒数就得到了对应类别的系数。

Balanced Cross Entropy虽然用
平衡positive/negative的重要性,但是无法区分简单easy/困难hard样本。

二、Focal Loss

针对BCE Loss中存在的问题,何凯明团队在2017年的文章《Focal Loss for Dense Object Detection》中提出了Focal Loss function。因为在目标检测中存在大量简单的背景,少量较难的前景,。所以Focal Loss通过增加类别权重

和样本难度权重调节因子
来修改CE Loss,目的是解决样本类别不平衡和样本分类难度不平衡等问题。

文章链接:https://arxiv.org/abs/1708.02002

1. Focal Loss的定义

Focal Loss Function是在平衡交叉熵损失基础上增加一个调节因子

和可聚焦参数
,让损失函数聚焦在困难样本的训练:

其中

>0使得减少易分类样本的损失,使得模型更专注于困难样本。直观地讲,调节因子减少了简单示例的loss贡献,并扩展了样本接收低loss的范围。

交叉熵损失函数和focal loss_目标检测分类损失函数——Cross entropy、Focal loss_第2张图片

2. 权重的理解

  • 项用来处理类别不均衡的问题,类似机器学习中训练样本的类别权重。例如训练样本中各类别占比为20%,10%,70%。那么
    的定义就是某个类别占比较高,就将该类别设置一个较小的权重,占比较低就将其设置一个较大的权重,降低占比高的loss,提高占比低的loss。
  • 让模型专注于训练难训练的样本,对于模型所属的真实类别,模型的预测值
    的值接近1,说明该样本容易训练,
    值接近0,说明模型预测的很差,样本难以训练。提高难以训练样本的loss,降低好训练样本的loss。例如,在
    的情况下,与CE相比,分类为
    的示例的损失将降低100倍,而对于
    的示例,其损失将降低1000倍。 这反过来增加了纠正错误分类示例的重要性。其中
    ,
  • 一定程度上也能解决类别不均衡问题。我们经常会遇到一个问题,如果在二分类中,负样本占比0.9。此时模型倾向于将样本全部判负。在CE Loss中,由于正负样本的权重一样(90%的负样本模型判别正确,10%的正样本模型判别错误),错误样本带来的loss在CE Loss中只占10%。如果上
    项后,会提高正样本判负的loss在总loss中的比重。

3.Python实现代码:

# 根据论文alpha=0.25 gamma=2效果最好
def focal_loss(y_true, y_pred):
    alpha, gamma = 0.25, 2
    y_pred = K.clip(y_pred, 1e-8, 1 - 1e-8)
    loss = - alpha * y_true * K.log(y_pred) * (1 - y_pred)**gamma - (1 - alpha) * (1 - y_true) * K.log(1 - y_pred) * y_pred**gamma
    return loss

三、CE Loss、Focal Loss对比

CE Loss能够衡量同一个随机变量中两个概率分布的差异程度,在机器学习中表示为真实概率分布与预测概率分布之间的差异,交叉熵的值越小,模型预测效果就越好。并且解决了逻辑回归中采用MSE导致梯度优化缓慢的问题。

但是CE Loss对于正样本而言,输出概率越大,损失越小;对于负样本而言,输出概率越小则损失越小。此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化到最优。

Focal Loss是在标准交叉熵损失函数的基础上修改得到的,这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本:调节正负样本不均衡的方法:引入权重系数

;调节难易样本训练的方法:引入权重
。其中
大于0, 常取值为2。样本简单时,
小;样本难时,
大。

你可能感兴趣的:(交叉熵损失函数和focal,loss)