0%

深度学习基础(2)

这篇文章我们说损失函数。下文中介绍的就是损失函数的种类与应用,有些在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”的分类任务:

其中,代表目标值代表预测数据,在之间。其意义是的值在-1到1之间,不鼓励,即并不鼓励分类器过度自信,让某个可以正确分类的样本距离分割线的距离超过1并不会有任何奖励。从而使得分类器可以更专注整体的分类误差。

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 smooth L1损失对比

从上面可以看出,该函数实际上就是一个分段函数,在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题。

4. 交叉熵损失(CrossEntropy Loss)
之前我们介绍过,作为分类任务通常会使用softmax激活函数,输出一个概率值。交叉熵其实表示的就是实际输出(概率)与期望输出(概率)的距离,交叉熵越小,两个概率分布越近。

二值交叉熵损失与多分类交叉熵的本质区别是BCE损失在计算钱需要通过softmax激活函数, 多分类交叉熵需要通过sigmoid激活函数,从计算公式我们也可以看出来二值交叉熵需要保证0-1标签的概率合为1,多值交叉熵需要保证每个类别的概率在0-1的区间内。

交叉熵损失与均值方差对比
针对多标签分类任务有K个类别,我们的分类模型得到的结果为的概率,我们知道真正的标签中,只有一个代表的是1,其他值都为0。
通过交叉熵损失函数计算得到的,均方误差计算得到的是。对于损失函数而言,当然是越小越好,而对于交叉熵损失函数而言,损失函数只与对应标签为1的模型输出有关,与其他值无关,而对于均方误差而言,对应标签为1的输出当然是越大越好,但是它还与其他所有的输出值有关。当的值为最大后(一般都不为1),那么对于剩下的那些输出值来说,怎么将损失值最小化,那就是均匀分布。这就会导致,模型学习不到有的类别有些相似,有的类别差异性较大。

其实,从反向传播的方向更容易去理解,建议去看李宏毅老师的youtube课程,说的十分清楚,B站也有对应的课程这里就不放链接。