跳转至

损失函数

L1 Loss

取预测值与真实值之差的绝对值的平均数作为损失值,最简单直接

import torch
loss = torch.nn.L1Loss()
pred = torch.Tensor([[0.1,0.2],[0.3,0.4]])
target = torch.Tensor([[0.4,0.3],[0.2,0.1]])
print(loss(pred, target))
# tensor(0.2000)
计算公式 $$ L = \frac{|0.1-0.4|+|0.2-0.3|+|0.3-0.2|+|0.4-0.1|}{4}=0.2 $$

MES Loss

取预测值与真实值之差的平方的平均数作为损失值

import torch
loss = torch.nn.MSELoss()
pred = torch.Tensor([[0.1,0.2],[0.3,0.4]])
target = torch.Tensor([[0.4,0.3],[0.2,0.1]])
print(loss(pred, target))
# tensor(0.0500)
计算公式 $$ L = \frac{(0.1-0.4)^2+(0.2-0.3)^2+(0.3-0.2)^2+(0.4-0.1)^2}{4}=5 $$

Dice Loss

Dice Loss是由Dice系数而得名的,Dice系数是一种用于评估两个样本相似性的度量函数,其值越大意味着这两个样本越相似,Dice系数的数学表达式如下 $$ Dice=\frac{2|X \cap Y|}{|X|+|Y|} $$ 其中\(X \cap Y\)表示\(X\)\(Y\)之间交集元素的个数,\(|X|\)\(|Y|\)分别表示\(X\)\(Y\)的元素个数。DiceLoss的数学表达式如下 $$ Dice Loss = 1 - Dice $$ Dice Loss常用于语义分割的问题中,\(X\)\(Y\)分别表示预测值和真实值,DiceLoss越小,说明预测值和真实值越相似,DiceLoss越大,说明预测值和真实值越不相似。 Dice Loss可以缓解样本中前景不平衡带来的消极影响,前景不平衡也就是说图像中大部分区域是不包含目标的,只有一小部分区域包含目标。 Dice Loss训练更关注对前景区域的挖掘,即保证有较低的FN,但会存在损失饱和问题,而CE Loss是平等地计算每个像素点的损失, 当前点的损失只和当前预测值与真实标签值的距离有关,这会导致一些问题(见Focal Loss)。因此单独使用Dice Loss往往并不能取得 较好的结果,需要进行组合使用,比如Dice Loss+CE Loss或者Dice Loss+Focal Loss等。

Cross Entropy Loss(交叉熵损失)

什么是交叉熵

  • 信息量:用来衡量一个事件的不确定性;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小
  • 熵:用来衡量一个系统的混乱程度,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大
  • 交叉熵:主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近

  • 优点:使用逻辑函数得到概率,并结合交叉熵当损失函数时,在模型效果差的时候学习速度比较快,在模型效果好的时候学习速度变慢

  • 缺点:擅长于学习类间的信息,因为它采用了类间竞争机制,它只关心对于正确标签预测概率的准确性,忽略了其他非正确标签的差异,导致学习到的特征比较散。 基于这个问题的优化有很多,比如对softmax进行改进,如L-Softmax、SM-Softmax、AM-Softmax等

对于二分类的交叉熵损失函数 $$ L = \frac{1}{N} \sum_{i} L_i = \frac{1}{N}\sum_{i} - [y_i \log p_i + (1-y_i) \log (1-p_i)] $$ 其中

  • \(y_i\)表示样本\(i\)的label,正类是1,负类是0。
  • \(p_i\)表示样本\(i\)的预测概率

对于多分类的交叉熵损失函数,就是对二分类的拓展,也就是对每个类别都计算一次交叉熵损失,然后求平均 $$ L = \frac{1}{N} \sum_{i} L_i = - \frac{1}{N} \sum_{i} \sum_{c=1}^{M}y_{ic} \log (p_{ic}) $$ 其中

  • \(M\)表示类别的个数
  • \(y_{ic}\)符号函数,如果样本\(i\)的label是\(c\),则为1,否则为0
  • \(p_{ic}\)表示样本\(i\)属于类别\(c\)的预测概率

import torch
loss = torch.nn.CrossEntropyLoss()
pred = torch.Tensor([[0.1,0.2],[0.3,0.4]])
target = torch.Tensor([[0.4,0.3],[0.2,0.1]])
print(loss(pred, target))
# tensor(0.3522)
# 还没有推导出来,这里的loss是怎么计算的
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率, 所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。

  1. 神经网络最后一层得到每个类别的得分scores(也叫logits);
  2. 该得分经过sigmoid(或softmax)函数获得概率输出;
  3. 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。

Weighted Cross Entropy Loss(加权交叉熵损失)

通过加权,解决正负样本不均衡的问题

Focal Loss

Focal Loss的引入主要是为了解决难易样本数量不平衡,训练过程关注对象的排序为正难>负难>正易>负易。 把高置信度样本的损失再降低一些,让模型更加关注难样本。

评论