二分类、多分类、多标签、softmax、sigmoid、pytorch实现
参考:多标签分类与BCEloss - 简书 (jianshu.com)
25、二分类、多分类与多标签问题的区别 - Andy_George - 博客园 (cnblogs.com)
(7条消息) Sigmoid函数_saltriver的专栏-CSDN博客_sigmoid
BCELoss — PyTorch 1.7.0 documentation
CrossEntropyLoss — PyTorch 1.7.0 documentation
Pytorch里的CrossEntropyLoss详解 - marsggbo - 博客园 (cnblogs.com)
概念
二分类
表示分类任务中有两个类别,每个样本都被设置了一个且仅有一个标签 0 或者 1。例如,目标是识别出一幅图片是不是猫。训练一个分类器,输入一幅图片,用特征向量x表示输入,输出y=0或1,y=0表示是猫,y=1表示不是猫。
多分类
表示分类任务中有多个类别, 每个样本都被设置了一个且仅有一个标签。比如对一堆水果图片分类, 它们可能是橘子、苹果、梨等。 一个水果图像的标签可以是苹果或者梨, 但是同时不可能是两者。
多标签
每个样本都有一系列的目标标签。例如如下图,用做多标签时,该图的标签有云、树、房子、草地等。这些标签互相不排斥。
简单总结
sigmoid\softmax
sigmoid
Sigmoid函数由下列公式定义
图像:当x=0时S(x)=0.5
特点:
- sigmoid函数连续,光滑,严格单调,以(0,0.5)中心对称,是一个非常良好的阈值函数。
- 当x趋近负无穷时,y趋近于0;趋近于正无穷时,y趋近于1;x=0时,y=0.5。在x超出[-6,6]的范围后,函数值基本上没有变化,值非常接近,在应用中一般不考虑。
- Sigmoid函数的值域范围限制在(0,1)之间,[0,1]与概率值的范围是相对应的,因此sigmoid函数就能与一个概率分布联系起来了。
- Sigmoid函数的导数是其本身的函数,即f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f(x)),计算非常方便,也非常节省计算时间。推导过程如下:
- 根据常用的求导公式,得到:f′(x)=(−1)(1+e−x)−2(0+(−1)e−x)=e−x(1+e−x)2=e−x1+e−x11+e−xf′(x)=(−1)(1+e−x)−2(0+(−1)e−x)=e−x(1+e−x)2=e−x1+e−x11+e−x
- 二分类问题,都假定是服从伯努利分布。伯努利分布变形推导后为sigmoid函数,推导见参考文章[(7条消息) Sigmoid函数_saltriver的专栏-CSDN博客_sigmoid]
-
缺点:1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。2.其输出并不是以0为中心的。
softmax
定义:
更形象的图如下:
总结
sigmoid适用于二分类,当识别一幅图像是不是猫,将图像放入分类器中,sigmoid会得出一个值y,当y<0.5时认为y=0,则认为该图像不是猫
softmax适用于多分类,当识别一张图像属于猫、狗、鸟三类中的哪一类,将图像放入分类器中,会得到类似[0.6,0.1,0.3]三个值,三个值相加总和为1,认为为猫的概率是0.6。在确定类别时,取概率最大的,认为这种图像属于猫的类别。
pytorch实现
nn.BCELoss
公式为:
官方代码:tor
ch.nn.BCELoss
(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')
weight:给每个batch的loss分配比例。如果需要,则必须为nbatch张量的大小。
size_average:不推荐使用。默认为True。在默认情况下,loss为batch中每个元素loss的平均。
reduce:默认为true,对每个minibatch做平均或加和。
reduction:'none':不应用。
'mean':输出loss的平均。'sum':输出loss的总和。
!!注意:在使用BCELoss之前要用sigmoid
官方使用:
>>> m = nn.Sigmoid()
>>> loss = nn.BCELoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)#input和target尺寸相同,即公式中的和
>>> output = loss(m(input), target)#把input放入sigmoid的在放入loss中
>>> output.backward()
nn.CrossEntropyLoss
官方代码:torch.nn.
CrossEntropyLoss
(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')
公式:其中N为真实类别,p为真实值,q为被softmax处理过后的预测值
CrossEntropyLoss中结合了nn.LogSoftmax()和nn.NLLLoss():
- log_softmax:log和softmax合并在一起执行。
- null_loss:全称是negative log likelihood loss,函数表达式为:。例如假设x=[1,2,3],class=2,那么f(x,class)=−x[2]=−3
交叉熵的公式转化成:
官方代码:
不需要处理log_softmax和null_loss,
input和target尺寸相同,直接输入nn.CrossEntropyLoss即可
>>> 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()