常用损失函数

常用损失函数

损失函数(loss function或cost function)是关于模型输出(predict)与标签(ground-truth)的函数,主要用于衡量在训练集(或验证集、测试集)上的效果。

1.均方误差损失函数 (MSE loss function)

损失函数定义如下:

很少用于分类问题(instance level / pixel level),主要是由于MSE对于错误输出过于关注(即错误标签和正确标签之间的误差会被平方操作放大),在分类问题中较难收敛.

2.交叉熵损失函数 (cross entropy loss function)

假设神经网络的输出$a=\sigma(z)$,其中$z=\omega{x+b}$, $y$为ground-truth label,则交叉熵损失定义为:

  • 当$y=1$,输出$a=0$时,$L$会非常大(理论上无限大,但通常会有数学操作使其限定在一个可计算的范围),即表示误差很大;
  • 当$y=0$,输出$a=1$时,$L$同样会非常大,误差较大;
  • 当标签$y$和输出$a$一样时,$L=0$,不会产生误差

注意,这里要求标签$y$和输出$a$的范围在[0,1]之间,那么当其不符合要求时,可以使用softmax cross entropy loss或者sigmoid cross entropy loss

3.Softmax cross entropy loss

Softmax函数定义

  • softmax的作用如其名字所示,是一种“soft”的取最大值的方式。这种soft体现在,与那种将输出中的最大值直接置为1,其他值置为0,的“hard”操作相比,softmax函数会将输出进行放缩,是输出值都在$[0,1]$之间,且所有输出的和是1,因此输出也表现为一种概率分布的形式;即输入实数向量,返回一个概率分布。
  • 此外,softmax另一个重要的作用是,使反向传播过程可以进行,因为softmax函数是可导的;如果使用max函数的话,在计算反向传播过程中,max是不可导的。

可以使用pytorch自带函数查看效果:

1
2
3
4
import torch
a = torch.FloatTensor([2,5,1,6,8,3])
f = torch.nn.Softmax()
print(f(a))

输出结果是:

1
tensor([ 0.0021,  0.0417,  0.0008,  0.1132,  0.8366,  0.0056])

可以看出,softmax操作不会改变数据的相对大小关系,原来最大的8放缩后还是数据中最大的值,只是这种操作保留了原来最小的值1,而不是生硬地将最小值1置为0.

Softmax损失函数

在使用神经网络的(多)分类任务中,经常使用Softmax作为输出层。经过softmax操作后的输出在[0,1]之间,而输入的标签通常也是会转换成one-hot向量格式,因此在这种情况下,就可以使用上面提到的交叉熵损失函数计算模型的loss了。

使用softmax函数的损失函数为:

log函数里面的值就是这组数据正确分类的Softmax值,它占的比重越大,这个样本的Loss也就越小,这种定义符合我们的要求.取负值是因为,每个分类在所有类构成的分布中占有的比值是小于1的,因此其log值小于零,取负值后就变成可以贡献正值的loss了。

注意,在pytorch中,softmax cross entropy loss类中已经带有了softmax操作了,前面网络输出某个维度的特征到这个loss函数中,无需再进行手动softmax操作。

4.Sigmoid cross entropy loss

sigmoid函数定义

说明

  • sigmoid函数是一个可微的有界函数,在各点均有非负的导数。
  • 当$x\to +\infty$时,$S(x)\to 1$;当$x\to -\infty$时,$S(x)\to 0$,因此该函数常用于二分类(Binary Classification)问题,以及神经网络的激活函数(Activation Function)(把线性的输入转换为$[0,1]$之间的非线性的输出)。
  • 当softmax函数的输入长度$i=2$时(参考上面的Softmax函数定义),softmax函数就退化成了sigmoid函数

参考
https://zhuanlan.zhihu.com/p/33542937