深度学习与文本分类总结第二篇--大规模多标签文本分类

本文转载自:https://blog.csdn.net/liuchonge/article/details/77585222

上一篇博客中我们已经总结了文本分类中常用的深度学习模型,因为知乎的本次竞赛是多标签的文本分类任务,这也是我第一次接触多标签分类,所以想单独写一篇博客来记录这方面的相关知识。 
在这里首先列出几篇参考的文章:

  1. 基于神经网络的多标签分类可以追溯到周志华在2006年发表的文章: Multi-Label Neural Networks with Applications to Functional Genomics and Text Categorization。其贡献在于提出了BP-MLL(多标签反向传播)以及新的误差函数: 
    深度学习与文本分类总结第二篇--大规模多标签文本分类

  2. 然后是一篇基于周志华文章改进的论文:Large-scale Multi-label Text Classification Revisiting Neural Networks。这篇文章提出使用Adagrad,dropout等技术,此外还提出使用标准的交叉熵函数作为目标函数效果更好。

  3. 上面的文章还是使用普通的神经网络进行分类,接下来就出现了基于深度学习模型的方法。比如:Large Scale Multi-label Text Classification with Semantic Word Vectors。这篇文章很简单,就是把TextCNN和GRU直接用到多标签文本分类里,最后根据一个阈值alpha来确定样本是否属于某个类别。

  4. Improved Neural Network-based Multi-label Classification with Better Initialization Leveraging Label Co-occurrence。这篇文章提出了一种根据类别标签之间的共现关系来初始化最后输出层参数的方法。其也是基于TextCNN,不同之处是最后一个输出层的权重不使用随机初始化,而是根据标签之间的共现关系进行初始化。据作者说这样可以获得标签之间的关系,这样有一种聚类的效果。相似的样本会标记为相同的标签。此外他还提出了损失函数的计算方法。具体的细节部分可以去看相关论文。 
    深度学习与文本分类总结第二篇--大规模多标签文本分类深度学习与文本分类总结第二篇--大规模多标签文本分类

  5. 模型上的改进:Ensemble Application of Convolutional and Recurrent Neural Networks for Multi-label Text Categorization。这篇论文主要提出了一种CNN和RNN融合的机制,将CNN的输出作为RNN的初始状态然后进行类别的预测。架构图如下所示: 
    深度学习与文本分类总结第二篇--大规模多标签文本分类

上面几篇论文是我在做竞赛的过程中阅读的几篇相关论文,每篇都会有一定的特点,但是实际的效果如何其实并不会像论文中提到的那样,也有可能是自己调参跳的不好。但是论文里面提到的创新点还是值得我们学习的。然后我们来总结一下多标签文本分类相关的东西,这里参考上面第三篇论文。首先来讲,多标签分类的算法可以分成下面三种类型:

  1. multi-label classification:将标签分成Y和Y的补集两个分区
  2. label ranking:将标签进行排序,排名靠前的就是预测为相关的类别
  3. multi-label ranking:上述二者的综合,同时产生分区和rank。设置阈值函数进行判断

此外,我们还可以使用Binary Relevance(BR)算法,将多标签问题转化为L个二分类问题。训练L个模型,每个模型处理一个类别,这样做的好处是可以并行训练L个模型,降低训练复杂度,而且可以方便的增删标签数量。最终只需要把结果合并成一个输出向量就可以了。但是也有一点的缺点,比如说由于分开训练L个模型,所以忽视了标签之间的相关性。而且当当数据集出现类别不均衡等现象时,效果也会变差。

上面说了几种如何看待多标签分类问题的思路和看法。其实就是将多标签分类进行转化。我感觉比较常用的应该是ranking和BR的方法。再反过来看这次知乎的竞赛,其实我看了前几名的解决方案,大都是只用了深度学习模型的堆砌,比如说CNN,RNN然后再加上模型融合和数据增强的一些手段得到了比较好的分数。但是我之前也采访过知乎机器学习团队的负责人,他当时也明确的表明现在选手使用的方法还都是比较老派,没有什么十分大的创新点出来,而且几乎没怎么利用标签之间的关系等信息。这里我就说一下我在竞赛里面做过的几种尝试。

1,首先来分析一下知乎所提供的数据都有哪些特点,第一给了1999个标签之间的父子关系,这样我们就可以将其构成一张树状关系图。

2,其次他给出了每个label的描述信息,我觉得这个信息是最重要的,因为这样我们最简单也可以计算样本和1999个标签之间的相似性然后排名取出前5个就可以粗略地进行类别标注。当然我们在结合深度学习的时候可以将其放在最后一层跟CNN的输出进行结合计算。我当时采用的方法是,将样本和1999个标签的title分别经过CNN进行计算,然后再将得到的文本表示和标签信息进行一个相似性计算得到每个类别的相似性概率表示。但是这种方法的缺点在于速度太慢,我当时训练了一天两夜才跑了2个epoch(CPU),所以中途放弃了,至今也不知道效果如何==

3,使用上面第四篇文献中所提出的方法,首先对数据进行预处理,得到所有训练数据中所出现的标签共现信息,取共现次数最高的前N个标签对作为初始化的依据。该模型的想法是通过这种自定义初始化网络权重的方法让模型学习到这种标签的共现信息,从而更加准确地进行类别预测。

4,在查阅文献的过程中,看到了一篇“Multi-Label Classification on Tree- and DAG-Structured Hierarchies”的论文,其提出将标签信息构建成有向无环图或者树状的分层结构。但是该方法是基于传统机器学习模型做的,由于竞赛过程中时间有限,所以并未加以尝试。此外,我还考虑是否可以将标签信息使用类似于word2vec中的分层softmax的机制进行处理。总之是尽量的把标签之间的父子关系图利用起来,以增强分类的准确度。这里也不过是一些自己的想法罢了,还并未进行实践,也希望有懂这方面知识的同学可以指点一二。

至此,关于多标签文本分类相关的知识就暂时总结到这里,其实也就是看的几篇论文和知乎竞赛中的一些思考。接下来抽时间把自己参加竞赛的一些具体的代码等再整理出一篇博客就将完结这个系列。