深入理解二分类和多分类CrossEntropy Loss和Focal Loss

简介: 多分类交叉熵就是对二分类交叉熵的扩展,在计算公式中和二分类稍微有些许区别,但是还是比较容易理解

深入理解二分类和多分类CrossEntropy Loss和Focal Loss


二分类交叉熵


在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为p和 1−p,此时表达式为( 的log ⁡底数是e):


image.png


其中:


  • y i  —— 表示样本i的label,正类为1 ,负类为0
  • p i  —— 表示样本i 预测为正类的概率


由于二分类交叉熵很容易理解,在此就不做举例了。


多分类交叉熵


多分类交叉熵就是对二分类交叉熵的扩展,在计算公式中和二分类稍微有些许区别,但是还是比较容易理解,具体公式如下所示:


image.png


其中:


  • M——类别的数量
  • y i c ——符号函数(0或1 ),如果样本i 的真实类别等于c 取 1,否则取 0
  • p i c ——观测样本i ii属于类别c cc的预测概率


举例说明


预测(已经经过softmax归一化) 真实
0.1 0.2 0.7 0 0 1
0.3 0.4 0.3 0 1 0
0.1 0.2 0.7 1 0 0


现在我们利用这个表达式计算上面例子中的损失函数值:


image.png


其实可以看到,多分类交叉熵只计算正确标签对应概率的损失值,相对错误标签其y i c = 0 ,所以导致错误标签对应的损失值为0。


Pytorch的CrossEntropyLoss分析


参数设定


CrossEntropyLoss在Pytorch官网中,我们可以看到整个文档已经对该函数CrossEntropyLoss进行了较充分的解释。所以我们简要介绍其参数和传入的值的格式,特别是针对多分类的情况。


c7fa99e78be54762b5bf1b474bd98891.png


常见的传入参数如下所示:


  • weight:传入的是一个list或者tensor,其检索对应位置的值为该类的权重。注意,如果是GPU的环境下,则传入的值必须是tensor,并且其应该在GPU中。


  • reduction:传入的是一个字符串,有三种形式可以选择,分别是mean/sum/none,默认是mean。mean和sum如字面意思所示,代表损失值取平均,损失值求和的形式。none是计算每个位置对应的损失值,返回和label对应的形状。


更多参数解释如下图所示:


6a8cd63961694fc0a041640f90b027ce.png


使用方法


CrossEntropyLoss传入的值为两个,分别是input和target。输出只有一个Output。


  • input的形状为( N , C ) / ( N , C , d 1 , d 1 , … ) ,前者对应二维情况,后者对应高维情况,值得注意的是C是在dim=1的位置上,可能在高维的情况下很多人都以为默认应该是最后一个维度dim=-1。


  • target的形状为( N ) / ( N, d 1 , d 1 , … ) ,前者对应二维情况,后者对应高维情况。注意的是target的值对应的是类别对应的索引,不是one-hot的形式。


  • Output的形状和target的形状一致。


更多参数解释如下图所示:


9d7ec8d1228f4bb49cf67247b06fb6e5.png


二维情况下对应的5分类交叉熵损失计算(官网示例):


>>> # Example of target with class indices
>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()
>>>
>>> # Example of target with class probabilities
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.randn(3, 5).softmax(dim=1)
>>> output = loss(input, target)
>>> output.backward()


高维情况下对应的交叉熵计算:


input = torch.randn(2,3,5,5,4)#最后一个维度对应的是类别
target = torch.empty(2,3,5,5, dtype=torch.long).random_(4) #四分类
loss_fn=CrossEntropyLoss(reduction='sum')
_input=torch.permute(input,dims=(0,-1,1,2,3))
loss=loss_fn(_input,target)#输入的类别一定是在dim=1的位置上
print(loss)
# 当然也可以将输入先转为2维的形式在计算,结果是一样的
_input=input.view(-1,4)
_target=target.view(-1)
loss=loss_fn(_input,_target)
print(loss)


内在原理


Pytorch中的CrossEntropyLoss()是将logSoftmax()和NLLLoss()函数进行合并的,也就是说其内在实现就是基于logSoftmax()和NLLLoss()这两个函数。


input=torch.rand(3,5)
target=torch.empty(3,dtype=torch.long).random_(5)
loss_fn=CrossEntropyLoss(reduction='sum')
loss=loss_fn(input,target)
print(loss)
_input=torch.nn.LogSoftmax(dim=1)(input)
loss=torch.nn.NLLLoss(reduction='sum')(_input,target)
print(loss)


其实也就是和官网上所说的一样,CrossEntropyLoss()是对输出计算softmax(),在对结果取log()对数,最后使用NLLLoss()得到对应位置的索引值。


Focal Loss原理和实现


