目录
-
- 1、L1loss
- 2、MSELoss
- 3、CrossEntropyLoss
- 4、NLLLoss
- 5、PoissonNLLLoss
- 6、KLDivLoss
- 7、BCELoss
- 8、BCEWithLogitsLoss
- 9、SmoothL1Loss
- 10、MarginRankingLoss
- 11、MultiMarginLoss
- 12、MultiLabelMarginLoss
- 13、SoftMarginLoss
- 14、MultiLabelSoftMarginLoss
- 15、TripletMarginLoss
- 16、HingeEmbeddingLoss
- 17、CosineEmbeddingLoss
- 18、CTCLOSS
pytorch API官方文档:
https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html
可参考链接
https://www.jianshu.com/p/579a0f4cbf24
1、L1loss
torch.nn.L1Loss
功能:
计算输入
X
和目标Y
中的每个元素之间的 平均绝对误差 (MAE)。可选返回同维度的tensor或者是一个标量。
计算公式:
如果reduction == “none”
L ( x , y ) = l 1 , l 2 , ⋅ ⋅ ⋅ , l n T , l n = ∣ x n − y n ∣ L(x, y) = {l_1, l_2, ···, l_n}^T, l_n = |x_n - y_n| L(x,y)=l1,l2,⋅⋅⋅,lnT,ln=∣xn−yn∣
如果reduction != “none”
其中,
input x n x_n xn 和 target y n y_n yn 是任意形状的张量,每个张量都有 n n n 维大小。
n为batch_size。
类初始化参数:
size_average(bool)
- 当reduce=True时有效。
- 为True时,返回的loss为平均值,即 mean(L) 。
- 为False时,返回的各样本的loss之和,即 sum(L) 。
reduce(bool)
- 返回值是否为标量,默认为True
reduction(string)
(Default: ‘mean’)
'none'
:不进行操作'mean'
:输出的总和除以输出元素的数量'sum'
:对输出进行求和- 注意:size_average和reduce正在被弃用的过程中,同时,指定这两个参数中的任何一个都将覆盖reduce。
使用场景:
使用场景:
它是第二个最常用的回归损失函数。
它测量一组预测中误差的平均大小,而不考虑它们的方向。
与MSE损失函数相比,MAE损失函数对异常值具有更强的鲁棒性。
因此,如果 数据有很多异常值,可以考虑使用它 。
使用L1Loss进行 多分类 。
2、MSELoss
torch.nn.MSELoss
功能:
计算输入
X
和目标Y
中的每个元素之间的 平均平方误差 (MSE,L2范数的平方)
可选返回同维度的tensor或者是一个标量。
计算公式:
如果reduction == “none”
L ( x , y ) = l 1 , l 2 , ⋅ ⋅ ⋅ , l n T , l n = ( x n − y n ) 2 L(x, y) = {l_1, l_2, ···, l_n}^T, l_n = (x_n - y_n)^2 L(x,y)=l1,l2,⋅⋅⋅,lnT,ln=(xn−yn)2
如果reduction != “none”
其中,
θ是模型中待训练的参数。
input x n x_n xn 和 target y n y_n yn 是任意形状的张量,每个张量都有 n n n 维大小。
n为batch_size。
类初始化参数:
size_average(bool)
- 当reduce=True时有效。
- 为True时,返回的loss为平均值,即 mean(L) 。
- 为False时,返回的各样本的loss之和,即 sum(L) 。
reduce(bool)
- 返回值是否为标量,默认为True
reduction(string)
(Default: ‘mean’)
'none'
:不进行操作'mean'
:输出的总和除以输出元素的数量'sum'
:对输出进行求和- 注意:size_average和reduce正在被弃用的过程中,同时,指定这两个参数中的任何一个都将覆盖reduce。
使用场景:
- MSE的意义相当明确:如果预测值与真实值的 欧式距离 越大,损失函数越大。欧式距离越小,损失函数越小。同时,求导也是相当容易:
- MSE损失函数通过平方化误差来惩罚模型的误差,这种性质使得MSE代价函数对异常值的鲁棒性降低。因此,如果数据容易出现许多异常值,则不应使用它。
- 注: Sigmoid一般不与MSE配合使用。在深度学习里,Sigmoid函数是常见的激活函数。特别注意的是,当使用Sigmoid做激活函数的时候,损失函数不能选择MSE。
因为Sigmoid的导数为f(x)(1−f(x))。假设当预测值为f(x)=1而真实值为0的时候,此时虽然(yi−y˜)很大,但是f(x)(1−f(x))太小接近0,收敛速度同样很慢。
3、CrossEntropyLoss
torch.nn.CrossEntropyLoss
公式详解的参考链接:
https://www.cnblogs.com/marsggbo/p/10401215.html
https://zhuanlan.zhihu.com/p/98785902
功能:
交叉熵损失
将input
经过softmax激活函数之后,再计算其与target
的交叉熵损失。
该函数将 nn.LogSoftmax() 和 nn.NLLLoss() 的结合
先经过nn.LogSoftmax()
转化为归一化的概率分布,然后再通过nn.NLLLoss()
函数
主要是用来判定实际的输出与期望的输出的接近程度
计算公式:
1、
l o s s ( x , c l a s s ) = − log ( exp ( x [ c l a s s ] ) ∑ j exp ( x [ j ] ) ) = − x [ c l a s s ] + log ( ∑ j exp ( x [ j ] ) ) loss(x, class) = -\log \left (\frac{ \exp( x[class] ) }{ \sum_j \exp( x[j] ) } \right) = -x[class] + \log \left ( \sum_j \exp( x[j] ) \right) loss(x,class)=−log(∑jexp(x[j])exp(x[class]))=−x[class]+log(j∑exp(x[j]))
x
是1维,长为C
的tensor
class
是1个整数
2、如果传入指定的weight
参数,则公式如下所示:
l o s s ( x , c l a s s ) = w e i g h t [ c l a s s ] ( − x [ c l a s s ] + log ( ∑ j ( exp ( x [ j ] ) ) ) ) loss(x, class) = weight[class] \left (-x[class] + \log\left ( \sum_j ( \exp( x[j] ) )\right)\right) loss(x,class)=weight[class](−x[class]+log(j∑(exp(x[j]))))
weight
是1维,长为C
的tensor
如果使用该API,则输入时可选参数
weight
应为一维Tensor,且Tensor中的每个元素代表每个类权重。
被期望的输入是包含每个类的原始、非标准化的分数。
x
(预测输入): [ N , C ] [N, C] [N,C],或者 [ N , C , d 1 , d 2 , ⋅ ⋅ ⋅ , d k ] , k ≥ 1 [N, C,d_1, d_2, ···, d_k], k\geq1 [N,C,d1,d2,⋅⋅⋅,dk],k≥1,计算k
维损失
y
(目标输入): [ N ] [N] [N],或者 [ N , d 1 , d 2 , ⋅ ⋅ ⋅ , d k ] , k ≥ 1 [N, d_1, d_2, ···, d_k], k\geq1 [N,d1,d2,⋅⋅⋅,dk],k≥1,计算k
维损失
output
(输出):score,
3、对每一个小批的观测值计算损失的平均值。如果权重参数被指定,那么这是一个加权平均值:
l o s s = ∑ i = 1 N l o s s ( i , c l a s s [ i ] ) ∑ i = 1 N w e i g h t [ c l a s s [ i ] ] loss = \frac{\sum_{i = 1}^N loss(i, class[i])} { \sum_{i = 1}^N weight[class[i]] } loss=∑i=1Nweight[class[i]]∑i=1Nloss(i,class[i])
- CrossEntropyLoss()对象 形参调用
x
是2维,形为[N, C]
的tensor
class
是1维,形为[N]
的tensor
weight
是1维,形为[C]
的tensor
类初始化参数:
weight(Tensor)
- 为每个类别的loss设置权值,常用于类别不均衡问题。
weight必须是float类型的tensor,其长度要于类别数C
一致,
即每一个类别都要设置有weight。
ignore_index (int)
- 指定一个目标值,忽略某一类别,不计算其loss,其loss会为0。
并且,当 size_average为 True 时,不会计算那一类的loss,
而且,除的时候的分母也不会统计那一类的样本。
即,损失是在非忽略目标上平均的。
size_average(bool)
不推荐使用 (见reduction)
- 当 reduce=True 时有效。
True
:损失是批次中每个损失元素的平均数。
请注意,对于某些损失,每个样本有多个元素。False
:将每个小批量的损失相加。
reduce(bool)
不推荐使用 (见reduction)
- 返回值是否为标量,默认为True
True
: 根据size_average,对每个小批量的观察结果求平均值或求和False
:返回每批元素损失,并忽略size_average
reduction(string)
(Default: ‘mean’)
'none'
:不进行操作'mean'
:采用输出的加权平均值'sum'
:对输出进行求和
使用场景:
在训练
类别数目为:C
时的的分类问题时很有用。
当您的训练集不平衡时,这特别有用。这时候需要使用参数weight(Tensor)
4、NLLLoss
torch.nn.NLLLoss
功能:
负对数似然损失(negative log likelihood loss)
把输入的对数概率向量与Label对应的那个值拿出来,求负数后,再求均值。
计算公式:
1、如果reduction==“None”
,那么
l ( x , y ) = L = { l 1 , l 2 , ⋅ ⋅ ⋅ , l n } T , l n = − w y n x n , y n l(x, y) = L = \{ l_1, l_2, ···, l_n\}^T, l_n = -w_{y_n} x_{n, y_n} l(x,y)=L={
l1,l2,⋅⋅⋅,ln}T,ln=−wynxn,yn
w c = w e i g h t [ c ] ∗ 1 { c ≠ i g n o r e i n d e x } , x n , y n = x