在深度学习中,损失函数扮演着至关重要的角色。通过对最小化损失函数,使模型达到收敛状态,减少模型预测值的误差。因此,不同的损失函数,对模型的影响是重大的。接下来,总结一下,在工作中经常用到的损失函数:
图像分类:交叉熵
目标检测:Focal loss,L1/L2损失函数,IOU Loss,GIOU ,DIOU,CIOU
图像识别:Triplet Loss,Center Loss,Sphereface,Cosface,Arcface
图像分类
交叉熵
在图像分类中,经常使用softmax+交叉熵作为损失函数,具体的推导可以参考我以前的博客。
$$Cross Entropy=-\sum_{i=1}^{n}p(x_i)ln(q(x_i))$$
其中,$p(x)$表示真实概率分布,$q(x)$表示预测概率分布。交叉熵损失函数通过缩小两个概率分布的差异,来使预测概率分布尽可能达到真实概率分布。
后来,谷歌在交叉熵的基础上,提出了label smoothing(标签平滑),具体介绍,可以参考这篇博客。
在实际中,需要用预测概率去拟合真实概率,而拟合one-hot的真实概率函数会带来两个问题:
无法保证模型的泛化能力,容易造成过拟合;
全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难adapt,会造成模型过于相信预测的类别。
因此,为了减少这种过于自信,同时减缓人为标注的误差带来的影响,需要对$p(x)$进行变化:
$$p'{(x)}=(1-\epsilon )\delta _{(k,y)}+\epsilon u(k)$$
其中,$\delta _{(k,y)}$为Dirac函数,$u(k)$为均匀分布。简单而言,降低标签y的置信度,提高其余类别的置信度。从而,交叉熵变成了:
$$H(p',q)=-\sum_{i=1}^{n}p'(x_i)ln(q(x_i))=(1-\epsilon )H(p,q)+\epsilon H(p,u)$$
目标检测
在目标检测中,损失函数一般由两部分组成,classification loss和bounding box regression loss。calssification loss的目的是使类别分类尽可能正确;bounding box regression loss的目的是使预测框尽可能与GT框匹对上。
Focal loss
该Focal loss损失函数出自于论文《Focal Loss for Dense Object Detection》,主要是解决正负样本之间的不平衡问题。通过降低easy example中的损失值,间接提高了hard example中损失值的权重。Focal loss是基于交叉熵进行改进的:
$$Focal loss=-\alpha _t(1-p_t)^\gamma log(p_t)$$
可以看到,在交叉熵前增加了$(1-p_t)^\gamma $,当图片被错分时,$p_t$会很小,$(1-p_t)$接近于1,所以损失受到的影响不大;而增加参数$\gamma $是为了平滑降低esay example的权重。当$\gamma =0$时,Focal loss退化成交叉熵。对于不同的$\gamma $,其影响如下图所示。
L1,L2,smooth L1损失函数
利用L1,L2或者smooth L1损失函数,来对4个坐标值进行回归。smooth L1损失函数是在Fast R-CNN中提出的。三个损失函数,如下所示:
$$L1=\left | x \right |$$
$$L2=x^{2}$$
$$smoothL1=\left\{\begin{matrix} 0.5x^2\qquad if\left |x \right |<1\\ \left |x \right |-0.5 \qquad otherwise \end{matrix}\right.$$
从损失函数对x的导数可知:$L1$损失函数对x的导数为常数,在训练后期,x很小时,如果learning rate 不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。$L2$损失函数对x的导数在x值很大时,其导数也非常大,在训练初期不稳定。smooth L1完美的避开了$L1$和$L2$损失的缺点。
在一般的目标检测中,通常是计算4个坐标值与GT框之间的差异,然后将这4个loss进行相加,构成regression