香侬读 | 自训练 + 预训练 = 更好的天然语言理解模型 - 知乎

论文标题:Self-training Improves Pre-training for Natural Language Understanding数据库

论文做者:Jingfei Du, Edouard Grave, Beliz Gunel, Vishrav Chaudhary, Onur Celebi, Michael Auli, Ves Stoyanov, Alexis Conneau框架

论文连接https://arxiv.org/abs/2010.02194dom

预训练(Pre-training)模型自BERT问世以来就一发不可收拾,目前已经在天然语言理解和生成两个方面取得了突破性成就。可是,做为它的一个“兄弟”,自训练(Self-training)却不多在天然语言处理中露脸。本文探究了预训练之上的自训练方法,从大规模语料中先抽取领域内数据,再用一个Teacher模型生成伪监督数据用于训练Student模型,这样就能大幅提高单纯基于预训练模型的效果。自训练的有效性在必定程度上代表了它与预训练是互补的,两者结合能带来全新表现。

自训练与预训练

预训练(Pre-training)从广义上来说,是指先在较大规模的数据上对模型训练一波,而后再在具体的下游任务数据中微调。大多数状况下,预训练的含义都比较狭窄:在大规模无标注语料上,用自监督的方式训练模型。这里的自监督方法通常指的是语言模型。学习

除了预训练以外,咱们还常常在图像领域看到它的一个兄弟,自训练(Self-training)。自训练是说有一个Teacher模型f_T和一个Student模型f_S,首先在标注数据上训练f_T,而后用它对大规模无标注数据进行标注,把获得的结果当作伪标注数据去训练f_S测试

显然,预训练和自训练都用到了大规模无标注的数据,只是两者的处理过程不一样。并且,其中很是重要的一点是,预训练始终对针对一个模型进行操做,而自训练却用到了两个模型,前者是直接从无标注数据中学习,然后者是间接地从数据中学习。它们的区别能够用下图表示:编码

那么,一个天然的问题是:这两个方法能够结合起来达到更好的效果吗?本文给出了答案:固然能够!首先预训练一个模型,而后把这个模型在标注数据上训练后当作f_T,再用它去标注另一批无标注数据,把获得的伪标注数据用来训练f_S,最后在推理测试的时候使用f_S便可。从这个过程当中能够发现,预训练是为了更好地自训练,自训练是为了更好地训练f_S,两者结合,缺一不可。spa

总之,本文有以下的贡献:翻译

  • 结合自训练与预训练,比单纯的预训练取得了大幅度的效果提高;
  • 为了使伪标注数据更加契合下游的具体任务,提出了SentAugment,一种特定领域的数据抽取方法,减小通用语料形成的噪声干扰;
  • 在知识蒸馏和小样本学习任务上也取得了突出的结果,证实自训练+预训练的优越性。

自训练处理流程

本文所提出的方法能够用下面的图表示,大致分为四步:orm

  1. 将一个预训练模型(本文使用RoBERTa_Large)在标注数据上训练,做为教师模型f_T
  2. 使用f_T从海量通用语料中提取相关领域的数据;
  3. f_T对提取的数据做标注;
  4. 用伪标注语料训练学生模型f_S

其中的1,3,4步都是肯定的,因此咱们重点关注如何使用f_T从海量通用语料库D中抽取出领域相关的语料D'blog

句子编码

通用语料库D来自Common-Crawl,直接把文档切分为句子,而后以句子为基本单位进行数据提取。本文使用句子编码方法,用一个编码向量去表示每个句子。这个句子编码器在多个复述(Paraphrase)数据集上训练,而且还使用了BERT的掩码语言模型在多语言语料上训练,以后就能够用于编码每一个句子,获得各自对应的特征向量。在后文中,咱们默认使用Transformer编码器。

任务编码

句子编码只能表示通用语料库D中每一个句子s的含义,还不能区分哪些句子是符合领域要求的,这就须要用一个特殊的任务编码,做为查询条件去表示咱们想要的句子是怎样的,也就是说,只须要计算句子编码和任务编码的余弦值,就知道这个句子是否是符合要求。为此,考虑三种任务编码:

  • All-Average: 将训练f_T所用的全部句子编码平均起来做为任务编码;
  • Label-Average: 将训练f_T所用的每一个类别的全部句子编码平均起来做为各个类别的任务编码;
  • Per-Sentence:将训练f_T所用的每一个句子都做为一个单独的任务编码。

