Skip to content

Latest commit

 

History

History
178 lines (90 loc) · 9.1 KB

只使用标签名称就可以文本分类.md

File metadata and controls

178 lines (90 loc) · 9.1 KB

没有标注数据不用怕,只用标签名称就可以文本分类!韩家炜组出品

对于实际的文本分类需求,没有标注数据是一件很常见的事情。

针对这种情况,有一个最朴素的思路可以做:

  1. 首先,根据对应的标签名称,使用W2C找到对应的相近词
  2. 通过相近词,对文本数据做关键词命中,进而映射到对应的类别
  3. 使用上述的标注数据训练文本分类模型
  4. 使用3步骤的文本分类模型对新数据预测,获得置信度高的文本,之后做半监督。

上面这个思路,非常的简陋,最终的结果也不会很好。实际工作中,需要有大量的规则去补充。

今天分享的这个论文【Text Classification Using Label Names Only: A Language Model Self-Training Approach】,来自韩家炜组。

针对上面的场景,这个论文给出了一个思路。

整个论文读下来,先给个简单的评价,思路不错,但是也并不成熟,不过其中有很多细节点可以让我学习到。

1. 背景

人们在对一个文本分类的时候,不会看到任何带标签的标注数据,而只是通过一些关于描述分类类别的单词,就可以做出判断。

举个例子,人去对文本进行分类的时候,假如文本有一个类别属于计算机。脑海中其实是有先验知识,比如如果句子中出现人工智能深度学习NLP等词汇的时候,人们基于此可以很大概率的判断出当前这个文本是属于计算机这个类别。

随后呢,注意上面只是说的是很大的概率,还会出现苹果属于科技类别,但是不属于水果这个类别,也就是单单第一步还会出现语义歧义的错误,所以人们还会通读一遍句子,根据上下文语义再对句子分类。

作者类比这个思路,提出了三个步骤:

(1)找到和标签名称语义相关性较高的词汇;

(2)查找类别指示性单词并基于这些单词训练单词分类模型

(3)自训练提升模型

2. 步骤

2.1 Category Understanding via Label Name Replacement

直译过来就是通过标签名称替换理解类别。

这句话直译过来的话可能不好理解,更好的表述是找到与标签名称语义相关性较高的词汇。

就像我们上面说的,人们在看到标签名称的时候,会联想到很多与之相关的词汇。

类别到NLP中,预训练模型其实就相当于模型的先验知识,可以从中知道标签名称的相近词汇。

我们知道,Bert 训练的时候是这样的:mask掉一部分词汇,然后通过语言模型预测mask部分的输出,计算损失函数;

现在我当前输入是人工智能(为了方便理解,我们可以认为输入它是一个词作为整体输入),那么输出的时候其实是在整个词汇表上做softmax;

基于此,从中挑选出概率最大的50个词汇,也就是当前这个位置最有可能出现的50个单词。

进一步的,因为包含人工智能这个词的肯定不只是一个句子,我们对每个句子中的人工智能做同样的操作,然后都获取对应的前50个词汇。

最后把这所有的50个词汇累积起来,按照频率从大到小,选取前100个词汇,作为可以替换人工智能这个标签名称的相近词汇。

这个思路,简单来说,就是从预训练模型Bert获取标签名称的近义词或者更准确的说是获取与标签相关词汇的过程。

其实,看到这里,我想到了一点,就是这个过程和我们使用GLove或者Word2Vec获取近似词的过程很相似。

只不过Bert是一个动态的权重,受上下文影响,所以获得结果更加的准确,泛化性也更强。

在论文,作者也做了实验论证这个道理。

这一步,我们得到的结果是类似这种:

label_change

简单总结一下:

