近年来,自然语言处理中的预训练成为研究热点,大名鼎鼎的GPT-3也掀起了新浪潮。但众所周知,训练如此大规模的模型是非常耗费资源的:即使是在维基百科数据上训练一个简单的BERT-Base模型,也需要使用许多GPU进行1-2周的训练,更不用说购买GPU的成本了,光是电费就得好几万。这样的消费只有业内少数几家大公司才能做到,极高的门槛限制了相关方向的探索和全面发展。为了降低预训练的入门门槛,微软亚洲研究院机器学习组的研究人员从机器学习的不同角度提出了预训练不同环节的加速方法。具体来说,研究人员提出了一种新的基于Transformer的结构TUPE,为BERT设计了数据高效利用策略,并扩展了类似于人类学习的预训练任务。这些作业中的前两个已被新发布的ICLR2021接受。这些方法可以单独使用或组合使用以实现更大的加速。以前需要10天的培训,现在一天就可以完成!大家都知道基于Transformer的新结构TUPE(ICLR2021)PositionalEmbedding,但是这样的设计真的高效合理吗?由于Transformer在结构上无法识别来自不同位置的单词,因此该模型通常需要位置表示的辅助。最简单的方法是直接将位置表示添加到输入词向量中,但是将词向量和位置向量相加是正确的选择吗?词向量的加减可以保持语义,但是位置向量本身不具有语义。将两者相加会使模型更难学习吗?展开Transformer在第一层的attention分布(attentionweight)可以得到:从上面展开的公式可以发现两个问题:一是中间两项引入了词和位置信息的交集,但是没有理由是的就是说某个位置一定和某个词有很强的关系(论文中详细的实验分析也表明中间两项有一定的冗余)。其次,第一项和第四项分别计算词到词和位置到位置的关联,但它们使用相同的参数函数(W^Q和W^K),这限制了注意力的表达能力。为了解决以上两个问题,微软亚洲研究院的研究人员做了一些简单的改动:简单来说,去掉了位置(position)和文本(token)的交集,使用了不同的变换矩阵。需要注意的是,在多层Transformer模型中,例如BERT,上式的第二项在不同层之间共享。因此只需要计算一次,几乎不会引入额外的计算成本。图1:整体TUPE(TransformerwithUntiedPositionalEncoding)结构图2:实验结果此外,研究人员还对[CLS]token的位置进行了特殊处理,使其不会因为太多而忽略整个句子的信息关注当地。TUPE(TransformerwithUntiedPositionalEncoding)整体结构如图1所示,实验结果如图2所示,可以看出该方法不仅最终比baseline好很多,而且可以达到基线在1000k步的影响为30%(300k步)。有关TUPE的完整工作可在此处获取:https://openreview.net/forum?id=09-528y2Fgf高效数据利用:让BERT像人类一样记笔记(ICLR2021)longtails的分布,即大量的词在整个数据集中出现频率较低。这些低频词的词向量往往训练质量很差。这些低质量的词向量使得模型很难理解整个训练句子,进而拖慢了整个模型预训练的速度。例如,如图3所示,如果“COVID-19”是一个低频词,如果做完形填空题的人不知道它的意思,就很难填入正确的词。类似的问题也出现在自然语言预训练的过程中。图3:低频词示例微软亚洲研究院的研究人员因此提出了一种低频词和词的笔记方法TakingNotesontheFly(TNF),它记录了历史上稀有词的句子信息,使得当前模型再次看到低频词时,能够更充分地理解它。如图3所示,研究人员希望模型能够从注释“TheCOVID-19pandemicisanongoingglobalcrisis”(COVID-19isacontinuingglobalcrisis)中推断出“COVID-19”与生命有关,这样更容易理解得出上述完形填空问题答案的任务。具体来说,TNF维护一个注释字典。在这个笔记词典中,每个低频词都有一个上下文表示向量(Contextualrepresentation)作为一个笔记。当单词出现时,TNF从笔记词典中取出其上下文表示向量,与单词向量一起构成该位置模型的输入,同时更新笔记中单词的内容。如图4所示:图4:TNF训练过程研究人员将TNF应用到两种知名且有效的语言预训练方法BERT和ELECTRA上进行实验,同时也在GLUE上对预训练模型进行微调,然后进行比较.实验结果表明,在两种预训练方法上,当TNF达到与baseline相同的实验结果时,TNF的训练时间仅为baseline的40%(见图5)。图5:TNF的训练曲线。当使用与基线相同的迭代更新次数训练TNF时,TNF在GLUE上的平均GLUEScore以及在大多数子任务上的表现都超过了基线。TNF的完整工作请看:https://openreview.net/forum?id=lU5Rs_wCweN合理的预训练目标:BERT偏向于做ABCD选择题目前很多预训练模型使用masked语言模型任务,也就是覆盖Enter句子的一部分,让模型还原被遮挡的部分。这个任务其实就相当于一道“完形填空”问题,但与考试中常见的完形填空不同,自然语言预训练中的完形填空选项是整本词典。显然,即使是人类,在没有备选答案的情况下,也很难在开放的环境中准确地完成这个“完形填空”任务。图6:多项选择题事实上,人类更容易完成多项选择题或判断题。给定有限数量的选项,可以大大降低任务的难度。著名的“ELECTRA”模型使用判断题的任务。前期设计的判断题容易,所以训练效率很高。随着模型的训练,判断题的设计难度越来越大,而模型总能得到有效的反馈。与ELECTRA略有不同的是,微软亚洲研究院的研究人员将模型的预训练任务设计为ABCD选择题,并希望能够动态调整选择题的难度。在学习前期设计简单的选择题,让模型完成相对简单的任务,从而加快学习进程,后期逐渐增加任务难度,从而获得更精细化的结果。在这里你可以通过设计不同难度的任务和选项的数量来调整任务的难度(选项越多任务难度越大)。图7:使用元控制器进行预训练为了达到训练任务由易到难的效果,提出了一种能够生成问题的“元控制器”,它可以自适应地改变选择题的难度。特别是,这个元控制器是一个较小的BERT,它在屏蔽语言模型上进行了预训练,并与主模型一起进行了迭代训练。对于每个句子,首先将句子遮挡,然后元控制器将被遮挡的句子作为输入,输出与被遮挡的目标词相关的词例,这些词例将用于构建备选答案。图8:基于自适应多选任务的预训练实验结果。可以看出,在训练初期,元控制器的训练不够充分,因此生成的备选答案质量不高,主模型在这些简单的任务上表现良好。快速学习正确的知识。在训练的后期,元控制器的训练接近完成,可以生成高质量的候选答案,这样主模型就可以在这些困难的任务上进一步进化。将这个meta-controller应用到BERT上,可以发现,与原来的BERT相比,训练速度提升了80%,即在下游任务GLUE上,以20%的计算开销训练得到的模型可以是5倍于训练时间的BERT模型匹配。完整作品见:https://arxiv.org/abs/2006.05744
