个人曾在负责一个多标签文本分类项目时对于多标签分类(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=