在我看来,多标签分类可以使用二元交叉熵(Binary Cross Entropy,BCE)作为损失函数,这背后有着非常清晰且符合逻辑的数学原理和模型假设。我们不妨从头捋一捋。
首先,要明确区分一下“多类分类”和“多标签分类”。这俩名字听着像,但干的事儿完全不一样。
多类分类 (Multiclass Classification):想象一下你有一堆水果图片,需要识别出它们是苹果、香蕉还是橙子。在这种情况下,一张图片只能属于一类。模型需要从 N 个互斥的类别中选出一个最可能的那个。
多标签分类 (Multilabel Classification):再想象一下,你有一张电影海报。这张海报可能包含“动作”、“喜剧”、“科幻”等多个标签,也可能只有一个“爱情”标签,或者一个都没有。关键在于,一张图片可以同时属于零个、一个或多个类别。
正是这种“一个实例可能拥有多个标签”的特性,决定了我们在设计损失函数时需要采取不同的思路。
为什么二元交叉熵(BCE)在这里能派上用场?
BCE 的核心思想是衡量一个二元变量(即只有两个可能值,通常是0或1)的预测概率与真实值之间的差距。它的公式通常是长这样的:
$$
ext{BCE}(y, hat{y}) = [y log(hat{y}) + (1y) log(1hat{y})]
$$
其中:
$y$ 是真实的标签(0 或 1)。
$hat{y}$ 是模型预测该标签为1的概率(一个介于0和1之间的值)。
将BCE应用到多标签分类的思考过程:
在多标签分类问题中,我们可以巧妙地将问题拆解。对于一个给定的样本,它的每一个潜在标签都可以被视为一个独立的二元分类问题。
比如说,我们有三个可能的标签:A, B, C。
对于一个样本,它可能属于 A,不属于 B,但属于 C。
我们可以将其拆解成三个独立的二元判断:
1. 样本是否属于标签 A? (真实值:1, 预测概率 $hat{y}_A$)
2. 样本是否属于标签 B? (真实值:0, 预测概率 $hat{y}_B$)
3. 样本是否属于标签 C? (真实值:1, 预测概率 $hat{y}_C$)
这里的关键在于,我们不再用一个softmax层去输出一个概率分布来选择一个类别,而是为每个类别使用一个独立的Sigmoid激活函数。Sigmoid 函数的输出是一个介于0和1之间的值,这正好可以被解释为“该样本属于这个特定类别的概率”。
所以,在多标签分类的场景下,我们的模型输出层通常是:
对于 $K$ 个可能的标签,模型会输出一个长度为 $K$ 的向量,比如 $[hat{y}_1, hat{y}_2, ..., hat{y}_K]$。
每个 $hat{y}_i$ 是通过一个 Sigmoid 函数计算得出的,表示模型预测该样本属于第 $i$ 个类别的概率。
而真实的标签也同样是一个长度为 $K$ 的向量,比如 $[y_1, y_2, ..., y_K]$,其中 $y_i$ 是0或1,表示样本是否真实属于第 $i$ 个类别。
将BCE与多标签输出结合:
有了这个拆解的思路,损失函数就自然而然地变成了对每一个标签的二元交叉熵的求和(或者平均)。
总的损失函数可以写成:
$$
ext{Total Loss} = sum_{i=1}^{K} ext{BCE}(y_i, hat{y}_i)
$$
$$
ext{Total Loss} = sum_{i=1}^{K} [y_i log(hat{y}_i) + (1y_i) log(1hat{y}_i)]
$$
为什么这样是合理的?
1. 独立性假设的体现: 这种做法隐含了一个假设,即每个标签的预测是相对独立的。也就是说,一个样本属于“动作”类别,并不会直接影响它是否属于“喜剧”类别的概率计算(至少在损失函数的层面是这样处理的)。Sigmoid 函数正是鼓励这种独立概率的输出。
2. 针对每个标签优化: 通过对每个标签的 BCE 进行求和或平均,我们实际上是在独立地优化模型对每个标签的预测能力。
如果一个样本真实标签是1 ($ ext{y}_i=1$),我们希望 $hat{y}_i$ 趋近于1。BCE 会惩罚 $hat{y}_i$ 接近0的情况。
如果一个样本真实标签是0 ($ ext{y}_i=0$),我们希望 $hat{y}_i$ 趋近于0。BCE 会惩罚 $hat{y}_i$ 接近1的情况。
3. 与多类分类的根本区别: 多类分类通常使用 Softmax 激活函数在输出层,它会产生一个所有类别概率之和为1的概率分布。在这种情况下,我们通常使用 Categorical Cross Entropy(分类交叉熵)作为损失函数。Categorical Cross Entropy 的形式是:
$$
ext{CCE}(y, hat{y}) = sum_{i=1}^{K} y_i log(hat{y}_i)
$$
注意这里的 $y$ 通常是一个独热编码向量(onehot encoded vector),只有一个元素是1,其余都是0。而 $hat{y}$ 是一个概率分布。CCE 的设计是为了惩罚模型在真实类别上预测概率低的情况,同时利用了所有类别之间的互斥性。如果模型将概率大量分配给了其他错误类别,CCE 会受到很高的惩罚。
但在多标签分类中,我们不期望标签之间是互斥的。一个样本可以同时是动作和喜剧。所以,Softmax 的“概率分布”和“互斥性”就变得不适用了。而 Sigmoid 产生的独立概率以及基于此计算的BCE,恰好能够正确地捕捉和优化这种“多标签共存”的性质。
举个例子来巩固一下:
假设有3个标签:猫 (cat), 狗 (dog), 鸟 (bird)。
一个样本的真实标签是:[cat: 1, dog: 0, bird: 1]。
模型输出(经过 Sigmoid)预测概率是:[cat: 0.8, dog: 0.3, bird: 0.9]。
使用BCE损失:
对于“cat”:$y=1, hat{y}=0.8$。损失为 $[1 log(0.8) + 0 log(0.2)] = log(0.8)$。模型预测“猫”的概率很高,损失较小。
对于“dog”:$y=0, hat{y}=0.3$。损失为 $[0 log(0.3) + 1 log(0.7)] = log(0.7)$。模型预测“狗”的概率不太低(相对而言,0.3比0.7更接近0),损失也相对较小。这里我们希望 $hat{y}$ 趋近于0。
对于“bird”:$y=1, hat{y}=0.9$。损失为 $[1 log(0.9) + 0 log(0.1)] = log(0.9)$。模型预测“鸟”的概率很高,损失很小。
总损失是这三项的加和。你会发现,每一项损失都独立地奖励模型在真实标签上预测为1(或0)的“正确性”。
总结一下:
多标签分类之所以可以使用二元交叉熵,是因为我们可以将问题视为多个独立的二元分类任务(每个标签一个),并为每个任务使用 Sigmoid 激活函数来输出该样本属于该标签的独立概率。然后,将每个二元分类任务的 BCE 损失加起来,就构成了一个能够有效衡量和优化多标签模型性能的损失函数。这与多类分类中,标签互斥且需要一个整体概率分布的场景有着本质的区别,因此不能直接套用 Categorical Cross Entropy。
希望这样的解释能让你对这个问题有更清晰的认识。