相关领域数据提取

在获取任务编码后,就能够把它(们)做为询问,根据余弦值大小,从通用语料库中抽取相关的句子,这能够减小通用语料对下游特定任务的噪声干扰。对于每一个类别,只抽取Top-K个句子,而且对提取的句子,还要知足f_T能取得较高的置信度。

提取了相关领域的数据后,用f_T对其中每个句子x预测它的标签是什么:y=f_T(x),获得其软标签或者one-hot硬标签,这取决于训练f_S的方法是什么。但不管如何,到此为止咱们都获得了一个伪标注数据库D'=\{(x,y)\}

用伪标注语料训练f_S

在获得伪标注语料D'后,就能够用它去训练f_S了。为此,咱们考虑三种训练方法:

  • 自训练(Self-Training):将另外一个预训练的RoBERTa_Large做为f_S,使用one-hot硬标签在D'上训练;
  • 知识蒸馏(Knowledge-Distillation):将一个预训练的RoBERTa_Small做为f_S,使用软标签在D'上训练;
  • 少样本学习(Few-Shot):训练f_T所使用的标注数据是少样本,伪标注语料的大小是标注数据的2~3个数量级,f_S是RoBERTa_Large,使用one-hot硬标签在D'+D上训练。

实验

根据上述训练f_S的不一样方法,咱们依次来探究在不一样训练设置下,自训练是否能进一步提升预训练的效果。数据集包括SST-2,SST-3,CR,IMP,TREC,CoNLL2002,除了最后一个是命名实体识别任务以外,其余都是分类任务。

自训练

下图是在自训练设置下的实验结果,ICP是In-domain Continued Pretraining,即直接在D'上预训练而不使用f_T预测获得的标签,ST是Self-Training自训练。能够看到,尽管都是在相关领域的数据D'上训练,ICP因为没有使用f_T的预测标签,反而使得效果降低(-1.2),而ST则能进一步提高预训练模型的效果(+1.2),这说明没有伪标注数据,单纯的预训练不能很好地实现领域知识迁移,还要借助标注数据

少样本学习与知识蒸馏

下图是少样本学习的实验结果。能够看到,领域内自训练能够大幅提高少样本场景下的效果

下图是知识蒸馏的实验结果。GT表示用真值(Ground-Truth)数据,RD是用随机(Random)数据,SA(SentAugment)是用本文的方法获得的数据。在和训练集同样大的状况下,GT和SA都显著超过了RD,但若是再额外增长100K句子,SA甚至能逼近有监督学习RoBERTa_Large的结果,而且参数量是它的十分之一。这说明,对知识蒸馏来讲,自训练带来的数据增广也是很重要的

句子编码的影响

前面咱们提到咱们默认使用的是Transformer去编码句子,那么不一样的编码器会有怎样的影响呢?下图是不一样编码器在STS数据集上的实验结果。总的来讲,单纯使用BERT获得的句子编码效果最差,而使用Trigram甚至能获得很好的结果,这说明了复述与多语言掩码语言模型任务对于训练句子编码是颇有帮助的

一个例子

最后咱们来看看从D中抽取的句子是怎样的,以下图所示。若是是用Per-Sentence,那么抽取的句子就基本上是询问的转述;若是是用Label-Average,抽取的句子就符合该类别。基于句子编码与任务编码的抽取方法有能力获得知足条件的句子

小结

本文研究了预训练模型上的自训练带来的效果增益。使用自训练学习框架,模型可以从海量通用语料中抽取出相关领域的句子,而后使用教师模型预测标签获得伪标注数据,最后再去训练学生模型。不管是自训练自己,仍是知识蒸馏、少样本学习,预训练+自训练都能取得显著的效果提高。

值得注意的是,本文的核心实际上是如何从海量通用语料中提取知足条件的语料,也即提出的SentAugment方法。在过去一年内,开放领域问答(Open-Domain Question Answering)大量使用了这种方法取提取问题的相关段落,并取得了成功。这些工做代表:基于句子编码的语料提取、标注,是数据增广的有效手段,能够进一步用在天然语言生成任务,如机器翻译、摘要生成等任务上

相关文章
相关标签/搜索