pytorch 损失函数

基本用法:

criterion = LossCriterion() #构造函数有自己的参数
loss = criterion(x, y) #调用标准时也有参数

计算出来的结果已经对mini-batch取了平均。

一、损失函数列表

1. class torch.nn.L1Loss(size_average=True)[source]

创建一个衡量输入x(模型预测输出)和目标y之间差的绝对值的平均值的标准。

  • x 和 y 可以是任意形状,每个包含n个元素。

  • n个元素对应的差值的绝对值求和,得出来的结果除以n

  • 如果在创建L1Loss实例的时候在构造函数中传入size_average=False,那么求出来的绝对值的和将不会除以n

2. class torch.nn.MSELoss(size_average=True)[source]

创建一个衡量输入x(模型预测输出)和目标y之间均方误差标准。

  • x 和 y 可以是任意形状,每个包含n个元素。

  • n个元素对应的差值的绝对值求和,得出来的结果除以n

  • 如果在创建MSELoss实例的时候在构造函数中传入size_average=False,那么求出来的平方和将不会除以n

3. class torch.nn.CrossEntropyLoss(weight=None, size_average=True)[source]

此标准将LogSoftMaxNLLLoss集成到一个类中。

当训练一个多类分类器的时候,这个方法是十分有用的。

  • weight(tensor): 1-D tensor,n个元素,分别代表n类的权重,如果你的训练样本很不均衡的话,是非常有用的。默认值为None。

调用时参数:

  • input : 包含每个类的得分,2-D tensor,shape为 batch*n

  • target: 大小为 n 的 1—D tensor,包含类别的索引(0到 n-1)。

Loss可以表述为以下形式:

weight参数被指定的时候,loss的计算公式变为:

计算出的lossmini-batch的大小取了平均。

形状(shape):

  • Input: (N,C) C 是类别的数量

  • Target: (N) Nmini-batch的大小,0 <= targets[i] <= C-1

4. class torch.nn.NLLLoss(weight=None, size_average=True)[source]

负的log likelihood loss损失。用于训练一个n类分类器。

如果提供的话,weight参数应该是一个1-Dtensor,里面的值对应类别的权重。当你的训练集样本不均衡的话,使用这个参数是非常有用的。

输入是一个包含类别log-probabilities2-D tensor,形状是(mini-batch, n)

可以通过在最后一层加LogSoftmax来获得类别的log-probabilities

如果您不想增加一个额外层的话,您可以使用CrossEntropyLoss

loss期望的target是类别的索引 (0 to N-1, where N = number of classes)

loss可以被表示如下:

如果weights参数被指定的话,loss可以表示如下:

参数说明:

  • weight (Tensor, optional) – 手动指定每个类别的权重。如果给定的话,必须是长度为nclasses

  • size_average (bool, optional) – 默认情况下,会计算mini-batch``loss的平均值。然而,如果size_average=False那么将会把mini-batch中所有样本的loss累加起来。

形状:

  • Input: (N,C) , C是类别的个数

  • Target: (N) , target中每个值的大小满足 0 <= targets[i] <= C-1

例子:

 m = nn.LogSoftmax()
 loss = nn.NLLLoss()
 # input is of size nBatch x nClasses = 3 x 5
 input = autograd.Variable(torch.randn(3, 5), requires_grad=True)
 # each element in target has to have 0 <= value < nclasses
 target = autograd.Variable(torch.LongTensor([1, 0, 4]))
 output = loss(m(input), target)
 output.backward()

5. class torch.nn.NLLLoss2d(weight=None, size_average=True)[source]

对于图片的 negative log likehood loss。计算每个像素的 NLL loss

参数说明:

  • weight (Tensor, optional) – 用来作为每类的权重,如果提供的话,必须为1-Dtensor,大小为C:类别的个数。

  • size_average – 默认情况下,会计算 mini-batch loss均值。如果设置为 False 的话,将会累加mini-batch中所有样本的loss值。默认值:True

形状:

  • Input: (N,C,H,W) C 类的数量

  • Target: (N,H,W) where each value is 0 <= targets[i] <= C-1

