Binary Cross Entropy真的适合多标签分类吗?

个人曾在负责一个多标签文本分类项目时对于多标签分类(multi-label classification)的loss选择、forward尾层处理感到迷惑,当时查

个人曾在负责一个多标签文本分类项目时对于多标签分类(multi-label classification)的loss选择、forward尾层处理感到迷惑,当时查找了一下资料确定了一种方案:

1、以类别数作为最后隐层输出节点数,以sigmoid激活。这样其实就相当于将每个类别视为1个二分类任务,最后隐层的输出每个位置对应一个类别。也正因为如此,用sigmoid而不能用softmax(softmax没有把每个节点视为相互独立的,相反,会导致相互影响)。

2、采用Binary Cross Entropy loss进行训练。如果视最后一个隐层的每个节点对应一个类别的1/0分类,那BCE loss确实是再自然不过的选择了。但这样真的好吗?我给出的答案是不尽然,并且标签越稀疏越差。

关键问题引出

不妨对比一下BCE和用于多分类任务的CrossEntropy在示例样本的表现:(为了直观,这里不贴各自的公式了,满地都是,在这里无助于理解本关键点,还是直接以计算示例突出关键)

多分类任务-CE

label:[0,1,0,0]

pred:[0.3, 0.67, 0.4, 0.25]

CE loss = 0 x log(0.3) + 1 x log(0.67) + 0 x log(0.4) + 0 x log(0.25)

关键区别特征:以CE作为loss时,对于模型学习有效的部分仅为label=1对应位置的pred值。反过来讲,0对应位置的pred值无论是大是小,对于loss的计算没有影响。记住这一点,再来看BCE。

多标签分类任务-BCE

label:[0,1,0,1]

pred:[0.3, 0.67, 0.4, 0.25]

BCE loss = 0 x log(0.3) + (1-0) x log(0.7)

+ 1 x log(0.67) + (1-1) x log(0.33)

+ 0 x log(0.4) + (1-0) x log(0.6)

+ 1 x log(0.25) + (1-1) x log(0.75)

关键区别特征:以BCE作为loss时,无论是label=0的位置还是label=1的位置都对模型学习有影响。这就意味着训练会产生一种效果:label的某一位置为0会引导模型在该位置输出值向0“靠拢”。

这似乎是一件好事,没错,仅对于这一位置对应类别的分类来说确实是一件好事,所以二分类任务就采用BCE绝对没毛病。但是,现在做的是多标签分类任务,必须考虑该loss造成的相关的全局影响。来看一个例子:

label:[0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

众多位置中仅有2个位置为1,也就是说在全部标签数量较多的情况下,该条数据所符合的标签仅有2个。这将导致主导模型学习的是大量的0而不是1,而该条数据文本中包含的特征信息仅与1有关联性判断某条信息是否属于某一类别,是由它具备什么类别特征决定,而不是由它都不包含其它类别的特征决定于是造成从一个本来很有信息量(突出特征)的文本中反而没学到什么有助于分类的知识。如果还是不理解的话,可以这样想一下:教小孩去识物,但每次只告诉它不是a,b,c...造成它对每一件物品的识别都只能用排除法,显然效果会差很多。

总结

问题的关键正是无关信息主导模型学习非1预测。如果在该任务下,大部分数据的真实标签数量偏大,那么这不是问题,但在大部分多标签文本分类任务实际场景下,某条数据的真实标签数量相对整体标签数量基本微不足道,该问题对训练效果造成的影响也就很大。所以BCE对于多标签分类并非一个“可放心使用”的方法。