RoFormerV2:自然语言理解的极限探索
By 苏剑林 | 2022-03-21 | 67718位读者 |大概在1年前,我们提出了旋转位置编码(RoPE),并发布了对应的预训练模型RoFormer。随着时间的推移,RoFormer非常幸运地得到了越来越多的关注和认可,比如EleutherAI新发布的60亿和200亿参数的GPT模型中就用上了RoPE位置编码,Google新提出的FLASH模型论文中则明确指出了RoPE对Transformer效果有明显的提升作用。
与此同时,我们也一直在尝试继续加强RoFormer模型,试图让RoFormer的性能“更上一层楼”。经过近半年的努力,我们自认为取得了还不错的成果,因此将其作为“RoFormerV2”正式发布:
极限探索 #
在预训练模型兴起之后,不少研究人员都对一个问题相当感兴趣:预训练模型的极限在哪里?当然,“极限”这个词含义很丰富,以GPT3为代表的一系列工作试图探索的是参数量、数据量的极限,而微软近来提出的DeepNet则探究的是深度的极限。对于我们来说,我们更想知道同一参数量下的性能极限,试图最充分地“压榨”预训练模型的性能,RoFormerV2正是这一理念的产物。
简单来说,RoFormerV2先在RoFormer的基础上对模型结构做了适当的简化,从而获得了一定的速度提升。训练方面,除了进行常规的无监督MLM预训练外,我们还收集了20多G的标注数据,进行了有监督的多任务预训练。在有监督式训练之下,模型效果获得了长足的提升,基本上实现了同一参数量下速度和效果的最优解。
特别地,3亿参数量的RoFormer large,在CLUE榜单上超过了若干10亿+参数量的模型,做到了第5名,它也是榜上前5名中参数量最少的模型:
模型介绍 #
相比RoFormer,RoFormerV2的主要改动是简化模型结构、增加训练数据以及加入有监督训练,这些改动能让RoFormerV2最终取得了速度和效果的“双赢”。
结构的简化 #
在结构上,RoFormerV2主要去掉了模型的所有Bias项,以及Layer Norm换成了简单的RMS Norm,并且去掉了RMS Norm的gamma参数。这些改动的灵感主要来自Google的T5模型。
大家的潜意识里可能会觉得Bias项以及Layer Norm的beta和gamma参数计算量都很小,至少对速度来说是无关痛痒的。但事实出乎我们的意料:去掉这些看似“无关痛痒”的参数外,RoFormerV2的训练速度获得了明显的提升!
一些参考数据如下(RoFormer和RoBERTa速度接近,就不列出来了,base版的测试显卡为3090,large版的测试显卡为A100):
序列长度训练速度序列长度训练速度RoBERTa base1281.0x5121.0xRoFormerV2 base1281.3x5121.2xRoBERTa large1281.0x5121.0xRoFormerV2 large1281.3x5121.2x
无监督训练 #
同RoFormer一样,RoFormerV2也是先通过MLM任务进行无监督预训练,不同的地方主要有两点:
1、RoFormer是在RoBERTa权重基础上进行训练,RoFormerV2是从零训练;
2、RoFormer的无监督训练只有30多G数据,RoFormerV2则用到了280G数据。
从零训练相比于在已有权重基础上继续训练会更加困难,主要体现在Post Norm结构更难收敛。为此,我们提出了一种新的训练技术:将残差设计为
xt+1=Norm(xt+αF(xt))
其中α初始化为0并线性地缓慢增加到1,相关讨论还可以参考《浅谈Transformer的初始化、参数化与标准化》。该方案跟ReZero相似,不同的是ReZero中α是可训练参数且去掉Norm操作,而实验显示我们的改动相比ReZero的最终效果更好,几乎是DeepNet之前的最优解。
多任务训练 #
前面提到RoFormerV2的结构有所简化以获得速度的提升,但由于“没有免费的午餐”,同样的训练设置之下RoFormerV2相比RoBERTa、RoFormer的效果会有轻微下降。为了弥补回这部分下降的效果,更有效地挖掘模型潜力,我们补充了有监督式的多任务预训练。
具体来说,我们收集了77个共计20G的标注数据集,构建了92个任务进行多任务训练,这些数据集涵盖文本分类、文本匹配、阅读理解、信息抽取、指代消解等常见自然语言理解任务,以求模型能获得比较全面的自然语言理解能力。为了完成训练,我们在bert4keras基础上进一步开发了一个多任务训练框架,灵活支持不同格式的任务进行混合训练,并整合了梯度归一化等技术(参考《多任务学习漫谈(二):行梯度之事》)来确保每个任务都达到尽可能优的效果。
RoFormerV2并不是第一个尝试多任务预训练的模型,在它之前有MT-DNN、T5以及前段时间的ZeroPrompt都已经肯定过多任务预训练的价值,而我们主要是在中文上进行了充分的验证并首先进行了开源。
实验结果 #
我们主要在CLUE榜单上对比效果:
iflytektnewsafqmccmnliocnliwsccslcmrc2018c3chidcluenerBERT base61.1956.2973.3779.3771.7373.8584.0372.1061.3385.1378.68RoBERTa base61.1258.3573.6180.8174.2782.2885.3375.4067.1186.0479.38RoBERTa large60.5855.5175.1482.1675.4781.9785.0778.8576.7488.6580.19RoFormer base61.0856.7473.8280.9773.1080.5784.9373.5066.2986.3079.69RoFormerV2 small60.4651.4672.3976.9367.7069.1183.0071.8064.4977.3578.20RoFormerV2 base62.5058.7475.6380.6274.2382.7184.1777.0075.5785.9579.87RoFormerV2 large62.6558.0676.9581.2075.8388.0384.9780.5078.3487.6880.17
可以看到,多任务训练的提升是相当可观的,在大多数任务上RoFormerV2不仅“追回”了结构简化带来的效果差距,还有一定的提升,平均来说算得上达到了同级模型的最优效果。另外,CMNLI和CHID两个任务上,RoFormerV2都不如RoBERTa,这是因为这两个任务都训练数据都非常多(数十万级别),当训练数据量足够大时,模型的效果主要取决于模型的容量,多任务训练带来的提升比较小。
所以,总的来说就是:如果你的任务类型比较常规,数据量不是特别大,那么RoFormerV2往往是一个不错的选择;如果你希望加快一点训练速度,那么也可以选择RoFormerV2;但如果你的任务数据量特别大,那么RoFormerV2通常不会有优势。
本文小结 #
本文主要对我们新发布的RoFormerV2模型做了基本的介绍,它主要通过结构的简化来提升速度,并通过无监督预训练和有监督预训练的结合来提升效果,从而达到了速度与效果的“双赢”。
转载到请包括本文地址:https://spaces.ac.cn/archives/8998
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 21, 2022). 《RoFormerV2:自然语言理解的极限探索 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/8998
@online{kexuefm-8998,
title={RoFormerV2:自然语言理解的极限探索},
author={苏剑林},
year={2022},
month={Mar},
url={\url{https://spaces.ac.cn/archives/8998}},
}
March 21st, 2022
赞
March 21st, 2022
苏神是怎么做到公式随便推导的,厉害~
谢谢。但这篇文章似乎没有什么公式吧哈?
这篇里没有,但是里面的链接文章里有
March 22nd, 2022
感谢!RoFormer系列拯救了我们的FAQ
RoFormer表示很荣幸。
也拯救了我+1,感谢苏神
April 1st, 2022
苏神,有没有指代消解的语料
April 15th, 2022
恭喜苏神喜提A100!
August 10th, 2022
苏神你好,问下多任务预训练的一些细节能否多讲解一下。 比如一些loss的设计,另外苏神选择的是哪种方式,比如每个任务依次训练,然后用梯度累计方式达成多任务优化,还是说用混合训练? 麻烦苏神介绍下, 感谢!
PS:多任务预训练的code开源时间节点确定了吗,感谢
每个任务单独一个脚本,原来用什么loss就用什么loss(比如分类用交叉熵、回归用mse等),每步随机选一个任务的一个batch计算梯度,然后梯度累积。
代码参考:https://github.com/ZhuiyiTechnology/roformer-v2/tree/main/multi-task
收到,多谢苏神! 我先学习一下代码的实现,万分感谢!
August 10th, 2022
同问shomy的问题,感谢
September 23rd, 2022
请问结果表中的bert和roberta是否也是在进行多任务训练之后的结果呢
不是,bert和roberta就是开源的模型。表格比较的是几个开源模型之间的效果差异,而非几种模型架构的优异。
February 14th, 2023
利用多任务有标注数据训练是否和prompt有异曲同工之妙
结合prompt的预训练确实是一种多任务的实现方式。
August 15th, 2023
你好,请问无监督训练对post norm处理的这部分代码具体在哪儿呢?在Bert4Keras中好像没有看到?