预训练通常指的是在一个大规模数据集上对模型进行初步训练,然后再在特定任务的数据集上进行微调。预训练通常采用自监督的方式,比如通过语言模型对无标注文本进行训练。自训练则是利用一个教师模型对无标注数据进行预测,然后使用这些预测结果作为伪标签,进一步训练学生模型。这两种方法都利用了大量的无标注数据,但处理过程有所不同。预训练主要针对单一模型,而自训练则需要两个模型协作:教师模型负责预测伪标签,学生模型则根据这些标签进行训练。
那么,是否可以将这两种方法结合起来以取得更好的效果呢?答案是肯定的。首先通过预训练得到一个初始模型,然后在标注数据上进行训练以生成教师模型,接着用这个教师模型对无标注数据进行预测,从而生成伪标签,最后用这些伪标签训练学生模型。这种方法不仅提升了模型的性能,还保证了两者之间的互补性。
本文结合了自训练和预训练两种方法,取得了显著的效果提升。具体贡献如下: - 结合自训练和预训练,相较于单纯预训练,模型性能大幅提升; - 提出了SentAugment方法,这是一种特定领域的数据抽取技术,有助于减少通用语料带来的噪声干扰; - 在知识蒸馏和少量样本学习任务中也取得了显著成果,证明了自训练加预训练方法的有效性。
本文提出的方法主要分为四个步骤: 1. 使用预训练模型(如RoBERTa_Large)在标注数据上进行训练,生成教师模型; 2. 利用从通用语料库中提取的相关领域数据; 3. 使用教师模型对提取的数据进行标注; 4. 使用伪标签数据训练学生模型。
本文重点讨论了如何从海量通用语料库中提取与特定任务相关的数据。
通用语料库D来自Common-Crawl,将文档分割成句子,并以句子为基本单位进行数据提取。本文采用句子编码方法,通过一个编码器将每个句子转换为特征向量。这个句子编码器在多个复述数据集上进行了训练,并在多语言语料上使用BERT的掩码语言模型进行了进一步训练。这样得到的句子编码可用于后续的任务。
任务编码用于区分哪些句子符合特定任务的要求。为此,本文考虑了三种任务编码方法: - All-Average:将所有句子编码的平均值作为任务编码; - Label-Average:将每个类别的句子编码平均值作为任务编码; - Per-Sentence:将每个句子作为独立的任务编码。
在获取任务编码后,可以将其作为查询条件,从通用语料库中抽取相关的句子。为了减少通用语料对下游任务的噪声干扰,本文仅抽取与任务最相关的Top-K个句子。此外,还需要确保抽取的句子能够获得较高的置信度。
提取了相关领域数据后,使用教师模型对这些句子进行预测,得到软标签或硬标签,最终形成一个伪标签数据集。
在获得伪标签数据后,可以通过以下三种方法进行训练: - 自训练:使用另一个预训练的RoBERTaLarge模型,在伪标签数据上进行训练; - 知识蒸馏:使用一个预训练的RoBERTaSmall模型,在伪标签数据上进行训练; - 少样本学习:在少量标注数据和大量伪标签数据上进行训练。
根据不同的训练方法,我们在多个数据集上进行了实验,包括SST-2、SST-3、CR、IMP、TREC、CoNLL2002等。实验结果显示,尽管都在相关领域数据上训练,但使用伪标签数据的自训练方法(+1.2)优于直接预训练(-1.2)。这表明自训练能够有效提升预训练模型的性能。
在少样本学习中,自训练同样表现优异。而在知识蒸馏实验中,使用本文方法(SentAugment)生成的伪标签数据优于随机数据。此外,当伪标签数据量增加时,SentAugment方法甚至接近于有监督学习的效果,且所需参数量更少。
本文默认使用Transformer编码器进行句子编码。不同编码器的表现有所不同,但总体而言,基于复述和多语言掩码语言模型的句子编码效果最佳。
本文展示了从通用语料库中抽取的句子示例。使用Per-Sentence方法,抽取的句子通常是原始问题的变体;而使用Label-Average方法,则能抽取到符合特定类别的句子。这些方法有效地筛选出了符合条件的句子。
本文探讨了预训练模型上的自训练带来的效果增益。通过自训练学习框架,模型可以从海量通用语料中抽取出相关领域的句子,然后使用教师模型预测标签,生成伪标签数据,最后用这些伪标签数据训练学生模型。无论是自训练本身,还是知识蒸馏和少样本学习,预训练加自训练的方法均能显著提升模型性能。特别值得注意的是,本文的核心在于如何从海量通用语料中提取满足条件的语料,即SentAugment方法。这种方法在开放领域问答等任务中已经取得了成功,并有望进一步应用于自然语言生成任务中。