©PaperWeekly 原创 · 作者 | 苏剑林
单位 | 追一科技
研究方向 | NLP、神经网络
大概在 1 年前,我们提出了旋转位置编码(RoPE),并发布了对应的预训练模型 RoFormer [1]。随着时间的推移,RoFormer 非常幸运地得到了越来越多的关注和认可,比如 EleutherAI 新发布的 60亿 [2] 和 200亿 [3] 参数的 GPT 模型中就用上了 RoPE 位置编码,Google 新提出的 FLASH 模型论文中则明确指出了 RoPE 对 Transformer 效果有明显的提升作用。
与此同时,我们也一直在尝试继续加强 RoFormer 模型,试图让 RoFormer 的性能“更上一层楼”。经过近半年的努力,我们自认为取得了还不错的成果,因此将其作为“RoFormerV2”正式发布:
Github:
https://github.com/ZhuiyiTechnology/roformer-v2
极限探索
在预训练模型兴起之后,不少研究人员都对一个问题相当感兴趣:预训练模型的极限在哪里?当然,“极限”这个词含义很丰富,以 GPT3 为代表的一系列工作试图探索的是参数量、数据量的极限,而微软近来提出的 DeepNet 则探究的是深度的极限。对于我们来说,我们更想知道同一参数量下的性能极限,试图最充分地“压榨”预训练模型的性能,RoFormerV2 正是这一理念的产物。
简单来说,RoFormerV2 先在 RoFormer 的基础上对模型结构做了适当的简化,从而获得了一定的速度提升。训练方面,除了进行常规的无监督 MLM 预训练外,我们还收集了 20 多 G 的标注数据,进行了有监督的多任务预训练。在有监督式训练之下,模型效果获得了长足的提升,基本上实现了同一参数量下速度和效果的最优解。
特别地,3 亿参数量的 RoFormer large,在 CLUE 榜单 [4] 上超过了若干 10 亿 + 参数量的模型,做到了第 5 名,它也是榜上前5名中参数量最少的模型:
▲ RoFormerV2 large在CLUE上的“成绩单”
模型介绍
相比 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):
无监督训练
同 RoFormer 一样,RoFormerV2 也是先通过 MLM 任务进行无监督预训练,不同的地方主要有两点:
1. RoFormer 是在 RoBERTa 权重基础上进行训练,RoFormerV2 是从零训练;
2. RoFormer 的无监督训练只有 30 多 G 数据,RoFormerV2 则用到了 280G 数据。
从零训练相比于在已有权重基础上继续训练会更加困难,主要体现在 Post Norm 结构更难收敛。为此,我们提出了一种新的训练技术:将残差设计为
其中 初始化为 0 并线性地缓慢增加到 1,相关讨论还可以参考《浅谈 Transformer 的初始化、参数化与标准化》[5]。该方案跟 ReZero 相似,不同的是 ReZero 中 是可训练参数且去掉 操作,而实验显示我们的改动相比 ReZero 的最终效果更好,几乎是 DeepNet 之前的最优解。
多任务训练
前面提到 RoFormerV2 的结构有所简化以获得速度的提升,但由于“没有免费的午餐”,同样的训练设置之下 RoFormerV2 相比 RoBERTa、RoFormer 的效果会有轻微下降。为了弥补回这部分下降的效果,更有效地挖掘模型潜力,我们补充了有监督式的多任务预训练。
具体来说,我们收集了 77 个共计 20G 的标注数据集,构建了 92 个任务进行多任务训练,这些数据集涵盖文本分类、文本匹配、阅读理解、信息抽取、指代消解等常见自然语言理解任务,以求模型能获得比较全面的自然语言理解能力。为了完成训练,我们在 bert4keras 基础上进一步开发了一个多任务训练框架,灵活支持不同格式的任务进行混合训练,并整合了梯度归一化等技术(参考《多任务学习漫谈(二):行梯度之事》)来确保每个任务都达到尽可能优的效果。
RoFormerV2 并不是第一个尝试多任务预训练的模型,在它之前有 MT-DNN [6]、T5 [7] 以及前段时间的 ZeroPrompt [8] 都已经肯定过多任务预训练的价值,而我们主要是在中文上进行了充分的验证并首先进行了开源。
实验结果
我们主要在 CLUE 榜单上对比效果:
可以看到,多任务训练的提升是相当可观的,在大多数任务上 RoFormerV2 不仅“追回”了结构简化带来的效果差距,还有一定的提升,平均来说算得上达到了同级模型的最优效果。另外,CMNLI 和 CHID 两个任务上,RoFormerV2 都不如 RoBERTa,这是因为这两个任务都训练数据都非常多(数十万级别),当训练数据量足够大时,模型的效果主要取决于模型的容量,多任务训练带来的提升比较小。
所以,总的来说就是:如果你的任务类型比较常规,数据量不是特别大,那么 RoFormerV2 往往是一个不错的选择;如果你希望加快一点训练速度,那么也可以选择 RoFormerV2;但如果你的任务数据量特别大,那么 RoFormerV2 通常不会有优势。
本文小结
本文主要对我们新发布的 RoFormerV2 模型做了基本的介绍,它主要通过结构的简化来提升速度,并通过无监督预训练和有监督预训练的结合来提升效果,从而达到了速度与效果的“双赢”。
参考文献
[1] https://github.com/ZhuiyiTechnology/roformer
[2] https://github.com/kingoflolz/mesh-transformer-jax/#gpt-j-6b
[3] https://blog.eleuther.ai/announcing-20b/
[4] https://www.cluebenchmarks.com/rank.html
[5] https://kexue.fm/archives/8620
[6] https://arxiv.org/abs/1901.11504
[7] https://arxiv.org/abs/1910.10683
[8] https://arxiv.org/abs/2201.06910
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
·