softmax cross entropy loss 与 sigmoid cross entropy loss的区别

要了解两者的区别,当然要先知道什么是softmax, sigmoid, 和 cross entropy(交叉熵)了:

1、softmax:

图片来源:李宏毅机器学习课程

sotfmax其实很简单,就是输入通过一个函数映射到0-1之间的输出,上图中蓝色区域可以看做一个函数f,则有y=f(z),(大家仔细看这个公式哇,zy可我可都加粗了,所以这两个值可不是标量,而是向量,换句话说,扔进softmax一组向量,吐出也是同维度的一组向量)然后这些输出值就有概率的意义了(加起来等于1),为什么要这么做呢,一方面相当于是对输入做了一个归一化处理,另一方面,神经网络的输出要有物理意义才行,而概率是多么有意义的一个值啊。当然,为什么叫softmax呢?输出是概率呀,不是hard(硬的1),而都是一些小于1的数,当然就很soft(软)了。

比较重要的是softmax一般用于多分类的任务(因为上面说了,扔进去的一组向量嘛),比如大家熟悉的mnist数据集分类(不了解mnist的童鞋应该不多吧),要把0-9分开来,最后的输出就是接了一个softmax。关于这个等会再讲。

2、sigmoid 

sigmoid函数又叫s曲线,又叫logistic函数(名字真多)

上图!

图片来源:同上

sigmoid一般用于二分类问题(这个大家都知道), 看上图的这个公式就知道,扔进sigmoid的是一个标量,然后吐出一个标量。也就是说只是对一个量把它映射到(0,1),于是也就具有了概率意义。当然,当softmax的输入退化为一个标量时,softmax和sigmoid在形式上就一样了。

3、cross entropy

交叉熵:要不咱们直接上公式吧(不想打公式,懒是原罪)

图片来源:同上 

这是最原始的交叉熵公式,对于这个公式,我就稍微说几句吧: 首先,要知道熵这个概念,熵是信息论里面一个概念,用来衡量信息的不确定性,信息的不确定性越大,熵就越大。那么信息的不确定性跟什么有关系呢?答案果断是概率啊。ok,所以熵的公式里有概率(没毛病)。那么交叉的意思就是需要两样东西,不然怎么交叉?所以在这里两样东西就是两个不同的概率分布p和q,交叉熵就是来衡量这两个概率分布的相似情况。我们的目标是让值两个概率分布越接近越好(想一想是不是?一个是标签label,另一个则是网络的输出)假设q是真实的标签,p是网络的输出,我们通过cross entropy loss 和BP算法(误差反向传播)来让p越来越接近q,即在完全知道q的信息量的情况下去不断的窥探q分布的信息量,慢慢的,我们也知道了q分布到底是个什么东西,这个时候两者的交叉熵就很小了,q的不确定性没剩下多少了。(可怜我q,被人家刨了祖坟。)

 

接下来,就让它们产生化学反应吧

当sotfmax 遇到cross entropy

还记得mnist吗,mnist的label是什么呢?答:是用one-hot编码的一组向量哇

0-9的编码(label)如下(哎,还是自己打公式了): 

 再贴一波公式:

上图第一个公式就是softmax,其中x是样本,k表示类别,再想想上面说的,softmax是用于多分类,每次扔进去的是一个向量。在mnist的例子中每一个样本都是用10维向量来表示的,10维向量的每一维都不独立吧,并且是one-hot编码,只有一维是1,其他维度都是0,完美的匹配了sotfmax输入的要求。所以每次扔进sotfmax的是表示某一个数字的向量哟。

再看第二个公式,把第一个公式带入交叉熵的原始形式就可以得到这个公式,N表示mini-batch的样本数,p就是第一个公式的那个p,one-hot 编码的label只有一个1,所以10个维度的p(x)和q(x)计算交叉熵就只剩下一个维度了。公式很好推就不推了。

当某一次输入到网络中的是x,x表示某个数字,如果x与它对应的label y差的很远,那么loss很大,梯度回传进行参数更新。直到loss变的很小。

当sigmoid 遇到cross entropy

咦,两个交叉熵的公式不一样!!!

当然是不一样的,这里数据的label是下图这样的

举个栗子:

大家都知道sigmoid用于二分类问题,却不知道可以是多标签的二分类问题。

要对如下label的数据集进行分类

这个label是三个维度的,第一维表示性别:男女0/1,第二维代表头发:长发/短发, 第三维代表国籍:中国/其他。这个时候不是只有一个1,与one-hot不同,这是一个多标签的分类问题,每个维度之间是独立的。此时,sigmoid + cross entropy是分别对这三个维度计算概率, 这就是区别。他们之间的物理意义是不一样的。

 

总结一下

