目标检测中的损失函数-分类损失

时间:2024-10-11 09:58:49

分类损失是用来评价预测类别与实际类别的偏离程度的,早期像YOLOv1和YOLOv2就简单采用MSE/L2损失。后面大多采用交叉熵损失(Cross-Entropy Loss)。为提高分类效率,也为了提高模型泛化能力,解决噪声标签上的过信度(标注数据存在噪声,标签过度自信)问题,提出了标签平滑(Label Smooth);为了解决类别不平衡和分类难度差异问题,设计了焦点损失(Focal loss)。这些改进都是在CE Loss的基础上进行改进的。

1.1 交叉熵损失函数CE Loss

交叉熵损失函数(Cross-Entropy Loss)是机器学习和深度学习中常用的一种损失函数。它在神经网络中通常与 softmax 函数结合使用。softmax 函数将模型的原始输出转换为概率分布,而交叉熵损失函数则计算这个预测概率分布与真实概率分布之间的差异。这种组合在多分类问题中非常有效。它基于信息论中的交叉熵概念,用于衡量模型预测概率分布与真实标签分布之间的差异。

介绍交叉熵先得从信息量,信息熵再到相对熵说起。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度。信息是用来消除随机不确定性的,信息量的大小与信息发生的概率成反比。概率越大,包含的信息量越小,概率越小,包含的信息量越大。如“明天太阳从东边升起”,这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为0。“明天在天上能看见彩虹”,我们都知道,要想看见彩虹,需要一定条件的,比如要同时有水汽和阳光等,所以从直觉上,这条信息具有一定信息量的。

信息量
设某一件事发生的概率为p(x),其信息量为:I(x) = -log(p(x))
其中I(x)表示信息量,这里log表示以e为底的自然对数,以2为底则表示对应bit数的信息量。
信息熵
信息熵也被称为熵,用于表示某件事可能发生所包含的所有信息量的期望。这个期望的计算方式为每件事发生的概率乘以每件事的信息量之和。可用公式表示为:
在这里插入图片描述
比如我们要求得明天天气的信息熵,根据今天天气的情况,我们预测明天是晴天的概率为0.7,明天是雨天的概率是0.1,明天是阴天的概率是0.2,则明天的天气信息熵可计算为:
H(x) = -(0.7xlog(0.7))+0.1xlog(0.1)+0.2xlog(0.2))
相对熵(KL散度)
相对熵或者叫KL散度通常用于衡量同一个随机变量X的两个独立概率分布P(x)与Q(x)之间的差异,可用公式表示为:
在这里插入图片描述
由公式可知,当P(x)与Q(x)分布非常接近时,Dkl越接近于零,所以机器学习或者深度学习中可以利用KL散度作为损失函数,通过训练模型的预测分布Q(x),使其慢慢逼近训练数据分布P(x),进而使得两个分布的KL散度值达到最小。
交叉熵
将上面KL散度公式展开:
在这里插入图片描述
公式后面的H(p||q)即为分布P(x)与Q(x)的交叉熵,所以:
在这里插入图片描述
在机器学习有监督训练网络时,输入数据与标签常常是已经确定好的,所以训练数据的真实概率分布P(x)其实是已知的,那么对应的信息熵H(x)就可以计算出来,是一个常量;前面我们介绍KL散度时已经表明KL散度值表示真实概率分布P(x)与模型预测概率分布Q(x)之间的差异,值越小代表两者差异越小,所以可以把最小化KL散度值当做模型优化的目标,而现在交叉熵等于KL散度值加一个常量(信息熵H(x)),而且交叉熵计算公式更简单,所以用最小化交叉熵代替最小化KL散度作为模型优化的目标函数是现在常用做法。


1.2 标签平滑label smooth

因为标签可能存在错误标注(噪声标签),为了避免过度信任噪声标签而导致模型过拟合,所以提出了标签平滑技术,即将hard label变成soft label,对于ont-hot编码,原来是1的位置变成1-α,其他原来为0的位置变成α/(k-1),α通常取值为0.1,k为类别数量。例如,一个3分类任务,且真实标签为q,预测概率p是由网络最后一层输出经过softmax变换得到,则交叉熵损失可表示为:
在这里插入图片描述
对于标签q=[0,1,0]通过标签平滑后,变成q’=[0.05, 0.9, 0.05],原来的交叉熵损失为:
CEori = -log(p1),而通过标签平滑后,交叉熵损失变成了:
CE = -(0.05log(p0)+0.9log(p1)+0.05log(p2))


1.3 Focal loss

Focal loss是在2017年目标检测论文RetinaNet中提出的,用于控制目标检测中正负样本框的平衡问题;RetinaNet指出,在单阶段密集目标检测算法中,例如SSD,有1万到10万个候选框,但是里面有目标的正样本占的比例非常少,剩余的全为负样本。正负样本不平衡会导致两个问题:一是模型学习不高效,可能学习到大量简单的负样本,这对于模型学习没有多大用处。二是简单的负样本会压制模型训练,导致模型能力退化。
Focal Loss是为one-stage的检测器的分类分支服务的,它支持0或者1这样的离散类别label。
目的是解决样本数量不平衡的情况:
1)正样本loss增加,负样本loss减小
2)难样本loss增加,简单样本loss减小
一般分类时,通常使用的交叉熵损失函数如下:
在这里插入图片描述
为了解决正负样本不平衡问题,通常在交叉熵损失前面加一个参数α,用于控制对应类别损失的大小。比如负样本多,那就减小负样本前面的参数以降低负样本的权重,正样本少,就增大正样本前面的参数以增加正样本的权重。用公式可表示为:
在这里插入图片描述
虽然通过增加参数α可以平衡了正样本/负样本的重要性,但它区分不了简单样本和困难样本,在单阶段目标检测算法中,有大量的简单样本,这就导致损失大部分其实是由简单样本所主导。所以作者提出,要重新构造损失函数以降低简单样本的权重,从而将训练重点放在困难负样本上。

Focal loss认为,易区分的简单样本(即置信度高的样本)对模型学习的贡献小,可以调低它们的权重,模型应该重点关注那些难以区分的困难样本(即置信度低的样本),公式如下:
在这里插入图片描述
为了同时平衡正负样本问题,Focal loss还结合了加权交叉熵的参数,所以两者结合后得到了最终的Focal loss为如下公式:
在这里插入图片描述