多标记分类和传统的分类问题相比较,主要难点在于以下两个方面:
类标数量不确定,
- 有些样本可能只有一个类标,有些样本的类标可能只有一个,有的则可能十几个,但是在这个比赛中我们把这个问题简单化了,就是取 top5.
类标之间相互依赖
- 例如一个问题可能是将神经网络算法的,那么它可能属于的话题就有深度学习,机器学习,人工智能等,这些话题,也就是标签之间可能是有比较强的相关性的。
解决方法:
最简单的技术,每个标签当作单独的二分类问题。然后计算1999个二分类的一个平均值。这里看起来像是当做了1999个独立的问题,但实际上并不是。我们在神经网络的最后一层使用sigmoid计算交叉熵损失。对于每个输出节点,它们都共用前面的每一层网络,也就是前面各层的参数它们都是共享的,所以每个类别之间是有比较强的相关性来的。
第二种方式是显式地去考虑标签之间的关系。有先后顺序的一系列Binary Classification,然后前边的Binary Classification会对后边的产生影响。比如在预测标签2的时候,我们把它预测成标签1的结果也当成输入。这时候算法的复杂度就非常大了。在类别数量非常多,样本数量非常大的时候几乎是不可实现的,而且我们要怎么去衡量这些类别之间的一个先后顺序也是比较困难的。
在比赛中,我使用的是第一种方式。其他所有选手都没有显式考虑标签之间关系的。但是由于有很多类别之间关系紧密,也有一些可能比较容易混淆的类别。所以可以采用 boosting 的方式来提高识别率。
我们先训练一个网络,在第一次预测的结果上,统计出训练样本中每个类别的错误率。
然后在这个基础上调整每个类别的权重,重新训练相同的模型
如此反复,不断提高模型的拟合能力。这样做有两个问题:第一是非常非常耗费时间,因为boosting方法是串行的,单独训练一个网络就要一天了,所以这样boost计算时间要很多。就算是可以并行的,也没有这么多GPU可用。第二个是boosting的方法很有可能会过拟合,本身神经网络的拟合能力就很强了。但是好在这次比赛的数据量非常大,所以使用这种方式还是有明显的提高。