1 Introduction
今天分享2020年EMNLP会议上的一篇paper,关于无监督(弱监督)方式进行文本分类,论文题目为:Text Classification Using Label Names Only: A Language Model Self-Training Approach。从题目可看出:论文的核心是仅利用标签名进行文本分类,而其中实现的过程可以看着是:一个自学习的语言模型。光从标题这两点,就吸引了我想阅读的欲望——可见取一个好论文的标题是很重要的~~。
带着这份被引导的欲望,我将这篇论文读了几遍,其中细节也是反复去理解。最后感觉:这篇论文提出的方法不错,有在实际场景中落地的价值。那就把这篇自认好文分享给大家,如果入不了你的法眼也没关系,我权当又加深了一次理解。论文的下载地址为:https://www.aclweb.org/anthology/2020.emnlp-main.724.pdf,本篇论文也开源了代码:https://github.com/yumeng5/LOTClass
2 Model
上图为论文的模型框架,整体来说:左边部分(MLM)是利用标签名(如sports,politics等)和BERT Encoder来找每个标签对应的类别词,形成类别词库(Category Vocabulary);右边部分是将文本中的类别词marked掉,然后预测其属于那种类别词库,其结果也对应着文本预测的类别,这部分是一个自学习迭代的过程。接着详细介绍。
2.1 依据label名从语料库中找对应的类别词
实现该目标的思路为:找出一个label名在语料库中出现的文本,然后利用BERT获取这个label的上下文表征向量h,接着利用它去预测跟词表V中最相似的词(最能替代的词)。概括来说:就是利用BERT MKM模型(BERT masked language model) 来预测哪些词在语义层面是可以代替在文本中出现的label。 计算公式如下:
其中参数都是BERT已训练好的,这个过程可利用transformer包直接调用实现,详细见论文源码。
按以上方法找到词并不能真正意义代表label的类别词,接着作者制定了几条规则进行过滤:
- 对于每一个文本的中label词,取前50个最相似的词,按概率排序
- 对每个label,通过出现频率排序,取前100作为该label的类别词库
- 去掉停用词
- 去掉在多个label的类别词库出现的词
下表为论文在数据集上找的类别词库示例:
2.2 类别词进行marked预测学习
虽然通过上面的步骤已找到各个label对应的类别词库,但作者觉得还不够,因为还存在两个问题:
- 存在一词多义的情况,如Table1中显示:“sports”有两层含义,第二个得到的相似词并不代表其label的含义;
- 词表中词有限,有些类别词可能并不在词表中;
针对上述两个问题,作者提出一个新任务: Masked Category Prediction (MCP),对应model图中的右边部分。其思想是:将文本中的词masked掉,然后利用它的上下文表征信息,预测类别词所在的category。这是一个分类任务,也是在MLM基础上进行下fine-tuned的学习过程。这里可能大家会有一个疑问:这是一个监督学习过程,那监督数据是?
为解决这个问题,作者这样处理的:判断一个词w是否属于真正对应的label,如果该词的替代词有20个在label找到的类别词的50个中,则认为该词就是label的代表词,文中也称类别指示(category-indicative)。这条规则在某种程度上消除了上面提到的一词多义的问题。
接着作者将类别指示词(category-indicative)作为监督数据进行MCP任务训练:
注意:在MCP任务中,masked是category-indicative词,文中解释说:这样做可让模型根据词的上下文来推断类别,而不是简单根据类别词,某种程度就扩大了类别词范围,解决了上述的第二个问题。此外,这个任务也达到了文本分类的目的。
2.3 在大规模语料库中进行自学习
有了MLM和MCP任务,作者又提出在大规模未标注数据集上进行自学习训练,其原因有两个:
- 仍有大量的未标注文本没被MCP模型进行学习,而这些未被学习的样例是有助于提高模型泛化性的;
- MCP训练的模型只是利用了masked词的上下文表征信息,并没有利用文本的整体表征信息[cls];
针对上述问题,文章提出一个self-training (ST)思想:迭代地使用模型的预测分布P,和计算出目标分布Q,计算二者的KL loss,从而指导模型进行优化。
关于分布Q的计算,文本采用下列方法:
为何采用该计算方法,这里我也做不了太多的解释;文中也是引起其他论文中的方法,若对此感兴趣的,建议深入阅读相关文献。而P分布是利用MCP任务训练的模型,然后利用文本的[CLS]向量来进行类别预测出来的分布。
按照上述方法,迭代在语料库上进行训练,每50个batch 更新下公式4、公式5,迭代过程如上图所示。
3 Experiment
文中在四个数据集上进行试验,每个数据集上的label类目并不是很多,有的就两个类别。
试验结果显示,文中的方法(LOTClass)在弱监督类,四个数据集都取得最佳结果,最高达20%效果的提升。其中自学习方法对模型也有约6%的提升效果。与监督和半监督学习对比来看,平均差8%左右。整体来说,弱监督能达到这个水平非常不错了。
4 Conclusion
文中作者也提及到:觉得目前提出的方法仍有提升的空间,具体包括:(1)使用更强的预训练模型,文中只使用的是Bert-base,(2)将类别词粒度扩大,文中的类别词长度限制不超过3;(3)使用反向翻译方式进行数据增强。此外,作者相信:该方法如果结合半监督或者监督学习方法,能得到更佳分类的效果。
一些我个人的想法:论文是在英文数据集上做的实验,其方法也可在中文文本上使用,可能会有一些差别,这个我目前正在实验,看看效果,若效果如文中实验结果那般,那真很多项目场景都可以落地应用。此外,有点存疑就是:如果真实分类场景中,label的数量很多,甚至有层级关系,这类label的指示词能很好学到吗?此外,有些label名可能就没在语料库出现过,那这个问题又涉及到类似冷启动的问题了,还是需要人为定义一些label的指示词再去扩充。这些问题还需结合真实数据场景进行研究,也希望本篇paper对text classification任务感兴趣的朋友有用,后续若有进展,再跟大家分享~
更多文章可关注笔者公众号:自然语言处理算法与实践