例子:

 m = nn.Conv2d(16, 32, (3, 3)).float()
 loss = nn.NLLLoss2d()
 # input is of size nBatch x nClasses x height x width
 input = autograd.Variable(torch.randn(3, 16, 10, 10))
 # each element in target has to have 0 <= value < nclasses
 target = autograd.Variable(torch.LongTensor(3, 8, 8).random_(0, 4))
 output = loss(m(input), target)
 output.backward()

6. class torch.nn.KLDivLoss(weight=None, size_average=True)[source]

计算 KL 散度损失。

KL散度常用来描述两个分布的距离,并在输出分布的空间上执行直接回归是有用的。

NLLLoss一样,给定的输入应该是log-probabilities。然而。和NLLLoss不同的是,input不限于2-D tensor,因为此标准是基于element的。

target 应该和 input的形状相同。

此loss可以表示为:

默认情况下,loss会基于element求平均。如果 size_average=False loss 会被累加起来。

7. class torch.nn.BCELoss(weight=None, size_average=True)[source]

计算 target 与 output 之间的二进制交叉熵。 $$ loss(o,t)=-\frac{1}{n}\sum_i(t[i] log(o[i])+(1-t[i]) log(1-o[i])) $$ 如果weight被指定 : $$ loss(o,t)=-\frac{1}{n}\sum_iweights[i] (t[i] log(o[i])+(1-t[i])* log(1-o[i])) $$

这个用于计算 auto-encoder 的 reconstruction error。注意 0<=target[i]<=1。

默认情况下,loss会基于element平均,如果size_average=False的话,loss会被累加。

8. class torch.nn.MarginRankingLoss(margin=0, size_average=True)[source]

创建一个标准,给定输入 $x1$,$x2$两个1-D mini-batch Tensor's,和一个$y$(1-D mini-batch tensor) ,$y$里面的值只能是-1或1。

如果 y=1,代表第一个输入的值应该大于第二个输入的值,如果y=-1的话,则相反。

mini-batch中每个样本的loss的计算公式如下:

如果size_average=True,那么求出的loss将会对mini-batch求平均,反之,求出的loss会累加。默认情况下,size_average=True

9. class torch.nn.HingeEmbeddingLoss(size_average=True)[source]

给定一个输入 $x$(2-D mini-batch tensor)和对应的 标签 $y$ (1-D tensor,1,-1),此函数用来计算之间的损失值。这个loss通常用来测量两个输入是否相似,即:使用L1 成对距离。典型是用在学习非线性 embedding或者半监督学习中:

$x$和$y$可以是任意形状,且都有n的元素,loss的求和操作作用在所有的元素上,然后除以n。如果您不想除以n的话,可以通过设置size_average=False

margin的默认值为1,可以通过构造函数来设置。

10. class torch.nn.MultiLabelMarginLoss(size_average=True)[source]

计算多标签分类的 hinge loss(margin-based loss) ,计算loss时需要两个输入: input x(2-D mini-batch Tensor),和 output y(2-D tensor表示mini-batch中样本类别的索引)。

其中 I=x.size(0),J=y.size(0)。对于所有的 i和 j,满足 $y[j]\neq0, i \neq y[j]$

x 和 y 必须具有同样的 size

这个标准仅考虑了第一个非零 y[j] targets 此标准允许了,对于每个样本来说,可以有多个类别。

11. class torch.nn.SmoothL1Loss(size_average=True)[source]

平滑版L1 loss

loss的公式如下:

此loss对于异常点的敏感性不如MSELoss,而且,在某些情况下防止了梯度爆炸,(参照 Fast R-CNN)。这个loss有时也被称为 Huber loss

x 和 y 可以是任何包含n个元素的tensor。默认情况下,求出来的loss会除以n,可以通过设置size_average=True使loss累加。

12. class torch.nn.SoftMarginLoss(size_average=True)[source]

创建一个标准,用来优化2分类的logistic loss。输入为 x(一个 2-D mini-batch Tensor)和 目标y(一个包含1或-1的Tensor)。

如果求出的loss不想被平均可以通过设置size_average=False

13. class torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=True)[source]

创建一个标准,基于输入x和目标y的 max-entropy,优化多标签 one-versus-all 的损失。x:2-D mini-batch Tensor;y:binary 2D Tensor。对每个mini-batch中的样本,对应的loss为:

其中 I=x.nElement()-1, $y[i] \in {0,1}$,y 和 x必须要有同样size