Focal Loss来自于论文Focal Loss for Dense Object Detection,用于解决类别样本不平衡以及困难样本挖掘的问题,其公式非常简洁:


image.png


前面的 α t 是类别权重系数。如果你有一个类别不平衡的数据集,那么你肯定想对数量少的那一类在loss贡献上赋予一个高权重,这个 α t就起到这样的作用。因此, α t应该是一个向量,向量的长度等于类别的个数,用于存放各个类别的权重。一般来说α t中的值为每一个类别样本数量的倒数,相当于平衡样本的数量差距。


这里提供一个二维/高维的Focal Loss的实现:


class FocalLoss(nn.Module):
    def __init__(self, gamma=2, alpha=torch.tensor([0.2, 0.3, 0.5,1])):
        super(FocalLoss, self).__init__()
        self.gamma = gamma
        self.alpha = alpha
    def forward(self, input, target):
        logpt = nn.functional.log_softmax(input, dim=1) #计算softmax后在计算log
        pt = torch.exp(logpt) #对log_softmax去exp,把log取消就是概率
        alpha=self.alpha[target].unsqueeze(dim=1) # 去取真实索引类别对应的alpha
        logpt = alpha*(1 - pt) ** self.gamma * logpt #focal loss计算公式
        loss = nn.functional.nll_loss(logpt, target,reduction='sum') # 最后选择对应位置的元素
        return loss


参考资料


CrossEntropy官网详细说明。


Pytorch中的CrossEntropyLoss()函数案例解读和结合one-hot编码计算Loss


详解PyTorch实现多分类Focal Loss——带有alpha简洁实现


最近工作

目录
相关文章
|
7月前
|
计算机视觉
如何理解focal loss/GIOU(yolo改进损失函数)
如何理解focal loss/GIOU(yolo改进损失函数)
|
7月前
|
机器学习/深度学习 监控 数据可视化
训练损失图(Training Loss Plot)
训练损失图(Training Loss Plot)是一种在机器学习和深度学习过程中用来监控模型训练进度的可视化工具。损失函数是衡量模型预测结果与实际结果之间差距的指标,训练损失图展示了模型在训练过程中,损失值随着训练迭代次数的变化情况。通过观察损失值的变化,我们可以评估模型的拟合效果,调整超参数,以及确定合适的训练停止条件。
1286 5
|
Python 机器学习/深度学习
Cross Entropy Loss 交叉熵损失函数公式推导
表达式 输出标签表示为{0,1}时,损失函数表达式为: $L = -[y log \hat{y} + (1-y)log(1- \hat{y})]$ 二分类 二分类问题,假设 y∈{0,1} 正例:$P(y = 1| x) = \hat{y}$ 反例:$P(y=0|x) = 1-\hat{y}$ 取似然函数 似然函数就是所有样本在参数θ下发生概率最大的那种情况,由于样本独立同分布,因此概率最大的情况就是每个样本发生概率的连乘。
15938 0
|
7月前
|
机器学习/深度学习
损失函数大全Cross Entropy Loss/Weighted Loss/Focal Loss/Dice Soft Loss/Soft IoU Loss
损失函数大全Cross Entropy Loss/Weighted Loss/Focal Loss/Dice Soft Loss/Soft IoU Loss
187 2
|
7月前
Ridge,Lasso,Elasticnet回归
这篇文章探讨了多元线性回归与正则化的结合,包括Ridge、Lasso和Elasticnet回归。Ridge回归通过添加L2惩罚项提高模型鲁棒性,但可能牺牲一些准确性。Lasso回归引入L1范数,对异常值更敏感,能进行特征选择。Elasticnet结合L1和L2范数,允许在正则化中平衡两者。通过调整α和l1_ratio参数,可以控制整体正则化强度和正则化类型的比例。
71 0
|
机器学习/深度学习 算法 PyTorch
Softmax回归(Softmax Regression)
Softmax回归(Softmax Regression),也称为多类别逻辑回归或多项式回归,是一种用于解决多类别分类问题的统计学习方法。它是逻辑回归在多类别情况下的扩展。
273 3
|
机器学习/深度学习 数据挖掘 PyTorch
Softmax Classifier 多分类问题
Softmax Classifier 多分类问题
107 0
Focal Loss升级 | E-Focal Loss让Focal Loss动态化,类别极端不平衡也可以轻松解决(二)
Focal Loss升级 | E-Focal Loss让Focal Loss动态化,类别极端不平衡也可以轻松解决(二)
212 0
【学习】loss图和accuracy
【学习】loss图和accuracy
410 0
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch实现基本的logistic和softmax回归实验(手动+torch)
pytorch实现基本的logistic和softmax回归实验(手动+torch)
324 0

热门文章

最新文章