两个步骤:

  1. 找到每个句子中存在的标签名字,使用Bert预训练模型,找到与之最接近的50个单词。
  2. 每个标签中所有单词汇总,按照频率,找出排在前100个单词,作为当前标签名称(Label Name)的类别词汇(category vocabulary/category indicative words

2.2 word-level classification via masked category prediction

这个步骤,简单来说是使用Bert这类的预训练模型在单词这个级别训练分类模型。

上个步骤中,针对每个Label Name,我们会得到对应的category vocabulary/category indicative words

这个时候一个最简单的办法,就是只要当前的句子出现了category vocabulary中的词汇,我们就认为当前的句子属于相对应的Label Name

也就是我们开头说到的关键词命中规则。

但是这样做是有很大问题的。

首先,我们知道每个单词的词汇意义是与语境有关系的。一个句子出现苹果这样的单词,你很难武断的认为这个句子是属于科技还是水果

其次,我们得到的每个Label Namecategory vocabulary都是有数量限制的。有的单词其实也能表达当前Label Name的含义,但是并未包含在category vocabulary中。

为了缓解这两个问题,作者提出了Masked Category Prediction (MCP)任务;

简单讲,它分为两个步骤:

  1. 针对句子中的每个单词,使用Bert这种预训练模型,找到与之最近接的前50个相关词汇(很类似第一大步骤的第一小步骤);然后将这50个相关和每个标签的category vocabulary进行比较,当交集超过20个时候,此时这个句子中的这个单词对应的类别就是对应的这个Label Name
  2. 句子经过第一个步骤之后,句子中的部分单词就有了类别。那么mask掉这些单词,然后Bert相对应的每一个单词尾端接一个分类器对当前单词做类别的分类。

整体流程,如下图:

 Masked Category Prediction

2.3 self-training on unlabeled corpus for generalization

经过第二个步骤,当前模型仍然存在问题:

  1. 有的句子没有被找到有类别的单词,所以这些没有被训练到
  2. 训练到文本分类模型使用的是对应类别单词mask那里的输出,而不是cls。而ClS一般可以看到整个句子的全部信息。

针对这两个问题,作者提出使用全部的无标签数据,进行自训练。

这一块我自己知识积累的不多,就不多说了。具体的大家可以去看一下论文。

3. 模型架构总结

整体的算法流程如下图所示:

LOTClass_train_流程图

4. 实验结果分析

Datasets使用了四种:AG News;DBPedia;IMDB;Amazon

实验效果图如下:

LOTClass各大模型实验效果图

BERT w. simple match情况是这样:句子只要含有标签名称的相近词,就认为当前句子是对应的标签类别,以此进行训练。

LOTClass w/o. self train是代表LOTClass只走前两步骤,不进行自训练。

从图中可以看到,如果不进行sefl-trainingLOTClass效果在所有数据集上效果也都不错。

使用了sefl-training之后,LOTClass 可以和半监督和监督模型结果媲美。

4.1 细节1

有一个问题,LOTClass这种方法,相当于在使用Bert的情况下,标注了多少数据?

作者做了一个实验图,如下图:

SUPER-BERT

从效果图可以看到,LOTClass的效果和Bert在每个类别有48个标注数据的情况下训练的效果相当。

我大概算了一下,AG News有4个类别,每个类别48个,也就是总共192个标注样本。

4.2 细节2

这个论文我比较感兴趣的是第一个步骤,获取标签名称的相近词汇。

针对这个步骤,做两个方面的修改:

  1. 修改标签词汇:分别使用commerce;economy;business作为label name;标签的名称虽然变化了,但是每个标签名称得到的100个相近词汇表有一半是重复的,另一半的词汇表意思都很类似。

    这说明,这个方法是有鲁棒性的。不会出现,标签名称换了一个相近的名字表示,而得到的词汇表出现了剧烈的抖动。

  2. 分别使用300维度的GloveLOTClass获取标签名称相近词汇,GLove得到的词汇非常的贫乏,而LOTClass效果很好,模型具有很好的泛化性;

这个思路也给自己赞个思路,获取同义词或者近义词可以使用这种方法。

5. 简单总结

说一下自己学到的东西。

其实看到细节1的时候,LOTClass方法得到的模型表现相当于使用192个标注数据对Bert进行监督训练。

从这里来看,标注的成本并不大;不过,应该可以使用此方法为半监督积累数据。

这个方法还不成熟,不过里面有些思路可以积攒。