sotfmax + cross entropy loss

适用场景:单标签多分类问题

label的所有维度加起来等于1,互相不独立,label是one-hot编码。

sigmoid + cross entropy loss

适用场景:多标签二分类问题

label的每一维都独立。

从概率分布上来讲,这两种组合其实就是对两种不同定义的概率分布进行学习的不同计算方法。

 

ps:以上只是博主的个人认知,如有错误,望指正。

### 回答1: nn.BCELoss()和nn.CrossEntropyLoss()是PyTorch库中常用的损失函数。 nn.BCELoss()是二分类问题中使用的二元交叉熵损失函数。这个函数适用于输出数据为概率值的情况,如sigmoid函数输出的概率值。它计算每个样本的损失然后对它们取平均值。BCE代表二元交叉熵(binary cross entropy)。这个损失函数可以反映模型预测结果与真实标签之间的差距,并帮助模型通过梯度下降来更新网络参数,使得预测结果与真实标签尽可能接近。 nn.CrossEntropyLoss()是多分类问题中使用的交叉熵损失函数。这个函数适用于输出数据为类别索引的情况,如使用softmax函数进行多分类任务的结果。它将模型预测的概率分布与真实标签之间的差异转化为一个标量损失值。CrossEntropy代表交叉熵损失,它将每个样本的预测概率与真实标签对应位置的真实概率进行比较,并对它们进行求和然后取平均。这个损失函数可以帮助模型学习到正确的类别预测,使得预测的概率分布与真实标签的概率分布尽可能接近。 综上所述,nn.BCELoss()适用于二分类问题,计算模型输出概率值与真实标签之间的差异;而nn.CrossEntropyLoss()适用于多分类问题,计算模型输出概率分布与真实标签之间的差异。 ### 回答2: nn.BCELoss()和nn.CrossEntropyLoss()都是PyTorch中用于计算损失函数的类。 nn.BCELoss()是二分类问题中使用的损失函数,用于计算二分类交叉熵损失。它将模型的输出与目标标签进行比较,并计算每个样本的二进制交叉熵损失。如果目标标签是正类,则损失函数会惩罚模型输出为负类的程度,反之亦然。nn.BCELoss()常用于二分类任务中,例如图像分类中的两类分割、异常检测等。 nn.CrossEntropyLoss()则用于多分类问题中,计算多分类交叉熵损失。它接受模型的输出和目标标签,并计算每个样本的交叉熵损失。在多分类问题中,目标标签需用One-Hot编码或整数类型表示。nn.CrossEntropyLoss()会将模型输出进行softmax处理,再与目标标签进行比较,计算交叉熵损失。它对于多分类问题是常用的损失函数。 总结: 1. nn.BCELoss()适用于二分类问题,计算二分类交叉熵损失。 2. nn.CrossEntropyLoss()适用于多分类问题,计算多分类交叉熵损失。 两者主要区别在于输入形式和模型输出的处理方式。 ### 回答3: nn.BCELoss()和nn.CrossEntropyLoss()都是PyTorch框架中常用的损失函数。它们的差异在于应用的场景和处理方式不同。 nn.BCELoss()是二分类问题的损失函数,适用于输出为概率值的情况。它的全称是Binary Cross Entropy Loss,用于衡量模型输出的概率与真实标签之间的差异。该损失函数采用式子:Loss = -[y*log(x) + (1-y)*log(1-x)],其中y是真实标签,x是模型输出的概率。nn.BCELoss()常用于输出值为0或1的二分类任务,比如判断图像中是否包含某个物体。 nn.CrossEntropyLoss()是多分类问题的损失函数,适用于输出为类别的情况。它的全称是Cross Entropy Loss,用于衡量模型输出的类别预测值与真实标签之间的差异。该损失函数采用式子:Loss = -[y*log(x)],其中y是真实标签的类别索引,x是模型输出的类别概率分布。nn.CrossEntropyLoss()将分类问题转化为一个概率分布的差异度量,常用于多分类任务,比如图像分类、文本分类等。 两者之间的区别主要在于输入形式和问题类型不同。nn.BCELoss()适用于二分类问题,输出为概率值;nn.CrossEntropyLoss()适用于多分类问题,输出为类别。同时需要注意的是,对于二分类问题,可以使用nn.CrossEntropyLoss()代替nn.BCELoss(),只是需要设置输出类别为2。而对于多分类问题,如果输出为概率值,则可以使用nn.BCELoss(),但需要将输出进行二值化处理。 综上所述,nn.BCELoss()和nn.CrossEntropyLoss()是PyTorch框架中常用的损失函数,用于不同类型的分类问题。根据具体的问题和输出类型,选择合适的损失函数可以提高模型训练的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值