损失函数-pytorch

损失函数的作用: 主要用于深度学习中predict与True label “距离”度量或者“相似度度量”,并通过反向传播求梯度,进而通过梯度下降算法更新网络参数,周而复始,通过损失值和评估值反映模型的好坏。

损失函数的种类:主要分为分类损失函数和回归损失函数。

分类损失函数

KLDiv Loss 、NLL Loss、CrossEntropy Loss、BCE Loss、BCE With Logits Loss、Margin Ranking LossHinge Embedding LossHuber Loss

回归损失函数

L1 Loss(MAE)、L2 Loss(MSE)、Smooth L1 Loss

IOU Loss、GIOU Loss、DIOU、CIOU Loss

补充知识:

  • 分类损失函数:

(2.1) NLL Loss(Negative Log Likelihood Loss, 负对数似然函数)

作用:对预测正确但是预测概率不高的情况进行惩罚(这种情况的损失值更大)。

公式:

常用于多分类(设为C类)问题,且可以对每个分类提供相应的权重,这对于非平衡数据集的处理非常有用

计算过程:

  1. Batch_size=N,x是全连接层的输出,是个N*c的向量;
  2. 先对输入x计算softmax,此时,softmax(x)的取值范围是0-1;
  3. 再求对数-log,此时-log(softmax(x))的取值范围是(0, +∞ ); softmax(x)越小,-log(softmax(x))则越大;
  4. 通过labels将(N*C)中的N个样本对应的正确类别的预测得分取出来,组成(N,1)的向量,最后求和取均值。 yi表示第i个样本的标签。

  代码:

torch.nn.NLLLoss(weight=None,size_average=None,ignore_index=-100,reduce=None,
reduction='mean') #weight:用于数据集类别不均衡问题。

import torch
from torch import nn
m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward                

Cross Entropy Loss=NLL Loss+softmax层,

Cross Entropy Loss含有F.softmax(input, dim=1)

(2.1)Cross Entropy Loss-交叉熵损失

公式:

    

softmax(y)指的就是预测标签的概率。\hat{y}是真实类别标签的one-hot的形式.

常用于多分类(设为C类)问题,且可以对每个分类提供相应的权重,这对于非平衡数据集的处理非常有用。

计算过程:

  1. y是神经网络全连接层的输出shape=(N, C);
  2. 对y经过sigmoid或softmax处理输出概率值,shape=(N, C);
  3. 将预测的概率值(shape=(N,C))与\hat{y}真实类别标签的one-hot的形式(shape=(N,C))进行交叉熵计算。

 代码:  

nn.CrossEntropyLoss (input, target, weight)

#参数:input.shape=(N, C),target.shape为(N)或者概率形式的target(N,C)。

loss = F.cross_entropy(input, target)
print(loss)  # tensor(0.7099)
weight = torch.tensor([1.0, 9.0])
loss = F.cross_entropy(input, target, weight)
print(loss)  # tensor(0.7531)

weight的工作方法:

(1)当我们在计算损失前,当遇到真实标签是0的样本时,我们就乘上我们为它附上的权重,也就是1;当我们遇到真实标签是1的样本时,我们就乘上给该类样本附的权重,也就是9。

(2)在对所用样本计算完损失后,再求平均,也就是loss/(1*8+9*1):这个含义是input数据中标签为0样本的个数是8,权重是1,即1个类别为0的样本我们仍然将其视为1个;标签为1的样本的个数是1,权重是9,即1个类别为1的样本我们将其视为9个;这样总的样本数就是1*8+9*1=17个,在对loss求平均,也就是最终的损失0.7531.

(2.3) BCE Loss-二分类交叉熵损失,Binary Cross Entropy Loss

可用于二分类、多标签分类,即判断每一个标签是否是前景、背景。

公式:

 y为预测当前标签的概率值。使用BCE前,需要通过sigmoid将score转换为预测的概率。

代码:nn.BCELoss(input, target), input和target的shape一致。

# 1. 在放入BCE Loss前需要对输入使用sigmoid转换为概率,
m = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
output = loss(m(input), target)
output.backward()

(2.4)BCE With Logits Loss

可用于多标签分类,即判断每一个标签是否是前景、背景。

BCEWithLogitsLoss损失函数把 Sigmoid 层集成到了 BCELoss 类中。

代码:nn.BC EWithLogitsLoss(input, target)

参数:input和target的shape一致。

loss = nn.BCEWithLogitsLoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
output = loss(input, target)
output.backward()(2.5)Focal Loss

检测中one-stage detector的准确率不如two-stage detector的原因:

正负样本不平衡。样本中会存在大量的easy examples,且都是负样本(属于背景的样本)。easy negative examples会对loss起主要贡献作用,会主导梯度的更新方向。  这样,网络学不到有用的信息,无法对object进行准确分类。而two stage首先利用RPN产生region proposal,这一步会删了很多easy examples。

公式:   

     pt是样本识别成正确类别的概率,at是类别的损失权重。(1-pt)属于[0,1]。

. (1-pt)^r用来解决难易样本问题

    添加(1-pt)^r的 目的:是通过减少易分类样本的权重,从而使得模型在训练时更专注于难分类的样本。(1-pt)^r对易分类样本的损失缩减程度大,对难分类样本的损失缩减程度小。

容易样本的pt一般会比较高,则(1-pt)会小,(1-pt)^r会使-llog(pt)缩小的程度大,

       如:r=2,pt=0.9,(1-pt)=0.1, (1-pt)^r=0.01,损失是原来的0.01倍

