(三)pytorch中损失函数

损失函数可以分为三类:回归损失函数、分类损失函数和排序损失函数

1、L1 loss

计算实际值和预测值之间的绝对值之和的平均值。

Loss(pred,y)=\left | y-pred \right |

y表示标签,pred表示预测值。(回归问题),当目标变量的分布具有异常值时,即与平均值相差很大的值,它被认为对异常值具有很好的鲁棒性。

import torch
def lossTest():
    input=torch.randn(3,5,requires_grad=True)
    target=torch.randn(3,5)
    mae_loss=torch.nn.L1Loss()
    output=mae_loss(input,target)
    output.backward()
    print(input.grad)    #grad

if __name__=="__main__":
    lossTest()

2、L2 loss

计算实际值和预测值之间的平方差的平均值。

Loss(pred,y)=\sum (y-pred)^{2}

使用平方意味着当预测值离目标值更远时在平方后具有更大的惩罚,预测值离目标值更近时在平方后惩罚更小,因此,当异常值与样本平均值相差格外大时,模型会因此惩罚更大而开始偏离,相比之下,L1对异常值的鲁棒性更好。

import torch
def lossTest():
    input=torch.randn(3,5,requires_grad=True)
    target=torch.randn(3,5)
    mae_loss=torch.nn.MSELoss()
    output=mae_loss(input,target)
    output.backward()
    print(input.grad)    #grad

if __name__=="__main__":
    lossTest()

3、Negative log likelihood (NLL)

表达式为: loss(pred,y)=-(log pred)

注:NLL要求网络最后一层使用softmax作为激活函数。通过softmax将输出值映射为每个类别的概率值。根据表达式,它的特性是惩罚预测准确率而预测概率不高的情况。

NLL 使用负号,因为概率(或似然)在 0 和 1 之间变化,并且此范围内的值的对数为负。最后,损失值变为正值。

在 NLL 中,最小化损失函数有助于获得更好的输出。从近似最大似然估计 (MLE) 中检索负对数似然。这意味着尝试最大化模型的对数似然,从而最小化 NLL。

4、Cross-Entropy

此损失函数计算提供的一组出现次数或随机变量的两个概率分布之间的差异。它用于计算预测值和实际值之间的平均差异的分数。

loss(pred,y)=-\sum ylog pred

特性:负对数似然损失不对预测置信度惩罚,与之不同的是,交叉熵惩罚不正确但可信的预测,以及正确但不太可信的预测。

import torch
def lossTest():
    input=torch.randn(3,5,requires_grad=True)
    target=torch.randn(3,5)
    cross_entropy_loss=torch.nn.CrossEntropyLoss()
    output=cross_entropy_loss(input,target)
    output.backward()
    print(input.grad)    #grad

if __name__=="__main__":
    lossTest()

5、Hinge Embedding

表达式: loss(pred,y)=max(0,1-y*pred)

其中y为1或-1。

应用场景:分类问题,特别是在确定两个输入是否不同或相似时。学习非线性嵌入或半监督学习任务。

import torch
def lossTest():
    input=torch.randn(3,5,requires_grad=True)
    target=torch.randn(3,5)
    hinge_loss=torch.nn.HingeEmbeddingLoss()
    output=hinge_loss(input,target)
    output.backward()
    print(input.grad)    #grad

if __name__=="__main__":
    lossTest()

6、Margin Ranking Loss

计算一个标准来预测输入之间的相对距离。这与其他损失函数(如MSE或交叉商)不同,后者学习直接从给定的输入集进行预测。

loss(pred,y)=max(0,-y*(pred1-pred2)+margin)

标签张量y(包含1或-1)。当y==1时,第一个输入将被假定为更大的值。它将排名高于第二个输入。如果y==-1,则第二个输入将排名更高。

import torch
def lossTest():
    input_one=torch.randn(3,requires_grad=True)
    input_two=torch.randn(3,requires_grad=True)
    target=torch.rand(3).sign()
    ranking_loss=torch.nn.MarginRankingLoss()
    output=ranking_loss(input_one,input_two,target)
    output.backward()
    print(input_one.grad)    #grad

if __name__=="__main__":
    lossTest()

7、Triplet Margin Loss

计算三元组的损失

Loss(a,p,n)=max\left \{0,d(ai,pi)-d(ai,ni)+margin \right \}

三元组由a(anchor),p(正样本)和n(负样本)组成。确定样本之间的相对相似性,用于基于内容的检索问题。

import torch
def lossTest():
    anchor=torch.randn(100,128,requires_grad=True)
    positive=torch.randn(100,128,requires_grad=True)
    negative=torch.randn(100,128,requires_grad=True)
    triplet_margin_loss=torch.nn.TripletMarginLoss(margin=1.0,p=2)
    output=triplet_margin_loss(anchor,positive,negative)
    output.backward()

if __name__=="__main__":
    lossTest()

8、KL Divergence Loss

计算两个概率分布之间的差异。

loss(pred,y)=y*(log y -pred)

输出表示两个概率分布的接近程度。如果预测的概率分布与真实的概率分布相差很远,就会导致很大的损失。如果 KL Divergence 的值为零,则表示概率分布相同。

KL Divergence 与交叉熵损失的关键区别在于它们如何处理预测概率和实际概率。交叉熵根据预测的置信度惩罚模型,而 KL Divergence 则没有。KL Divergence 仅评估概率分布预测与ground truth分布的不同之处。

应用场景:逼近复杂函数多类分类任务确保预测的分布与训练数据的分布相似

import torch
def lossTest():
    input=torch.randn(2,3,requires_grad=True)
    target=torch.randn(2,3)

    kl_loss=torch.nn.KLDivLoss(reduction = 'batchmean')
    output=kl_loss(input,target)
    output.backward()

if __name__=="__main__":
    lossTest()

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值