14. class torch.nn.CosineEmbeddingLoss(margin=0, size_average=True)[source]

给定 输入 Tensorsx1x2 和一个标签Tensor y(元素的值为1或-1)。此标准使用cosine距离测量两个输入是否相似,一般用来用来学习非线性embedding或者半监督学习。

margin应该是-1到1之间的值,建议使用0到0.5。如果没有传入margin实参,默认值为0。

每个样本的loss是:

如果size_average=True 求出的loss会对batch求均值,如果size_average=False的话,则会累加loss。默认情况size_average=True

15. class torch.nn.MultiMarginLoss(p=1, margin=1, weight=None, size_average=True)[source]

用来计算multi-class classification的hinge loss(magin-based loss)。输入是 x(2D mini-batch Tensor), y(1D Tensor)包含类别的索引, 0 <= y <= x.size(1))

对每个mini-batch样本:

其中 I=x.size(0) $i\neq y$。 可选择的,如果您不想所有的类拥有同样的权重的话,您可以通过在构造函数中传入weights参数来解决这个问题,weights是一个1D权重Tensor。

传入weights后,loss函数变为:

默认情况下,求出的loss会对mini-batch取平均,可以通过设置size_average=False来取消取平均操作。

二、损失函数的优缺点

1. 平方损失函数(Mean Squared Error, MSE)

优点

  • 易于理解和实现。
  • 损失函数关于输入是可导的,便于使用梯度下降等优化算法。
  • 对误差较大的情况给予更大的惩罚,有利于模型快速收敛到较优解。

缺点

  • 对离群点(outliers)敏感,可能会导致模型性能下降。
  • 当预测值与真实值差异较大时,梯度也会很大,可能导致梯度爆炸问题。

2. 绝对值损失函数(Mean Absolute Error, MAE)

优点

  • 对离群点的敏感度较低,鲁棒性较好。
  • 损失函数关于输入也是可导的(除了在0点处),但相对于MSE,其梯度在大部分情况下较为稳定。

缺点

  • 在0点处不可导,给优化算法带来一定困难。
  • 相对于MSE,其收敛速度可能较慢。

3. Huber损失函数

优点

  • 综合了MSE和MAE的优点,既对离群点不敏感,又能在误差较小时提供较快的收敛速度。
  • 在误差较小时表现为平方损失,误差较大时表现为绝对损失,通过调整超参数可以平衡两者。

缺点

  • 需要选择合适的超参数,这通常需要一定的实验和调参经验。

4. 交叉熵损失函数(Cross Entropy Loss)

优点

  • 在分类问题中广泛使用,能够很好地处理多分类问题。
  • 与softmax函数结合使用时,能够直观地表示概率分布之间的差异。
  • 损失函数关于输入是可导的,便于使用梯度下降等优化算法。

缺点

  • 对于某些特定情况(如类别不平衡),可能需要进行适当的加权处理。

5. 对数损失函数(Logarithmic Loss)

对数损失函数主要用于二分类问题,与交叉熵损失函数在二分类场景下等价。其优缺点与交叉熵损失函数相似。

6. 指数损失函数(Exponential Loss)

优点

  • 在某些特定的算法(如AdaBoost)中表现良好。
  • 能够提供稳定的分类面。

缺点

  • 对异常值较为敏感,可能不适合所有情况。

7. Smooth L1 Loss

优点

  • 在误差较小时,表现类似于平方损失(MSE),具有较快的收敛速度。
  • 在误差较大时,表现类似于绝对值损失(MAE),对离群点更加鲁棒。
  • 相对于MSE,对异常值的敏感度较低,有利于模型的稳定性。

缺点

  • 需要选择合适的超参数(如平滑阈值),这可能需要一定的实验和调参经验。

8. Hinge Loss

优点

  • 常用于二分类问题中的支持向量机(SVM),能够最大化分类间隔,提高模型的泛化能力。
  • 损失函数关于输入是可导的,便于使用梯度下降等优化算法。

缺点

  • 对于非支持向量(即分类正确的点且距离分类边界较远的点),其损失始终为0,这可能导致模型对这些点的关注不足。

9. Triplet Loss

