没有标注数据不用怕,只用标签名称就可以文本分类!韩家炜组出品
对于实际的文本分类需求,没有标注数据是一件很常见的事情。
针对这种情况,有一个最朴素的思路可以做:
- 首先,根据对应的标签名称,使用W2C找到对应的相近词
- 通过相近词,对文本数据做关键词命中,进而映射到对应的类别
- 使用上述的标注数据训练文本分类模型
- 使用3步骤的文本分类模型对新数据预测,获得置信度高的文本,之后做半监督。
上面这个思路,非常的简陋,最终的结果也不会很好。实际工作中,需要有大量的规则去补充。
今天分享的这个论文【Text Classification Using Label Names Only: A Language Model Self-Training Approach】,来自韩家炜组。
针对上面的场景,这个论文给出了一个思路。
整个论文读下来,先给个简单的评价,思路不错,但是也并不成熟,不过其中有很多细节点可以让我学习到。
人们在对一个文本分类的时候,不会看到任何带标签的标注数据,而只是通过一些关于描述分类类别的单词,就可以做出判断。
举个例子,人去对文本进行分类的时候,假如文本有一个类别属于计算机
。脑海中其实是有先验知识,比如如果句子中出现人工智能
,深度学习
,NLP
等词汇的时候,人们基于此可以很大概率的判断出当前这个文本是属于计算机
这个类别。
随后呢,注意上面只是说的是很大的概率,还会出现苹果
属于科技
类别,但是不属于水果
这个类别,也就是单单第一步还会出现语义歧义的错误,所以人们还会通读一遍句子,根据上下文语义再对句子分类。
作者类比这个思路,提出了三个步骤:
(1)找到和标签名称语义相关性较高的词汇;
(2)查找类别指示性单词并基于这些单词训练单词分类模型
(3)自训练提升模型
直译过来就是通过标签名称替换理解类别。
这句话直译过来的话可能不好理解,更好的表述是找到与标签名称语义相关性较高的词汇。
就像我们上面说的,人们在看到标签名称的时候,会联想到很多与之相关的词汇。
类别到NLP中,预训练模型其实就相当于模型的先验知识,可以从中知道标签名称的相近词汇。
我们知道,Bert 训练的时候是这样的:mask
掉一部分词汇,然后通过语言模型预测mask
部分的输出,计算损失函数;
现在我当前输入是人工智能
(为了方便理解,我们可以认为输入它是一个词作为整体输入),那么输出的时候其实是在整个词汇表上做softmax
;
基于此,从中挑选出概率最大的50个词汇,也就是当前这个位置最有可能出现的50个单词。
进一步的,因为包含人工智能
这个词的肯定不只是一个句子,我们对每个句子中的人工智能
做同样的操作,然后都获取对应的前50个词汇。
最后把这所有的50个词汇累积起来,按照频率从大到小,选取前100个词汇,作为可以替换人工智能
这个标签名称的相近词汇。
这个思路,简单来说,就是从预训练模型Bert获取标签名称的近义词或者更准确的说是获取与标签相关词汇的过程。
其实,看到这里,我想到了一点,就是这个过程和我们使用GLove
或者Word2Vec
获取近似词的过程很相似。
只不过Bert
是一个动态的权重,受上下文影响,所以获得结果更加的准确,泛化性也更强。
在论文,作者也做了实验论证这个道理。
这一步,我们得到的结果是类似这种:
简单总结一下:
两个步骤:
- 找到每个句子中存在的标签名字,使用Bert预训练模型,找到与之最接近的50个单词。
- 每个标签中所有单词汇总,按照频率,找出排在前100个单词,作为当前标签名称(
Label Name
)的类别词汇(category vocabulary
/category indicative words
)
这个步骤,简单来说是使用Bert这类的预训练模型在单词这个级别训练分类模型。
上个步骤中,针对每个Label Name
,我们会得到对应的category vocabulary
/category indicative words
。
这个时候一个最简单的办法,就是只要当前的句子出现了category vocabulary
中的词汇,我们就认为当前的句子属于相对应的Label Name
。
也就是我们开头说到的关键词命中规则。
但是这样做是有很大问题的。
首先,我们知道每个单词的词汇意义是与语境有关系的。一个句子出现苹果
这样的单词,你很难武断的认为这个句子是属于科技
还是水果
。
其次,我们得到的每个Label Name
的category vocabulary
都是有数量限制的。有的单词其实也能表达当前Label Name
的含义,但是并未包含在category vocabulary
中。
为了缓解这两个问题,作者提出了Masked Category Prediction (MCP)
任务;
简单讲,它分为两个步骤:
- 针对句子中的每个单词,使用Bert这种预训练模型,找到与之最近接的前50个相关词汇(很类似第一大步骤的第一小步骤);然后将这50个相关和每个标签的
category vocabulary
进行比较,当交集超过20个时候,此时这个句子中的这个单词对应的类别就是对应的这个Label Name
- 句子经过第一个步骤之后,句子中的部分单词就有了类别。那么mask掉这些单词,然后Bert相对应的每一个单词尾端接一个分类器对当前单词做类别的分类。
整体流程,如下图:
经过第二个步骤,当前模型仍然存在问题:
- 有的句子没有被找到有类别的单词,所以这些没有被训练到
- 训练到文本分类模型使用的是对应类别单词mask那里的输出,而不是cls。而ClS一般可以看到整个句子的全部信息。
针对这两个问题,作者提出使用全部的无标签数据,进行自训练。
这一块我自己知识积累的不多,就不多说了。具体的大家可以去看一下论文。
整体的算法流程如下图所示:
Datasets
使用了四种:AG News
;DBPedia
;IMDB
;Amazon
;
实验效果图如下:
BERT w. simple match
情况是这样:句子只要含有标签名称的相近词,就认为当前句子是对应的标签类别,以此进行训练。
LOTClass w/o. self train
是代表LOTClass
只走前两步骤,不进行自训练。
从图中可以看到,如果不进行sefl-training
,LOTClass
效果在所有数据集上效果也都不错。
使用了sefl-training
之后,LOTClass
可以和半监督和监督模型结果媲美。
有一个问题,LOTClass
这种方法,相当于在使用Bert的情况下,标注了多少数据?
作者做了一个实验图,如下图:
从效果图可以看到,LOTClass
的效果和Bert在每个类别有48个标注数据的情况下训练的效果相当。
我大概算了一下,AG News
有4个类别,每个类别48个,也就是总共192个标注样本。
这个论文我比较感兴趣的是第一个步骤,获取标签名称的相近词汇。
针对这个步骤,做两个方面的修改:
-
修改标签词汇:分别使用
commerce
;economy
;business
作为label name;标签的名称虽然变化了,但是每个标签名称得到的100个相近词汇表有一半是重复的,另一半的词汇表意思都很类似。这说明,这个方法是有鲁棒性的。不会出现,标签名称换了一个相近的名字表示,而得到的词汇表出现了剧烈的抖动。
-
分别使用300维度的
Glove
和LOTClass
获取标签名称相近词汇,GLove得到的词汇非常的贫乏,而LOTClass
效果很好,模型具有很好的泛化性;
这个思路也给自己赞个思路,获取同义词或者近义词可以使用这种方法。
说一下自己学到的东西。
其实看到细节1的时候,LOTClass
方法得到的模型表现相当于使用192个标注数据对Bert进行监督训练。
从这里来看,标注的成本并不大;不过,应该可以使用此方法为半监督积累数据。
这个方法还不成熟,不过里面有些思路可以积攒。