损失函数主要是用来衡量真值与预测值之间的偏离程度,根据其离散还是连续分为分类和回归损失函数。
1.二分类交叉熵
-
Binary Cross-Entropy Loss(BCELoss):
L ( y i , y i ^ ) = − 1 m ∑ i = 1 m ( y i l o g ( y i ^ ) + ( 1 − y i ) ( 1 − y i ^ ) ) L(y_{i}, \hat{y_{i}}) = -\frac{1}{m}\sum\limits_{i=1}^{m}(y_{i}log(\hat{y_{i}})+(1-y_{i})(1-\hat{y_{i}})) L(yi,yi^)=−m1i=1∑m(yilog(yi^)+(1−yi)(1−yi^))
-
常用于多标签分类
多标签分类指一个对象可以属于多个类,当然BCELoss也可以用于多分类。多标签分类示例:譬如可以将人分高、富、帅三类,
有些人可以同时属于高富不帅、高不富帅或高富帅多个类别。记:高1,不高0,富1,不富0,帅1不帅0
,
现在有三人A:[1,1,1]
B:[0,1,1]
C:[1, 0, 1]
有个算法预测的结果分别为
A p [ 0.9 , 0.8 , 0.5 ] A_p[0.9, 0.8, 0.5] Ap[0.9,0.8,0.5]
B p [ 0.6 , 0.48 , 0.95 ] B_p[0.6, 0.48, 0.95] Bp[0.6,0.48,0.95]
C p [ 0.9 , 0.1 , 0.6 ] C_p[0.9, 0.1, 0.6] Cp[0.9,0.1,0.6]
其BCE
损失计算为:
L A = ( 1 ∗ l o g 0.9 + ( 1 − 1 ) ∗ l o g ( 1 − 0.9 ) ) + ( 1 ∗ l o g 0.8 + ( 1 − 1 ) ∗ l o g ( 1 − 0.8 ) ) + ( 1 ∗ l o g 0.5 + ( 1 − 1 ) ∗ l o g ( 1 − 0.5 ) ) 3 = − 0.10536 + 0.22314 + 0.69315 3 = − 1.02165 3 = − 0.34055 L_A=\frac{(1*log0.9+(1-1)*log(1-0.9))+(1*log0.8+(1-1)*log(1-0.8))+(1*log0.5+(1-1)*log(1-0.5))}{3}=-\frac{0.10536+0.22314+0.69315}{3}=-\frac{1.02165}{3} = -0.34055 LA=3(1∗log0.9+(1−1)∗log(1−0.9))+(1∗log0.8+(1−1)∗log(1−0.8))+(1∗log0.5+(1−1)∗log(1−0.5))=−30.10536+0.22314+0.69315=−31.02165=−0.34055
L B = ( 0 ∗ l o g 0.6 + ( 1 − 0 ) ∗ l o g ( 1 − 0.6 ) ) + ( 1 ∗ l o g 0.48 + ( 1 − 1 ) ∗ l o g ( 1 − 0.48 ) ) + ( 1 ∗ l o g 0.95 + ( 1 − 1 ) ∗ l o g ( 1 − 0.95 ) ) 3 = − 0.56718 L_B=\frac{(0*log0.6+(1-0)*log(1-0.6))+(1*log0.48+(1-1)*log(1-0.48))+(1*log0.95+(1-1)*log(1-0.95))}{3}=-0.56718 LB=3(0∗log0.6+(1−0)∗log(1−0.6))+(1∗log0.48+(1−1)∗log(1−0.48))+(1∗log0.95+(1−1)∗log(1−0.95))=−0.56718
L C = ( 1 ∗ l o g 0.9 + ( 1 − 1 ) ∗ l o g ( 1 − 0.9 ) ) + ( 0 ∗ l o g 0.1 + ( 1 − 0 ) ∗ l o g ( 1 − 0.1 ) ) + ( 1 ∗ l o g 0.6 + ( 1 − 1 ) ∗ l o g ( 1 − 0.6 ) ) 3 = − 0.24051 L_C=\frac{(1*log0.9+(1-1)*log(1-0.9))+(0*log0.1+(1-0)*log(1-0.1))+(1*log0.6+(1-1)*log(1-0.6))}{3}=-0.24051 LC=3(1∗log0.9+(1−1)∗log(1−0.9))+(0∗log0.1+(1−0)∗log(1−0.1))+(1∗log0.6+(1−1)∗log(1−0.6))=−0.24051
去掉负号:
L = L A + L B + L C 3 = 0.38275 L = \frac{L_A+L_B+L_C}{3}=0.38275 L=3LA+LB+LC=0.38275
使用pytorch
中的torch.nn.BCELoss
函数来验证下我们计算的是否正确:
结果基本一致(因上述计算只取了小数点后五位)。
2.多分类交叉熵损失
Log Loss:
L
(
y
i
,
y
i
^
)
=
−
1
m
∑
i
=
1
m
y
i
l
o
g
(
y
i
^
)
L(y_{i}, \hat{y_{i}}) = -\frac{1}{m}\sum\limits_{i=1}^{m}y_{i}log(\hat{y_{i}})
L(yi,yi^)=−m1i=1∑myilog(yi^)
3.Focal Loss
L
(
y
i
,
y
i
^
)
=
−
1
m
∑
i
=
1
m
y
i
(
1
−
y
i
^
)
γ
l
o
g
(
y
i
^
)
L(y_{i}, \hat{y_{i}}) = -\frac{1}{m}\sum\limits_{i=1}^{m}y_i(1-\hat{y_{i}})^\gamma log(\hat{y_{i}})
L(yi,yi^)=−m1i=1∑myi(1−yi^)γlog(yi^)
FAIR何凯明组2017年8月份提出来的损失函数,用于稠密目标检测。可用于类别不平衡问题,类比于带权重的损失函数,改善数据分布不平衡时算法的表现。论文中指出,超参
γ
\gamma
γ默认取2
。
图片引用自Focal Loss论文https://arxiv.org/abs/1708.02002
4.合页损失函数
Hinge Loss:
分类的结果与真值的差大于一定的间隔才会被判定为正。
L
(
y
i
,
y
i
^
)
=
−
1
m
∑
i
=
1
m
(
1
−
y
i
y
i
^
)
L(y_{i}, \hat{y_{i}}) = -\frac{1}{m}\sum\limits_{i=1}^{m}(1-y_i\hat{y_i})
L(yi,yi^)=−m1i=1∑m(1−yiyi^)
5.0-1损失函数
Zrero-one Loss:
L ( y i , y i ^ ) = { 1 , y i = y i ^ 0 , y i ≠ y i ^ L(y_{i}, \hat{y_{i}}) =\left\{\begin{matrix} 1,y_{i}=\hat{y_i}\\ 0,y_i\neq\hat{y_i} \end{matrix}\right. L(yi,yi^)={1,yi=yi^0,yi=yi^
感知机使用的此函数,相等条件改为相差区间。
6.L1损失函数
又称绝对值损失函数
L ( y i , y i ^ ) = ∣ y i − y i ^ ∣ L(y_{i}, \hat{y_{i}}) = |y_i-\hat{y_i}| L(yi,yi^)=∣yi−yi^∣
7.L2损失函数
又称均方误差损失函数 Mean Square Loss(MSE):
L ( y i , y i ^ ) = ( y i − y i ^ ) 2 L(y_{i}, \hat{y_{i}}) = (y_i-\hat{y_i})^2 L(yi,yi^)=(yi−yi^)2
8.Smooth L1损失函数
L
(
y
i
,
y
i
^
)
=
{
0.5
(
y
i
−
y
i
^
)
2
/
β
,
if
∣
y
i
−
y
i
^
∣
<
β
∣
y
i
−
y
i
^
∣
−
0.5
∗
β
,
otherwise
L(y_{i},\hat{y_{i}}) = \begin{cases} 0.5 (y_i - \hat{y_i})^2 / \beta, & \text{if } |y_i - \hat{y_i}| < \beta \\ |y_i - \hat{y_i}| - 0.5 * \beta, & \text{otherwise } \end{cases}
L(yi,yi^)={0.5(yi−yi^)2/β,∣yi−yi^∣−0.5∗β,if ∣yi−yi^∣<βotherwise
β
\beta
β常取1.
通过如此设置,可
- 1)相比于
L2 Loss
,Smooth L1
对于离群点更加稳定,模型不易跑飞 - 2)同时解决了
L1 Loss
不光滑问题,且0-1
间的梯度更小,模型更稳定
2015年04月Fast RCNN论文中提出。
9. IOU Loss
L
I
o
U
=
1
−
I
o
U
L_{IoU} = 1 - IoU
LIoU=1−IoU
图片来源于UnitBox
即交并比损失函数,2016年旷视在UnitBox提出.
- 可解决使用
L1、L2
Loss时的尺度不变问题,参考5
缺点: IOU Loss
无法反映距离的远近,只衡量了相交面积,如下图虽具有相同的IOU
,却不能准确反映相交的好坏
图片引用自:https://bbs.cvmart.net/articles/1436(这应该是哪篇论文里的,暂未找到,有知道的感谢告知)
10.GIOU Loss
图片来源于7:https://arxiv.org/abs/1902.09630
C
是包围A
和B
的最小矩形
L
G
I
o
U
=
1
−
G
I
o
U
L_{GIoU} = 1- GIoU
LGIoU=1−GIoU
2019年02月斯坦福大学的研究团队提出。
缺点:
- 当框
B
在框A
中时,退化成IoU
,如下图
图片来源于8 https://arxiv.org/abs/1911.08287
11.DIOU Loss
L
D
I
o
U
=
1
−
D
I
o
U
L_{DIoU} = 1 - DIoU
LDIoU=1−DIoU
其中,
b
b
b、
b
g
t
b^{gt}
bgt表示预测框,真实框的中心点,
ρ
2
(
b
,
b
g
t
)
\rho ^2(b,b^{gt})
ρ2(b,bgt)表示中心点距离的平方,
c
c
c表示能够同时包含预测框和真实框的最小闭包区域(外接矩形)的对角线距离。
这是2019年11月份天津大学提交的一份论文中的工作,参考8
12.CIoU Loss
到DIoU
已经考虑了真实框与预测框的重合面积,中心距离,CIoU
在DIoU
基础上加入长宽比拟合项。
C
I
o
U
=
I
o
U
−
ρ
2
(
b
,
b
g
t
)
c
2
−
α
v
CIoU = IoU-\frac{\rho ^2(b,b^{gt})}{c^2}-\alpha v
CIoU=IoU−c2ρ2(b,bgt)−αv
其中
α
\alpha
α是权重参数,超参数,
v
v
v是衡量长宽比一致性的参数,
v
=
4
π
2
(
a
r
c
t
a
n
w
g
t
h
g
t
−
a
r
c
t
a
n
w
h
)
2
v = \frac{4}{\pi^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2
v=π24(arctanhgtwgt−arctanhw)2,
α
\alpha
α通常取
α
=
v
(
1
−
I
o
U
)
+
v
\alpha=\frac{v}{(1-IoU)+v}
α=(1−IoU)+vv
L
C
I
o
U
=
1
−
C
I
o
U
L_{CIoU} = 1- CIoU
LCIoU=1−CIoU
这是2020年5月份天津大学提交的一份论文中的工作,参考9
可以使用不同的IoU来对预测框做非极大值抑制(NMS)。
参考
1.https://zhuanlan.zhihu.com/p/58883095
2.https://arxiv.org/abs/1708.02002
3.https://pytorch.org/docs/stable/generated/torch.nn.SmoothL1Loss.html
4.https://arxiv.org/abs/1504.08083
5.https://bbs.cvmart.net/articles/1436
6.https://zhuanlan.zhihu.com/p/94799295
7.https://arxiv.org/abs/1902.09630
8.https://arxiv.org/abs/1911.08287
9.https://arxiv.org/abs/2005.03572