优点

  • 常用于学习样本之间的相对距离,如人脸识别等任务。
  • 通过三元组(锚点、正样本、负样本)的形式,能够有效地拉近同类样本之间的距离,同时推远异类样本之间的距离。

缺点

  • 需要大量的三元组样本进行训练,样本采集和标注成本较高。
  • 对异常值较为敏感,可能需要额外的数据清洗和预处理步骤。

10. PoissonNLLLoss

优点

  • 适用于目标变量遵循泊松分布的情况,如计数数据的回归问题。
  • 能够有效地处理非负整数数据,并考虑到数据的统计特性。

缺点

  • 假设目标变量严格遵循泊松分布,这在某些实际问题中可能不成立。
  • 相对于其他通用损失函数,其应用场景较为特定。

11. KL Divergence Loss(KL散度损失)

优点

  • 用于衡量两个概率分布之间的差异,常用于生成模型和强化学习等场景。
  • 能够提供分布之间的相似度度量,有助于模型的优化和评估。

缺点

  • 当两个分布差异很大时,KL散度可能变得非常大,导致梯度不稳定或梯度爆炸问题。
  • 对输入数据的概率分布有一定的要求,需要确保输入是有效的概率分布。

12. CosineEmbeddingLoss

优点

  • 通过余弦相似度来衡量两个向量之间的相似度,适用于需要评估向量相似性的任务。
  • 损失函数关于输入是可导的,便于使用梯度下降等优化算法。

缺点

  • 需要明确指定目标相似度(即标签),这可能需要额外的标注信息。
  • 对输入向量的模长不敏感,只考虑向量之间的方向差异。

 

13. 多标签分类损失函数(MultiLabelSoftMarginLoss)

优点

  • 适用于多标签分类问题,即每个样本可以同时属于多个类别。
  • 通过sigmoid函数将模型输出转换为概率,然后对每个类别的概率应用二元交叉熵损失,最后求和得到总损失。
  • 允许模型对不同的类别输出不同的置信度。

缺点

  • 对标签的依赖性较高,需要确保标签的准确性和完整性。
  • 在类别数量非常多时,计算量可能较大。

14. 负对数似然损失函数(NLLLoss)

优点

  • 常与log_softmax函数结合使用,用于多分类问题。
  • 能够直接输出分类的概率分布,便于理解和解释。
  • 损失函数关于输入是可导的,便于使用梯度下降等优化算法。

缺点

  • 需要确保输入是经过log_softmax处理的对数概率,否则可能无法正确计算损失。
  • 对类别不平衡问题较为敏感,可能需要采取额外的措施来处理。

15. Hinge Embedding Loss

(已在之前的回答中提及,但为保持完整性再次列出)

优点

  • 常用于支持向量机(SVM)的训练,能够最大化分类间隔。
  • 损失函数关于输入是可导的,便于优化。

缺点

  • 对非支持向量(即分类正确的点且距离分类边界较远的点)不敏感,可能导致模型对这些点的关注不足。

16. Focal Loss

优点

  • 专为解决分类问题中的类别不平衡问题而设计。
  • 通过调整易分类样本和难分类样本的权重,使得模型更加关注难分类的样本。
  • 能够在一定程度上提高模型的泛化能力。

缺点

  • 需要选择合适的超参数(如gamma和alpha),这可能需要一定的实验和调参经验。
  • 相对于其他损失函数,其计算复杂度可能稍高。

17. L1 Loss 和 L2 Loss(虽然之前以MAE和MSE的形式提及,但此处以更通用的形式列出)

L1 Loss(MAE)优点

  • 对离群点(异常值)的敏感度较低,具有更好的鲁棒性。
  • 损失函数关于输入是次可导的(除了0点外),可以使用次梯度方法进行优化。

L1 Loss(MAE)缺点

  • 在0点处不可导,可能导致优化算法在0点附近产生震荡。
  • 相对于L2 Loss,其收敛速度可能较慢。

L2 Loss(MSE)优点

  • 损失函数关于输入是光滑的,具有更好的数学性质。
  • 在误差较小时,能够提供更快的收敛速度。

L2 Loss(MSE)缺点

  • 对离群点较为敏感,可能导致模型性能下降。
  • 当预测值与真实值差异较大时,梯度也会很大,可能导致梯度爆炸问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值