前言
看了一些博客,什么BCE/CE/单标签多分类/多标签多分类。。。搞迷糊了。于是自己简单总结一下。
首先
首先我们可以先理解两种不同的任务目标:
1、“是不是”的问题。比如LR的输出概率,即是不是的问题。
2、“是哪个”的问题。比如多分类输出层标签的one-hot形式。
结论:
一些博客说CE只考虑了正向样本的损失而未考虑负类样本的损失(因为负类的标签是0),而BCE既考虑了正类样本的损失又考虑了负类样本的损失,这种说法是错误的。首先我们需要明确一点:一个合理的损失函数应该同时兼顾正类和负类样本,这样才能使模型很好地收敛。BCE和CE无疑都是合理的损失函数,只不过在应用的形式上有些差别,其本质是一致的。这种应用上的差异主要体现在类别标签的形式不同和应用场景的不同。
具体地:1、以逻辑回归和单输出的二分类神经网络为例,两种模型的最终输出结果都是sigmoid(z),训练数据的标签为0或1的形式。当一个正类训练样本输入时,根据BCE公式,当前样本的损失为-(1×log(y) + 0×log(1-y)),当一个负类样本输入训练时,根据公式,当前样本的损失为-(0×log(y) + 1×log(1-y)),这时因为模型的输出的意义始终是“输入的新样本的预测标签是1的概率”,属于“是不是”的问题。 对于同样的数据,以二分类神经网络为例,当数据标签的形式为{正:[1,0],负:[0,1]}时,模型的任务变成了“是哪个”的问题。直观地,当输出正类的训练样本时,根据CE的公式,模型的当前损失为两个输出单元的损失和,即-(1×log(y1) + 0×log(y2)),当输入的是负类样本时,数据标签为[0,1],则当前样本的计算损失为-(0×log(y1) + 1×log(y2))。因此CE和BCE没有本质上的区别。
2、应用场景的不同:
一句话概括,BCE应用在“是不是”问题上,CE应用在“是哪个”问题上。
举个特殊的例子:对于多标签多分类任务,比如一张含有猫和狗的图片p,标签集为【猫、猪、狗、牛】,则p的标签为[1,0,1,0],这时对于每一个维度都相当于一个“是不是”问题,因此可采用BCE。
此处又可以进一步联想到Word2vec中的层次Softmax的路径预测,也是具有相同道理。
一、理解熵、相对熵、交叉熵、CE和BCE
这里的交叉熵公式属于CE,也就是多类别的交叉熵损失函数公式。
二、BCE(顾名思义,二分类交叉熵损失函数)
三、CE
C表示输出层的类别数或单元数(one-hot形式的标签的维数)