难分样本的pt一般会比较小,则(1-pt)会高,(1-pt)^r会使-llog(pt)缩小的程度小,

      如:r=2,pt=0.1,(1-pt)=0.9, (1-pt)^r=0.81,损失是原来的0.81倍

 at用来解决正负样本不均衡问题

    既然one-stage detector在训练的时候正负样本的数量差距很大,那么一种常见的做法就是给正负样本加上权重,负样本出现的频次多,那么就降低负样本的权重,正样本数量少,就相对提高正样本的权重。因此可以通过设定a的值来控制正负样本对总的loss的共享权重。a取比较小的值来降低负样本(多的那类样本)的权重。

(2.6)arcface loss

(2.7)magface loss

3.回归损失函数

(3.1) L1Loss-L1范数损失

  它是把目标值yi与模型输出(估计值)f(xi) 做绝对值得到的误差

  代码:torch.nn.L1Loss(reduction='mean')

  参数:reduction有三个值可选:none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

(3.2) MSELoss-均方误差损失

  它是把目标值yi与模型输出(估计值)f(xi)做差然后平方得到的误差公式:

 torch.nn.MSELoss(reduction='mean')

参数:reduction有三个值可选:none: 不使用约简;mean:返回loss和的平均值;sum:返回loss的和。默认:mean。

(3.3) SmoothL1Loss

简单来说就是平滑版的L1 Loss。

公式:

 torch.nn.SmoothL1Loss(reduction='mean')

SooothL1Loss其实是L2Loss和L1Loss的结合,它同时拥有L2 Loss和L1 Loss的部分优点:
(1)当预测值和ground truth差别较小的时候(绝对值差小于1),使用的是L2 Loss,梯度不至于太大。(损失函数相较L1 Loss比较圆滑)
(2)当差别大的时候,使用的是L1 Loss,梯度值足够小(较稳定,不容易梯度爆炸)。

(6) MarginRankingLoss

torch.nn.MarginRankingLoss(margin=0.0, reduction='mean') 对于 mini-batch(小批量) 中每个实例的损失函数如下:

 参数:margin:默认值0

(7)  HingeEmbeddingLoss

torch.nn.HingeEmbeddingLoss(margin=1.0,  reduction='mean') 对于 mini-batch(小批量) 中每个实例的损失函数如下:

参数:margin:默认值1

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: BERT-NER-PyTorch是一个基于PyTorch深度学习框架的BERT命名实体识别(NER)模型。BERT是一种在大规模未标记文本上训练的预训练模型,它可以用于各种自然语言处理任务。 BERT-NER-PyTorch利用已经使用大量标记数据进行预训练的BERT模型的表示能力,进行命名实体识别任务。命名实体识别是指从文本中识别特定实体,如人名、地名、组织、日期等。通过使用BERT-NER-PyTorch,我们可以利用预训练的BERT模型来提高命名实体识别的性能。 BERT-NER-PyTorch的实现基于PyTorch深度学习框架,PyTorch是一个用于构建神经网络的开源框架,具有易于使用、动态计算图和高度灵活的特点。通过在PyTorch环境下使用BERT-NER-PyTorch,我们可以灵活地进行模型训练、调整和部署。 使用BERT-NER-PyTorch,我们可以通过以下步骤进行命名实体识别: 1. 预处理:将文本数据转换为适合BERT模型输入的格式,例如分词、添加特殊标记等。 2. 模型构建:使用BERT-NER-PyTorch构建NER模型,该模型包括BERT预训练模型和适当的输出层。 3. 模型训练:使用标记的命名实体识别数据对NER模型进行训练,通过最小化损失函数来优化模型参数。 4. 模型评估:使用验证集或测试集评估训练得到的NER模型的性能,例如计算准确率、召回率和F1分数等指标。 5. 模型应用:使用训练好的NER模型对新的文本数据进行命名实体识别,识别出关键实体并提供相应的标签。 总之,BERT-NER-PyTorch是一个基于PyTorch的BERT命名实体识别模型,通过利用预训练的BERT模型的表示能力,在命名实体识别任务中提供了灵活、高效和准确的解决方案。 ### 回答2: bert-ner-pytorch是一个基于PyTorch框架的BERT命名实体识别模型。BERT是一种基于Transformer架构的预训练模型,在自然语言处理任务中取得了很好的效果。NER代表命名实体识别,是一项重要的自然语言处理任务,旨在从文本中识别和标注出特定类型的命名实体,如人名、地点、组织等。 bert-ner-pytorch利用预训练的BERT模型作为输入,结合神经网络模型进行命名实体识别。它通过将输入文本转化为BERT模型能够接受的格式,并在其上进行微调训练来提高NER的性能。具体来说,该模型首先使用BERT模型对文本进行编码,将文本中的每个单词转化为其对应的向量表示。然后,这些向量通过一层或多层的神经网络模型,以预测每个单词是否属于某个命名实体类别。 利用bert-ner-pytorch模型,我们可以将其应用于各种实际场景中,如信息抽取、问题回答、智能问答系统等。通过对输入文本进行命名实体识别,我们可以更好地理解文本中所包含的实体信息,从而为后续的处理与分析提供更多的潜在价值。 需要注意的是,bert-ner-pytorch模型是一个基础的NER模型,它需要根据具体的任务和数据进行进一步的训练和优化。同时,BERT模型本身也有一些限制,如较高的计算资源要求和模型大小。因此,在实际使用时,我们可能需要结合具体需求,对模型进行调整和优化,以适应不同的场景和数据。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值