Q:损失函数有几种?原理是什么?有什么特点?
损失函数(loss function)是用来估量模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下式子:
其中,前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的Φ是正则化项(regularizer)或者叫惩罚项(penalty term),它可以是L1,也可以是L2,或者其他的正则函数。整个式子表示的意思是找到使目标函数最小时的θ值。下面主要列出几种常见的损失函数。
理解:损失函数旨在表示出logit和label的差异程度,不同的损失函数有不同的表示意义,也就是在最小化损失函数过程中,logit逼近label的方式不同,得到的结果可能也不同。
1、分类任务损失
1.1 0-1 loss
0-1 loss是最原始的loss,它直接比较输出值与输入值是否相等,对于样本i,它的loss等于:
1.2 0熵与交叉熵loss
香农在1948年提出了“信息熵”的概念,它使用对数函数表示对不确定性的测量。熵越高,表示能传输的信息越多,熵越少,表示传输的信息越少,我们可以直接将熵理解为信息量。为什么选择对数函数而不是其他函数呢?首先,不确定性必须是概率P的单调递降函数,假设一个系统中各个离散事件互不相关,要求其总的不确定性等于各自不确定性之和,对数函数是满足这个要求的。将不确定性f定义为log(1/p)=-log(p),其中p是概率。
说起交叉熵损失函数「Cross Entropy Loss」,脑海中立马浮现出它的公式:
推导过程:
我们知道,在二分类问题模型:例如逻辑回归「Logistic Regression」、神经网络「Neural Network」等,真实样本的标签为 [0,1],分别表示负类和正类。模型的最后通常会经过一个 Sigmoid 函数,输出一个概率值,这个概率值反映了预测为正类的可能性:概率越大,可能性越大。
Sigmoid 函数的表达式和图形如下所示:
其中 s 是模型上一层的输出,Sigmoid 函数有这样的特点:s = 0 时,g(s) = 0.5;s >> 0 时, g ≈ 1,s << 0 时,g ≈ 0。显然,g(s) 将前一级的线性输出映射到 [0,1] 之间的数值概率上。这里的 g(s) 就是交叉熵公式中的模型预测输出 。
我们说了,预测输出即 Sigmoid 函数的输出表征了当前样本标签为 1 的概率:
很明显,当前样本标签为 0 的概率就可以表达成:
重点来了,如果我们从极大似然性的角度出发,把上面两种情况整合到一起:
不懂极大似然估计也没关系。我们可以这么来看:
当真实样本标签 y = 0 时,上面式子第一项就为 1,概率等式转化为:
当真实样本标签 y = 1 时,上面式子第二项就为 1,概率等式转化为:
两种情况下概率表达式跟之前的完全一致,只不过我们把两种情况整合在一起了。
重点看一下整合之后的概率表达式,我们希望的是概率 P(y|x) 越大越好。首先,我们对 P(y|x) 引入 log 函数,因为 log 运算并不会影响函数本身的单调性。则有:
我们希望 log P(y|x) 越大越好,反过来,只要 log P(y|x) 的负值 -log P(y|x) 越小就行了。那我们就可以引入损失函数,且令 Loss = -log P(y|x)即可。则得到损失函数为:
非常简单,我们已经推导出了单个样本的损失函数,是如果是计算 N 个样本的总的损失函数,只要将 N 个 Loss 叠加起来就可以了:
这样,我们已经完整地实现了交叉熵损失函数的推导过程。
1.3 softmax loss及其变种
假如log loss中的f(xij)的表现形式是softmax概率的形式,那么交叉熵loss就是我们熟知的softmax with cross-entropy loss,简称softmax loss,所以说softmax loss只是交叉熵的一个特例。
softmax loss被广泛用于分类分割等任务,而且发展出了很多的变种,有针对不平衡样本问题的weighted softmax loss, focal loss,针对蒸馏学习的soft softmax loss,促进类内更加紧凑的L-softmax Loss等一系列改进,早在一年前就撰写过综述如下:
1.3.1 softmax loss
原始的softmax loss非常优雅,简洁,被广泛用于分类问题。它的特点就是优化类间的距离非常棒,但是优化类内距离时比较弱。
鉴于此,就有了很多对softmax loss的改进,下面一一道来。
1.3.2 weighted softmax loss【1】
这第一个改进就是weighted,怎么说?假如我们是一个分类问题,只有两类,但是两类的样本数目差距非常之大。比如边缘检测问题,这个时候,明显边缘像素的重要性是比非边缘像素大的,此时可以针对性的对样本进行加权。wc就是这个权重,像刚才所说,c=0代表边缘像素,c=1代表非边缘像素,则我们可以令w0=1,w1=0.001,即加大边缘像素的权重。
1.3.3 soft softmax loss【2】
当T=1时,就是softmax的定义,当T>1,就称之为soft softmax,T越大,因为Zk产生的概率差异就会越小。
1.3.4 Large-Margin Softmax Loss【3】称为L-Softmax loss
1.3.5 angular softmax loss【4】也称A-softmax loss
它就是在large margin softmax loss的基础上添加了两个限制条件||W||=1和b=0,使得预测仅取决于W和x之间的角度θ
1.3.6 L2-constrained softmax loss【5】
1.3.7 additive margin softmax loss【7】
1.3.8 argface additive angular margin【8】
到此可以说为了改进softmax loss用尽了手段了,至于有没有用,具体效果大家去尝试吧,附上未完整的GitHub链接。
https://github.com/longpeng2008/Caffe_Long
1.4、KL散度
Kullback和Leibler定义了KL散度用于估计两个分布的相似性,定义如下;
Dkl是非负的,只有当p与q处处相等时,才会等于0。上面的式子也等价于
其中l(p,p)是分布p的熵,而l(p,q)就是p和q的交叉熵。假如p是一个已知的分布,则熵是一个常数,此时dkl(p|q)与l(p,q)也就是交叉熵只有一个常数的差异,两者是等价的。
同时值得注意的是,KL散度并不是一个对称的loss,即dkl(p|q) != dkl(q|p),KL散度常被用于生成式模型。
1.5 Hinge loss
Hinge loss主要用于支持向量机中,它的称呼来源于损失的形状,定义如下:
如果分类正确,loss=0,如果错误则为1-f(x),所以它是一个分段不光滑的曲线。Hinge loss被用来解SVM问题中的间距最大化问题。
1.6 Exponential loss与Logistic loss
Exponential loss是一个指数形式的loss,它的特点就是梯度比较大,主要用于Adaboost集成学习算法中,定义如下:
logistic loss取了Exponential loss的对数形式,它的定义如下:
logistic loss 梯度相对变化更加平缓。
此外还有sigmoid cross_entropy_loss,可以被用于多标签分类任务或者不需要创建类间竞争机制的分类任务,在Mask RCNN中就被用了。
以上就涵盖了大部分常用的分类任务损失,多半都是对数的形式,这是由信息熵的定义,参数似然估计的本质决定的。
2. 回归任务损失
在回归任务中,回归的结果是一些整数或者实数,并没有先验的概率密度分布,常使用的loss是L1 loss和L2 loss。
2.1、L1 loss
Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离:
由于L1 loss具有稀疏性,为了惩罚较大的值,因此常常将其作为正则项添加到其他loss中作为约束。L1 loss的最大问题是梯度在零点不平滑,导致会跳过极小值。
2.2、L2 loss
Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧氏距离,它以误差的平方和作为距离:
L2 loss也常常作为正则项。当预测值与目标值相差很大时, 梯度容易爆炸,因为梯度里包含了x−t。
2.3、L1 loss与L2 loss的改进
原始的L1 loss和L2 loss都有缺陷,比如L1 loss的最大问题是梯度不平滑,而L2 loss的最大问题是容易梯度爆炸,所以研究者们对其提出了很多的改进。
在faster rcnn框架中,使用了smooth L1 loss来综合L1与L2 loss的优点,定义如下:
在x比较小时,上式等价于L2 loss,保持平滑。在x比较大时,上式等价于L1 loss,可以限制数值的大小。
为了增强L2 loss对噪声(离群点)的鲁棒性,研究者提出了Huber loss,定义如下:
Huber对于离群点非常的有效,它同时结合了L1与L2的优点,不过多出来了一个delta参数需要进行训练。
2.4、perceptual loss
L2 loss逐步被人眼感知loss所取代。人眼感知loss也被称为perceptual loss(感知损失),它与MSE采用图像像素进行求差的不同之处在于所计算的空间不再是图像空间。
研究者们常使用VGG等网络的特征,令φ来表示损失网络,Cj表示网络的第j层,CjHjWj表示第j层的特征图的大小,感知损失的定义如下:
可以看出,它有与L2 loss同样的形式,只是计算的空间被转换到了特征空间。