layout: post
title: 2D_Detection-Loss
date: 2021-10-01 16:44:56.000000000 +09:00
categories: [算法篇]
tags: [CV, 综述]
mathjax: true
更多内容可访问个人博客:2D_detection检测综述
前言
本文主要简单谈谈深度学习中常用的Loss函数: 从原理和应用两个方面介绍
参考资料: 深度学习-Loss函数 AI初识境
详细介绍
主要从应用领域维度进行介绍:
- 分类任务:如交叉熵损失/KL散度/折页损失等
- 回归任务:如L1/L2损失等
- 检测任务:主要是由分类损失和回归损失两个部分组成,但是基于检测任务进行了优化
分类任务Loss
Cross Entropy Loss
交叉熵损失为分类任务中最为常用的损失函数,交叉熵的关键定义为:
y i ∗ l o g ( 1 − p i ) y_i * log(1-p_i) yi∗log(1−pi)
其中, y i y_i yi 表示为label值, p i p_i pi 表示为预测值概率。对于二分类, y i y_i yi 为0/1;对于多分类则为one-hot变量(仅gt值为1),即只会得到预测的gt值的损失。
DL中一般会通过softmax/sigmoid转换为概率分布后通过交叉熵计算损失,如torch.nn.CrossEntropyLoss
KL散度
KL散度的作用在于衡量两个分布的相似度,KL散度定义为:
K L 散 度 = 信 息 熵 − 交 叉 熵 KL散度 = 信息熵 - 交叉熵 KL散度=信息熵−交叉熵
其中信息熵表述的是正确值(GT)的数据分布: y g t l o g ( y g t ) y^{gt} log(y^{gt}) ygtlog(ygt) , 而交叉熵表述的是正确值和预测值之间的熵分布差异: y g t l o g ( y p r e ) y^{gt} log(y^{pre}) ygtlog(ypre) 。对于信息熵来说,其本身可以认为为定值,所以对KL散度的优化问题便可以转化为交叉熵的优化问题。
KL散度最常用的场景是 Distillation
中对 soft-label
使用的 KL divergence
,主要用于衡量两个 Teacher Model
和 Student Model
分布的差异。
其展开后第一项为原始预测分布的熵,为固定项,可以消去;第二项为
−
q
l
o
g
(
p
)
-qlog(p)
−qlog(p) ,即 cross_entroy
,区别在于这里得到的是 loggits
输出为连续概率。
Hinge Loss
Hinge Loss分布如下:
其公式如下:
其核心在于区别简单的0-1损失,hinge loss需要正负例之间要有足够的区分度:margin值要足够大,是更严格的损失函数。
指数损失
指数损失定义如下:
L ( Y , f ( X ) ) = e x p ( − Y f ( X ) ) L(Y, f(X)) = exp(-Yf(X)) L(Y,f(X))=exp(−Yf(X))
其中,
Y
Y
Y 为预测结果,
f
(
X
)
f(X)
f(X) 为预测概率值 应用场景: Adaboost
回归任务Loss
MAE Loss
MAE,全称为“Mean Absolute Error”,为平均绝对值误差,即L1 Loss,其定义如下:
该loss适合 模型输入于真实值误差如何拉普拉斯分布(u=0, b=1) ,拉普拉斯分布结果如下:
MSE Loss
MSE,全称为“Mean Squared Error”,为均方差误差,即L2 Loss,定义如下:
该loss适合 模型输出于真实值误差符合高斯分布情况 ,原理为 最小化均方差损失函数于极大似然估计本质上一致的 。
Smooth L1 Loss
SmoothL1 Loss相较于L1 Loss在x=0时仍然可导,采用的方式是abs(x)<1时采用二次函数进行过渡,可参考:Smooth_L1_Loss_Pytorch ,定义如下:
Faster-RCNN中使用Smooth L1 Loss,作者认为其对smooth L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。
Huber Loss
Huber Loss为MSE和MAE Loss的组合,其原理是在误差接近0时,使用MSE,保持可导,梯度稳定;在误差较大的情况下使用MAW,降低异常点影响,维持训练稳定。其定义如下:
检测任务Loss
Focal Loss
Focal Loss出自2017 CVPR:Focal Loss for Dense Object Detection,出自何凯明团队,在目标检测领域应用极广,重点解决了检测任务中 正负例样本不均衡 的现象。其函数定义如下:
其中,p表示为预测的置信度。Focal Loss的作用在于能够增大hard case的loss,从而在训练过程中更多得关注困难case,提高模型性能,同时也能加快收敛。Focall Loss是在交叉熵损失上的延伸,两者的区别如下:
QFocal Loss
QFocal Loss出自Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection 其出发点在于:
随着One-Stage检测算法的不断发展,对于检测任务,原始的分类和回归损失分离的方案逐渐显露出一些弊端,同时一些描述定框质量的方法:如centerness/IoU Loss,也带来一些思考:如何将描述框准度和分类损失进行结合,QFocal Loss便是将定框质量和分类损失进行了结合。 QFocal Loss于Focal Loss的区别在于:Focal Loss描述的是离散类别的损失,QFocal Loss描述的是连续Label上的损失(定框质量),其定义如下:
IoU Loss
IoU Loss为检测任务中常用的回归Loss,于传统的L1/L2 Loss相比,IoU Loss于检测任务最终的评估方式对应,能够更好的描述预测框的精度,且具备尺度不变性,通常有更好的性能表现,其基本定义如下:
其中,A,B分别表示检测框和GT框。但是IoU损失存在一些问题:
- 无法描述不相交的框的损失
- 无法精确描述框的交互情况:检测框和GT框在不同位置,其IoU可能是一致的。
在IoU Loss的基础上,后续也有一些优化的Loss:
- GIoU Loss:引入外接矩形,不仅仅关注了重叠区域,也关注了非重叠区域,添加了不相交的框的loss描述。
- DIoU/CIoU Loss:DIoU Loss对框间的各点距离进行了更细致的建模,收敛更快。CIoU Loss引入长宽比的相似度。
各Loss应用于YOLOv3上的效果如下: