这篇文章我们说损失函数。下文中介绍的就是损失函数的种类与应用,有些在pytorch与tensorflow中相似的损失,比如BCE Loss与BCE With Logits Loss等相似的损失,只是集成不同方法的函数,就不再此介绍。
1. 0-1损失(Zero-one Loss)
0-1损失是指预测值和目标值不等则为1,否则为0:
0-1损失目前已经很少使用,主要还是它是一个非凸函数,针对分类任务不太适用。之前介绍的感知机,其实适用的就是0-1损失的变种,满足
2. Hinge Loss
hinge loss是一种在支持向量机中使用较多的损失函数,常用于”maximum-margin”的分类任务:
其中,
3. 均方误差损失(MSE Loss)
MSE, MAE, L1 Loss, L2 Loss, Smooth L1
均方误差(Mean Square Error,MSE)通常情况下是使用在回归中的损失函数,计算预测值与真实值之间误差的平方求平均,而平均绝对误差(MAE)则是使用的预测值与真实值之间误差的绝对值进行计算。
从梯度的求解和收敛上来看,MSE是比MAE效果好的,毕竟MSE随处可导,同时梯度值也是在动态变化的,而MAE在0点处不可导,在损失值很小的时候,不太好学习。在针对离群值的处理上,MAE要好于MSE。MAE对离群值不太敏感,但其导数不连续。
但是,有些情况如数据集中90%的数据的均值在150左右,剩下的10%在0-30之间,那么使用MAE作为损失函数,就很容易忽略这10%的数据。使用MSE作为损失函数,则模型会过分向0-30的数据偏移。这种时候我们应该对数据进行变换,或者使用其他的损失函数。
L1_loss与L2_loss其实与上述的两个loss function差别不大,只是没有取平均。所以他们的优缺点是互通的。
最后我们介绍Smooth L1 loss,这是用在目标检测领域较多的损失函数。
其中,
从上面可以看出,该函数实际上就是一个分段函数,在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题。
4. 交叉熵损失(CrossEntropy Loss)
之前我们介绍过,作为分类任务通常会使用softmax激活函数,输出一个概率值。交叉熵其实表示的就是实际输出(概率)与期望输出(概率)的距离,交叉熵越小,两个概率分布越近。
二值交叉熵损失与多分类交叉熵的本质区别是BCE损失在计算钱需要通过softmax激活函数, 多分类交叉熵需要通过sigmoid激活函数,从计算公式我们也可以看出来二值交叉熵需要保证0-1标签的概率合为1,多值交叉熵需要保证每个类别的概率在0-1的区间内。
交叉熵损失与均值方差对比
针对多标签分类任务有K个类别
通过交叉熵损失函数计算得到的
其实,从反向传播的方向更容易去理解,建议去看李宏毅老师的youtube课程,说的十分清楚,B站也有对应的课程这里就不放链接。