基本用法:
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]
此标准将LogSoftMax
和NLLLoss
集成到一个类中。
当训练一个多类分类器的时候,这个方法是十分有用的。
- 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
的计算公式变为:
计算出的loss
对mini-batch
的大小取了平均。
形状(shape
):
-
Input: (N,C)
C
是类别的数量 -
Target: (N)
N
是mini-batch
的大小,0 <= targets[i] <= C-1
4. class torch.nn.NLLLoss(weight=None, size_average=True)[source]
负的log likelihood loss
损失。用于训练一个n
类分类器。
如果提供的话,weight
参数应该是一个1-D
tensor,里面的值对应类别的权重。当你的训练集样本不均衡的话,使用这个参数是非常有用的。
输入是一个包含类别log-probabilities
的2-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-D
tensor,大小为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]
给定 输入 Tensors
,x1
, x2
和一个标签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)缺点:
- 对离群点较为敏感,可能导致模型性能下降。
- 当预测值与真实值差异较大时,梯度也会很大,可能导致梯度爆炸问题。