三、损失函数Loss
3.1 L1Loss
torch.nn.L1Loss(size_average=True, reduce=True)
-
计算output和target之差的绝对值,可选返回同维度的tensor或者是一个标量
-
计算公式
loss ( x , y ) = 1 N ∑ i = 1 N ∣ x − y ∣ \operatorname{loss}(\mathbf{x},\mathbf{y})=\dfrac{1}{N}\sum_{i=1}^{N}|\mathbf{x}-\mathbf{y}| loss(x,y)=N1i=1∑N∣x−y∣
-
参数
size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.2 MSELoss
torch.nn.MSELoss(size_average=None, reduce=None)
-
计算output和target之差的平方,可选返回同维度的tensor或者是一个标量
-
计算公式
loss ( x , y ) = 1 N ∑ i = 1 N ∣ x − y ∣ 2 \operatorname{loss}(\mathbf x,\mathbf y)=\dfrac1N\sum_{i=1}^N\left|\mathbf x-\mathbf y\right|^2 loss(x,y)=N1i=1∑N∣x−y∣2
-
参数
size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.3 CrossEntropyLoss
torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=None, reduce=None, reduction='elementwise_mean')
-
将输入经过softmax激活函数之后,再计算其与target的交叉熵损失。即该方法将
nn.LogSoftmax()
和nn.NLLLoss()
进行了结合。严格意义上的交叉熵损失函数应该是nn.NLLLoss()
-
计算公式
loss ( 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 ] ) ) \operatorname{loss}(x,class)=-\log\left(\dfrac{\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]))
-
参数
weight(Tensor)
:为每个类别的loss设置权值,常用于类别不均衡问题,weight必须是float类型的tensorsize_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为Trueignore_index(int)
:忽略某一类别,不计算其loss,其loss为0,并且,在采用size_average时,不会计算那一类的 loss,除的时候的分母也不会统计那一类的样本。
-
3.4 NLLLoss
torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=None, reduce=None, reduction='elementwise_mean')
-
计算公式
loss ( x , l a b e l ) = − x l a b e l \operatorname{loss}(\mathbf{x},\mathrm{label})=-\mathbf{x}_{\mathrm{label}} loss(x,label)=−xlabel
-
参数
weight(Tensor)
:为每个类别的loss设置权值,常用于类别不均衡问题,weight必须是float类型的tensorsize_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为Trueignore_index(int)
:忽略某一类别,不计算其loss,其loss为0,并且,在采用size_average时,不会计算那一类的 loss,除的时候的分母也不会统计那一类的样本。
-
3.5 PoissonNLLLoss
torch.nn.PoissonNLLLoss(log_input=True, full=False, size_average=None, eps=1e-8, reduce=None, reduction='elementwise_mean')
-
用于target服从泊松公布的分类任务
-
计算公式
t a r g e t ∼ P o s s i o n ( i n p u t ) l o s s ( i n p u t , t a r g e t ) = i n p u t − t a r g e t ∗ l n ( i n p u t ) + l n ( t a r g e t ! ) target\sim Possion(input)\\ loss(input,target) = input - target*ln(input)+ln(target!) target∼Possion(input)loss(input,target)=input−target∗ln(input)+ln(target!)
-
参数
log_input(bool)
:为True时候,计算公式为: l o s s ( i n p u t , t a r g e t ) = e x p ( i n p u t ) − t a r g e t ∗ i n p u t loss(input, target)=exp(input)-target*input loss(input,target)=exp(input)−target∗input,为False时, l o s s ( i n p u t , t a r g e t ) = i n p u t − t a r g e t ∗ l o g ( i n p u t + e p s ) loss(input,target)=input-target*log(input+eps) loss(input,target)=input−target∗log(input+eps)full(bool)
:是否计算全部的loseps(float)
:当log_input=False时,用来防止计算log(0),而增加的一个修正项size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.6 KLDivLose
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='elementwise_mean')
- 计算input和target之间的KL散度
- 参数
size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值,平均值为element-wise的,而不是针对样本的平均;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
3.7 BCELoss
torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduce=None, reduction='elementwise_mean')
-
二分类任务时的交叉熵计算函数。在自编码器中常用
-
计算公式
ℓ ( x , y ) = L = { l 1 , … , l N } ⊤ , l n = − w n [ y n ⋅ log x n + ( 1 − y n ) ⋅ log ( 1 − x n ) ] \ell(x,y)=L=\{l_1,\dots,l_N\}^\top,l_n=-w_n\left[y_n\cdot\log x_n+(1-y_n)\cdot\log(1-x_n)\right] ℓ(x,y)=L={l1,…,lN}⊤,ln=−wn[yn⋅logxn+(1−yn)⋅log(1−xn)]
-
参数
weight(Tensor)
:为每个类别的loss设置权值,常用于类别不均衡问题,weight必须是float类型的tensorsize_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.8 BCEWithLogitsLoss
torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='elementwise_mean', pos_weight=None)
-
将Sigmoid和BCELoss结合,input经过Sigmoid激活函数后,将变成概率分布的形式
-
计算公式
ℓ ( x , y ) = L = { l 1 , … , l N } T , l n = − w n [ t n ⋅ log σ ( x n ) + ( 1 − t n ) ⋅ log ( 1 − σ ( x n ) ) ] σ ( ) 表示 S i g m o i d 函数 \ell(x,y)=L=\{l_1,\ldots,l_N\}^{\text{T}},\quad l_n=-w_n\left[t_n\cdot\log\sigma(x_n)+(1-t_n)\cdot\log(1-\sigma(x_n))\right]\\ \sigma()表示Sigmoid函数 ℓ(x,y)=L={l1,…,lN}T,ln=−wn[tn⋅logσ(xn)+(1−tn)⋅log(1−σ(xn))]σ()表示Sigmoid函数
-
参数
weight(Tensor)
:为batch中单个样本设置权值pos_weight
:正样本的权重,当 p > 1 p>1 p>1,提高召回率,当 p < 1 p<1 p<1,提高精确度,可达到权衡召回率和精确度的作用,必须为一个与类别数等长的向量size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.9 MarginRankingLoss
torch.nn.MarginRankingLoss(margin=0, size_average=None, reduce=None, reduction='elementwise_mean')
-
计算两个向量之间的相似度,当两个向量之间的距离大于margin,则loss为正,小于margin,loss为0
-
计算公式
l o s s ( x , y ) = m a x ( 0 , − y ∗ ( x 1 − x 2 ) + m a r g i n ) loss(x,y)=max(0,-y*(x_1-x_2)+margin) loss(x,y)=max(0,−y∗(x1−x2)+margin)
-
参数
maegin(float)
: x 1 x_1 x1和 x 2 x_2 x2之间的差异size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.10 HingeEmbeddingLoss
torch.nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None, reduction='elementwise_mean')
-
为折页损失的拓展,主要用于衡量两个输入是否相似
-
计算公式
l n = { x n , if y n = 1 , max { 0 , Δ − x n } , if y n = − 1 , l_n=\left\{\begin{array}{ll}x_n,&\textrm{if}y_n=1,\\ \max\{0,\Delta-x_n\},&\textrm{if}{y_n=-1},\end{array}\right. ln={xn,max{0,Δ−xn},ifyn=1,ifyn=−1,
-
参数
maegin(float)
:默认为1,容忍的差距size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.11 MultiLabelMarginLoss
torch.nn.MultiLabelMarginLoss(size_average=None, reduce=None, reduction='elementwise_mean')
- 用于一个样本属于多个类别时的分类任务
3.12 SmoothL1Loss
torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction='elementwise_mean')
-
计算平滑L1损失
-
计算公式
l o s s ( x , y ) = 1 n ∑ i z i where z i is given by: z i = { 0.5 ( x i − y i ) 2 , if ∣ x i − y i ∣ < 1 ∣ x i − y j ∣ − 0.5 , otherwise \quad loss(x,y)=\dfrac{1}{n}\sum_i z_i\\\text{where }z_i\text{ is given}\text{ by:}\\ \quad z_i=\left\{\begin{array}{ll}0.5(x_i-y_i)^2,&\text{if }|x_i-y_i|<1\\ |x_i-y_j|-0.5,&\text{otherwise}\end{array}\right. loss(x,y)=n1i∑ziwhere zi is given by:zi={0.5(xi−yi)2,∣xi−yj∣−0.5,if ∣xi−yi∣<1otherwise
-
参数
size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.13 SoftMarginLoss
torch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction='elementwise_mean')
- 参数
size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
- 参数
3.14 MultiLabelSoftMarginLoss
torch.nn.MultiLabelSoftMarginLoss(weight=None, size_average=None, reduce=None, reduction='elementwise_mean')
- SoftMarginLoss的多标签版本
- 参数
weight(Tensor)
:为每个类别的loss设置权值,常用于类别不均衡问题,weight必须是float类型的tensorsize_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
3.15 CosineEmbeddingLoss
torch.nn.CosineEmbeddingLoss(margin=0, size_average=None, reduce=None, reduction='elementwise_mean')
-
用cosine函数来衡量两个输入是否相似
-
计算公式
loss ( x , y ) = { 1 − cos ( x 1 , x 2 ) , if y = = 1 max ( 0 , cos ( x 1 , x 2 ) − margin ) , if y = = − 1 \operatorname{loss}(x,y)=\left\{\begin{array}{ll}1-\cos(x_1,x_2),&\text{if }y==1\\ \operatorname*{max}(0,\cos(x_{1},x_2)-\operatorname{margin}),&\textrm{if }y==-1\end{array}\right. loss(x,y)={1−cos(x1,x2),max(0,cos(x1,x2)−margin),if y==1if y==−1
-
参数
margin(float)
:取值范围 [ − 1 , 1 ] [-1,1] [−1,1],推荐设置范围 [ 0 , 0.5 ] [0,0.5] [0,0.5]size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-
3.16 MultiMarginLoss
torch.nn.MultiMarginLoss(p=1, margin=1, weight=None, size_average=None, reduce=None, reduction='elementwise_mean')
- 计算多分类的折页损失
3.17 TripletMarginLoss
torch.nn.TripletMarginLoss(margin=1.0, p=2, eps=1e06, swap=False, size_average=None, reduce=None, eduction='elementwise_mean')
-
计算三元组损失,人脸验证中常用
-
计算公式
L ( a , p , n ) = max { d ( a i , p i ) − d ( a i , n i ) + m a r g i n , 0 } where d ( x i , y i ) = ∥ x i − y i ∥ D . L(a,p,n)=\max\{d(a_i,p_i)-d(a_i,n_i)+margin,0\}\\ \text{where }d(x_i,y_i)=\|\mathbf{x}_i-\mathbf{y}_i\|_D. L(a,p,n)=max{d(ai,pi)−d(ai,ni)+margin,0}where d(xi,yi)=∥xi−yi∥D.
-
参数
margin(float)
:默认值为 1p(int)
:The norm degree ,默认值为 2size_average(bool)
:当reduce=True有效时,为True,返回的loss为平均值;为False,返回的各样本的loss之和reduce(bool)
:返回值是否为标量,默认为True
-