作者 | 周俊贤 整理 | NewBeeNLP
大家在用BERT等预训练模型的时候,是否有根据具体的下游任务,再进行领域的预训练?可能很多朋友是直接进行fine tuning的,毕竟增加多预训练这一步略显麻烦。
今天分享的这篇论文,用更多的实验,来论证,
- 适应领域的预训练(DAP),无论在低资源和高资源的情况下,都能提高模型在相应领域具体任务的性能;
- 适应任务的预训练(TAP),虽然语料较少,但缺能十分「高效」地提高模型在具体任务的性能,应该尽可能找更多任务相关的语料继续进行预训练;
- 提高一种从领域语料采样任务语料的方法;
- 先进行DAP,再进行TAP能极大地提高模型在具体任务的性能。
- 论文全称及链接:《Don't Stop Pretraining: Adapt Language Models to Domains and Tasks》
- 项目地址:https://github.com/allenai/dont-stop-pretraining
具体的,作者选择了四个领域,包括生物医学(BIOMED)、计算机科学(CS)、新闻(NEWS)和评论(REVIEWS)。
每个领域各选择了两个分类任务。如下图所示
适应领域的预训练(DAP)
怎么定义领域语料?
举个例子,假如我们在做一个提取蛋白质和化学物质的实体抽取任务,那可以定义相关领域为医学,则医学相关的语料都是该领域的语料。
实验中,作者采用的是「RoBERTa模型继续针对4个领域语料继续进行预训练,得到4个领域的预训练模型」。
首先,怎么衡量这四个领域语料和原生RoBERTa的预训练语料有多大差别,作者采用了研究不同领域语料的前10K个高频单词,如下图所示
从图可以,看到RoBERTa的预训练语料和NEWS、REVIEWS语料重合度比较高,和CS和BIOMED的重合度比较低。
实验很简单,就是各任务用各领域的语料再继续预训练一定步数后,再进行fine tuning,实验结果如下图所示,DAPT就是用RoBERTa在各个领域的语料继续预训练后,再针对该领域的具体任务进行fine tuning,可以看到DAPT的结果都要比直接用RoBERTa进行fine tuning效果要好。而且当RoBERTa的训练语料和领域的语料分布越大的时候,DAPT带来的提升更加的明显。
为了论证,「效果的提升并非是单单预训练模型时用了更多的数据」,作者还做多了一种实验,即用「非该任务的预训练模型进行fine tuning」,如对CS领域继续进行预训练,再应用于NEWS领域的下游任务,可以看到这样做,比原生的RoBERTa直接进行fine funing效果多要差。
因此,作者的结论是,「适应领域的预训练能提高下游任务的性能,千万不能用与任务领域无关的语料!」
任务领域的预训练(TAP)
通常来说,具体的下游任务相对于领域,是更细的分类,如论文里面的 CHEMPROT任务 是提取化学物质和蛋白质的关系,很明显,是属于生物医学领域里面的细分领域。
很自然的想法,「用任务相关的语料继续进行预训练,相对于用领域的语料继续预训练,能更直接地提升模型的效果」。
具体的,实验直接用任务的有标注样本进行TAP,通常情况下,任务语料比领域语料要少得多,例如一个分类比赛,可能任务领域的数据就是公布的训练集和测试机的几千条样本。
实验结果如下图所示,TAPA都能增强模型在具体任务中的性能。DAPT TAPT指先对领域语料继续预训练,再对任务语料继续预训练,是效果最佳的。
除此之外,作者还做了Transfer-TAPT的实验,即对同一领域不同任务的语料继续预训练,如下图左上,RCT和CHEMPROT都是BIOMED领域的任务,模型对RCT语料进行TAPA,再应用到CHEMPROT中,效果比对CHEMPROT进行TAPA,再直接应用到CHEMPROT任务中,效果足足下降了2.2个点。因此也论证了,继续对任务语料进行预训练十分重要。
从领域语料中挑选更多的任务语料
Human Curated-TAPA
有时候,我们能得到有标注的任务数据,还能得到无标注的大量任务数据。如上图的HYPERPARITISAN和IMDB除了有标注labeled的训练数据外,还有无标注unlabeled的训练数据,无论是否有标注,在预训练阶段,都成为任务语料,称作Curated-TAPA。
很明显的,越多的任务语料进行任务领域的预训练,应用到下游任务的效果越好,具体可看Curated-TAPA都比TAPA效果要好,因为Curated-TAPA比TAPA的任务语料要更多。
Automated Data Selection for TAPT
通常领域语料是很大的,例如论文里的四个领域语料,都超过10G的大小。而任务语料要小得多。「而使用任务的预训练比适应任务的预训练提升效果要直接得多,就是性价比更高」,例如在具体任务中需要提高性能5个点,可能需要领域语料20G,而任务语料达到同样的提升,可能只要几百M的任务语料。
所以一个自然的想法是,「能否从领域语料中挑选任务语料」?
具体的,论文提出了一种词袋模型的最近邻算法,思想非常简单,对于任务领域的每条样本,用词袋模型向量化表示,找领域语料中与其距离最近的k个样本,也纳进任务领域的预训练中,如下图所示
实验结果如下,
- RAND-TAPA就是随机从领域语料中采样出任务语料;
- 50NN-TAPA就是用k-邻近算法,且k取为50,即一条任务样本,从领域语料中挑选与它最接近的50个样本作为新加入的任务样本。
计算效率
任务领域的预训练相对于适应领域的预训练,「性价比更高」。
如下图,DAPT TAPT的f1值达到83.0,但足足用了47G的语料,而Curated-TAPA只用了27MB的语料,就能超过DAPT TAPT。
当然,有时候我们无法得到足够的任务语料,这时候,我们可以采用下面的k-最近邻的算法,从领域语料中采用任务语料,不失为性价比高的方法。
最后总结,论文里总结实验用过的方法
个人实验
这里拿疫情期间网民情绪识别这个比赛的数据来进行实验
- 比赛链接:https://www.datafountain.cn/competitions/423
- 比赛任务:根据疫情期间,微博网民发表的微博内容,判断该条内容是负面、中立、正面。
比赛数据:训练集一共有100K条标注数据,还有900K条非标注数据,明显的,这1000K条数据属于任务领域的数据,这里的100K就是TAPA数据,100K 900K=1000K就是Curated-TAPA数据。
用哈工大和科大讯飞发表的rbt3作为基础模型,用1000K条样本继续进行Curated-TAPA。具体的训练方法,可以参考这个教程https://github.com/zhusleep/pytorch_chinese_lm_pretrain以及huggingface transformers的example。
完成任务领域的预训练后,把100K有标注数据分成80K条训练数据、10K条验证数据、10K条测试数据。引入早停策略,假如模型在验证集连续两个epoch的f1值都没有下降,就停止训练,用最佳模型对测试集进行测试。挑选五个随机种子,实验结果如图所示,可以看到,效果能有少量的提升。
随机种子1 | 随机种子2 | 随机种子3 | 随机种子4 | 随机种子5 | 平均 | |
---|---|---|---|---|---|---|
rbt3 | 0.7486 | 0.7493 | 0.7487 | 0.7529 | 0.7425 | 0.7484 |
Curated-TAPA | 0.7502 | 0.7525 | 0.7562 | 0.7503 | 0.7522 | 0.75228 |
- END -