导读本文将分享美团在预训练领域的一些工作。
(资料图)
文章主要分为三大部分:
1. 中文预训练大模型的探索
2. 提升中文预训练小模型的表现
3. 面向语义匹配场景的双塔模型优化
分享嘉宾|唐弘胤博士美团 算法专家
编辑整理|岳文浩 海信视像
出品社区|DataFun
01
中文预训练大模型的探索
1. 预训练语言模型已经成为 NLP 任务基石
从 2018 年 Google 发布 BERT 模型以来,国内外预训练研究机构在模型结构和参数规模上都做出了大量的探索。模型规模越来越大,下游任务的效果也持续提升,在某些特定任务上已经持平甚至超越人类水平。预训练模型已经成为 NLP 任务的基础,无论是研究,还是业务落地,都离不开预训练模型。
2. 大模型在 Benchmark 的表现
在中文自然语言处理领域,对预训练模型的评测可以参考中文语言理解测评基准 CLUE。可以看到,随着参数规模的加大,排行榜上的最好成绩接连被刷新。加大参数规模可以取得业务上的显著提升,已经成为了业内共识。
3. 美团 WenJin 模型
美团具有百亿级别参数的 WenJin 模型在6月提交时曾经登顶榜首。下面将详细介绍 WenJin 模型的实践。
(1)模型结构
目前的预训练模型基本都是基于 Transformer 结构,比较主流的模型结构有四种,分别是 encode-only 结构,代表模型是 BERT;decoder-only 结构,代表模型是 GPT;encoder-decoder 结构,代表模型有 T5、BART;共享参数的 encoder-decoder 结构,代表模型有清华提出的 GLM、微软的 UniLM。
BERT 适合做理解任务,GPT 更适合做生成任务。而我们的目标是构建一个能够同时处理理解和生成任务的通用模型。在考察了多个模型的表现后,决定采用 encoder-decoder 的架构,即以 T5 为代表的模型架构。
模型结构上,我们在 LayerNorm 上做了一些尝试。LayerNorm 是预训练过程中很重要的一个组成部分。BERT 使用的是 Post-LayerNorm 的结构,即将 LayerNorm 层放到 attention 和 FFN 层以后。研究人员发现,随着模型规模的扩大,Post-LayerNorm 存在训练不稳定的问题。于是产生了 Pre-LayerNorm 结构,将 LayerNorm 层放到 attention 层之前,这种结构的网络在训练过程中会比较稳定。同时,MSRA 今年提出了一种新的结构 DeepNorm,它在 Post-LayerNorm 基础上改进了初始化参数,并且添加了缩放因子,使得具备 1000 层 Transformer 的模型能够稳定训练。在我们的实验中,Pre-LayerNorm 和 DeepNorm 都可以做到稳定地训练。但是在下游的 CLUE 任务评测上,Pre-LayerNorm 的表现要稍稍优于 DeepNorm。所以我们的 WenJin 模型选用了 Pre-LayerNorm 的结构。
(2)预训练任务
在预训练任务上,我们参考了 T5 的 Span Corruption 任务。将输入文本的一系列连续 span 进行 mask,在输出端还原 mask 掉的原始文本。在选取 mask 时,需要确定 mask 的平均长度 u 和密度 r,使用不同的组合可以训练模型的不同能力。如上图所示,如果提高 r,可以把任务的难度加大;如果同时提高 u 和 r,可以使得模型具备生成长句子的能力,类似 GPT 语言模型。T5 模型选择的是 mask 长度 u 等于 3,密度 r 等于 0.15 的组合。这里我们也尝试了多种 mask 的长度和密度组合,具体的结果见上图中的表格。具体地,我们分别尝试了长度 u 等于 3,密度 r 等于 0.15 到 0.4 的各种组合。我们还测试了长度 u 等于 6 和 8 的情况。最后我们尝试了复合多种密度的训练,发现长度 u 等于 3,密度 r 等于 0.15 到 0.4 的混合方式的效果相对较好。
(3)训练过程
由于百亿规模的预训练模型的训练成本是比较高的,直接训练的话,模型的收敛可能会比较慢,所以我们使用渐进训练的方式。一开始参与训练的参数比较少,等模型收敛后,在原有模型的基础上逐步向上堆叠参数,直到参数达到我们想要的规模。如上图所示,先训练一个 encoder 和 decoder 都是12 层的模型;模型收敛后,将 encoder 堆叠到 24 层进行训练;模型再次收敛后,将 decoder 也堆叠到 24 层,以此类推,在不同的阶段训练不同的参数规模。
我们尝试了多种渐进组合的训练,虽然渐进训练的收敛速度比较快,但是它的最终效果不如直接训练的模型。上图中右上角曲线图中,蓝色的线是渐进训练的模型收敛曲线,红色是直接训练的模型收敛曲线。我们可以看到,渐进训练的收敛位置比较靠前。上图中底部的表,展示了我们尝试的不同参数级别的渐进训练模式,分成多个阶段去训练不同的参数规模。最后两列显示了训练过程模型使用的 token 总量以及在 evaluation 集上的 loss。可以看出,同样在 10B 的参数规模上,直接训练的效果比渐进训练效果要好一些。
(4)大模型预训练语料构建
在训练语料构建上面,我们从 Common Crawl 上进行了预训练语料的收集。整个过程主要分成四步:1)爬取数据。2)过滤非中文、短文本和敏感文本。3)文本去重,去掉语料库中重复文本和 n-gram 重复度比较高的文本。4)过滤低质量文本,主要通过 GPT 和基于 TF-IDF 的 logistic 分类器来进行文本质量的判断。
上图中的 PPL(困惑度)柱状图是我们收集到的语料通过 GPT 计算得到的 PPL 分布。我们根据 PPL 大小进行采样,即针对 PPL 值较低的文本(质量比较高),我们会采样比较多的文本,而 PPL 值比较高的文本,我们会过滤比较多的文本。在过滤掉 PPL 较高的文本后,我们用 TF-IDF 作为文本特征,使用 logistic 分类模型来进行文本质量的分类。
在文本质量分类模型的语料构建上,我们使用悟道发布的一个质量比较高的语料集作为分类模型的正例,大小有 200 多 G。而 Common Crawl 的语料由于是从全网直接收集而来,没有经过任何过滤,它的质量比较低,所以最开始我们将所有的 Common Crawl 语料都当成负例。
我们用上述语料来训练初始的 logistic 分类模型。随后我们采用半监督学习的迭代,一边用模型对 Common Crawl 语料进行标注,一边去更新模型的训练语料。如上图中的底部表格所示,在已标注的语料里会有很多广告文本,它的标签是正例,但这些语料会被模型预测成负例,且置信度分值较高,我们会将它的标签从正例改成负例。这样在下一次训练分类模型的时候,它就作为负例供模型学习。同样地,我们也会去修正那些标为负例但模型预测为正例且高置信的语料。通过这样的学习方式可以显著提高分类器的质量。
最终我们一共收集了 42TB 的 Common Crawl 语料,经过前面描述的三个过滤操作后,最后得到 800G 的中文预训练语料。
(5)模型小结
WenJin 模型小结:
① 模型采用 encoder-decoder 结构。
② 模型的训练任务是混合 Span Corruption 任务,同时由于我们是一个中文的预训练模型,所以还进行了字词混合的训练。
③ 训练过程中模型共使用 1000B 个 token 的语料。
④ 模型训练使用了美团自研的 LAMP 框架,支持模型并行和流水线并行,在显存占用上相对于 Megatron-LM 能够降低 28%。
⑤ 模型的参数量一共是 16B,模型并行度是 4,即 4 卡并行的模型。
⑥ 模型使用了 100 张 A100 训练了 1 个月。
--
02
提升中文预训练小模型的表现
1. 中文字词模型预训练模型的优势与劣势
中文预训练模型从建模粒度上分为:以字为单位的字模型、以词为单位的词模型、以及字词混合的模型。其中,字粒度的模型可以避免 OOV 的问题,表征学习更加充分,同时不依赖分词,可以避免分词带来的误差传递问题。但是它也存在一定的劣势,尤其是会丢失词粒度丰富的语义信息。比如 “小心”一词,和“小”、“心”这两个字是完全不同的意思。词粒度模型的优势在于可以显示的建模词语的语义,劣势一方面是可能存在过拟合以及 OOV 的问题,有些词可能训练的比其他词更充分,造成模型对于不在词表中的一些词的学习就不够充分。另一方面是词模型比较依赖分词算法,如果分词有问题,就会对模型的准确度造成一定影响。我们希望能够结合字模型和词模型的优点,使模型在具有词粒度模型的语义信息的同时,能够具备字粒度模型的灵活度。
2. CLOWER 模型
我们提出了一个基于字词粒度对比学习的 CLOWER 模型。为了兼容大多数在用的生产模型的结构,我们使用 BERT 结构的编码器,同时引入 word encoder 和 character encoder。
在预训练阶段,同时将输入文本输入到两个编码器里,就可以得到字粒度和词粒度的编码。之后我们分别做 Whole Word Masking 的 MLM 任务和普通的 MLM 任务。在得到这两种编码器的文本表示后,将同一个词对应的 character 表示和 word 表示的距离拉近。反之,将不同词对应的 character 表示和 word 表示拉远。除此之外,我们还进行了 sentence level 的对比学习。同一个句子经过 word encoder 和 character encoder 后,将 CLS 位置对应的表示的距离拉近。对于同一个 batch 里面的不同句子,将他们的两种表示的距离拉远。
CLOWER 通过多粒度的语义信息建模,基于字词表示进行对比学习,其目的就是将词粒度的语义隐式注入到字粒度的表征。这种方式具有比较强的灵活性,我们可以直接使用 CLOWER 的 character encoder,切换到现在部署的一些基于字的预训练模型,也就不需要在线上 pipeline 中新增分词的步骤。另外,CLOWER 的思想可以进一步泛化到多种粗粒度和细粒度的建模上。比如现在做的是字和词的对比学习,还可以做字和 n-gram 短语,或者是词和 n-gram 短语的对比学习。
在下游任务的使用上,CLOWER 的 character encoder 和字粒度的预训练模型在使用方式上是保持一致的。也就是说,无需代码上的修改,就可以直接把模型的 checkpoint 替换成 CLOWER 的 checkpoint。另外我们还提供了一个词粒度的模型,在一些特定的任务上,可以用这个 word encoder 进行词粒度编码。
3. CLOWER 模型实现
在模型实现上,我们使用 Bert-base 结构的 encoder。在预训练语料上,使用了悟道的 200G 语料,一共有 72B 个 token。使用结巴分词将语料进行分词处理,最后整个词表包含了 5466 个字符,还有 40014 个词。我们在进行 token level 的对比学习时,每个句子上进行 20 个词粒度的对比学习。我们使用的 temperature 是 0.05,序列最大长度是 512,一共训练了 30 万步。上图右边的表格是我们在下游任务上的具体的超参数选择。
4. CLOWER 模型实验
在单句分类任务上,我们做了一些实验对比。参与对比的模型有:1)BERT-wwm,也就是用 whole word masking 训练的 BERT 模型。2)BERT-wwm-sop,在 whole word masking 的基础上使用 Sentence Order Prediction 的任务训练的模型。3)MM-BERT,混合了普通的 MLM 和 whole word masking 的不同粒度训练的 BERT 模型。4)MM-BERT-sop,在模型 3 的基础上加入 Sentence Order Prediction 任务训练的模型。5)MacBERT,一个纠错型掩码语言模型,并且引入了 wwm 和 N-gram masking,是一个比较新、比较强的 baseline。从图中可以看到,CLOWER 模型在这几个任务上,都超过了已有的这些模型。
在句对分类的任务上,我们的 CLOWER 模型在大多数任务上也能够超过其他各个 baseline 模型。
上图是消融实验的对比。我们测试了分别去除 sentence level 的对比学习和 token level 的对比学习的目标函数的结果。可以看出,加上我们提出的对比学习的目标函数,可以带来比较显著的提升。右边的图从 embedding 表示的层面来分析了 CLOWER 模型是否能够将词粒度语义信息融入到字粒度的表示中。上下两个折线图分别表示同一个词在 word encoder 和 character encoder 的 embedding 表示的距离。上面的图是一个长度在 2 以内的词的表示,下面的图是长度 2 以上的词表示。蓝色线是余弦距离,这个值越高说明二者的表示越接近。红色线是欧式距离,这个值越低说明二者的表示越接近。最左边的是 CLOWER 模型,可以看到,它的词粒度和字粒度的表示的余弦距离比较高,在欧式距离上比较低,说明 CLOWER 模型能够达到预期的效果。
5. CLOWER 模型小结
① 支持字和词粒度,其中字粒度模型的效果提升比较显著。
② 无需额外词典,可以避免 OOV 问题。
③ 即插即用,可以直接替换到现有的字模型。
--
03
面向语义匹配场景的双塔模型优化
1. 语义匹配模型结构对比
语义匹配任务是 NLP 领域比较常见的一类任务,其主要形式是判断两个文本的语义关系。常见的语义匹配模型可以分成交互模型、后交互模型和双塔模型。交互模型是将两个文本拼接到一起送入到 encoder 做编码,这两段文本的 token 会进行 full-attention 的计算。交互模型的效果是比较好的,但是它的计算量比较大,推理速度比较慢,很难应用到时效要求比较高的在线场景中。双塔模型是将两段文本分别做单独的编码,这样就可以将编码提前离线计算,保存在缓存中。在线计算时,只需要计算两个编码的相似度。
为了结合双塔模型的高效和交互模型的语义匹配效果,研究人员提出了后交互模型。在离线编码文本的基础上,去引入一些轻量的交互操作。比如用 Attention 或者在后面接 1 到 2 层的 Transformer。但是后交互模型还是存在一定的推理时延。
我们提出的 VIRT-encoder,将交互模型的知识迁移到双塔模型中。我们在 encoder 阶段去增强模型的语义表示能力,也就可以减少对于后交互的依赖,在保持效果的基础上,进一步提高模型推理速度。
2. VIRT 模型
VIRT 模型将交互模型作为教师模型,将双塔模型作为学生模型,进行知识蒸馏。在交互模型中,我们可以得到 x 到 y 的 token to token 的 attention map,见上图右边的蓝色矩阵。双塔模型中,我们得到的是 x 和 y 内部的 token to token 的 attention map,见上图右边的红色矩阵。相对于蓝色矩阵,它缺少 x 到 y 的 token 的 attention 计算,以及 y 到 x 的 token 的 attention 计算。在 VIRT 模型训练中,引入了对于红色矩阵缺失部分的知识迁移。我们会额外计算出双塔模型中每一层 x 到 y 和 y 到 x 的 token 之间的 attention map,然后利用这两个缺失的 attention map 的值去逼近教师模型中的蓝色矩阵的 attention map 的值。这样我们就将交互模型的语义匹配和交互知识迁移到双塔模型里。为了进一步加强模型的语义匹配能力,我们在交互阶段还引入了轻量级的交互操作 VIRT-adapted interaction,类似于 sentence-BERT 里面的交互操作,它的计算量是比较低的。
3. VIRT 模型评测
在评测阶段,我们使用了 BERT-base 的交互模型。还有其他一些具有代表性的双塔模型和后交互模型。和这些主流的 baseline 模型相比,VIRT 模型可以在具备较好匹配效果的同时,实现推理速度上的加速。从最后一列的推理时间可以看出,VIRT 模型在取得 5 倍加速的同时,和 BERT-base 的匹配效果差距是最小的。
特别地,VIRT 模型在使用比较轻量的后交互操作的条件下,效果优于以 Transformer 为后交互层的 DeFormer 和 DiPair 模型。
我们提出的 VIRT 蒸馏方法,和前面所展示的后交互模型,在实现上是一个正交的关系。也就是说,我们可以在保留后交互模型的同时,还可以将交互模型的知识迁移到双塔模型的 encoder 里。我们选择了上图中展示的 4 个比较强的 baseline 上进行了实验。在这 4 个后交互模型的基础上,引入 VIRT 模型的蒸馏学习目标。实验表明,在 6 个数据集上,这些后交互模型几乎都可以取得稳定的提升。从另一方面验证了在 encoder 阶段将交互知识迁移到双塔里面,能够取得进一步的提升。另外,我们在消融实验中验证了 VIRT 的蒸馏 loss 和 VIRT-adapted interaction layer 的效果,可以发现我们提出的这两个部件都发挥了比较重要的作用。另外我们还实验了在不同层中进行 VIRT 蒸馏的效果,可以发现在所有层进行 VIRT 蒸馏,可以取得最佳的效果。
我们还考察了 VIRT 模型在不同规模的预训练模型上的表现。分别测试了 tiny、mini、small、medium 和 large 模型的表现。可以看出,随着模型参数的提升,我们的模型可以取得更大实验效果的提升。也就是说,我们提出的 VIRT 蒸馏可以很好地弥补交互模型和双塔模型之间的 gap。
由于我们的 VIRT 蒸馏主要是在 attention map 上进行蒸馏,所以我们对 attention 进行了可视化。可以看出,有 VIRT 蒸馏的模型的 attention map 和交互模型更加接近。
4. VIRT 模型小结
① 它是在 encoder 层中将交互模型的知识迁移到双塔模型里。
② 它可以显著地减少对于后交互层的依赖,提高模型推理速度,实现对交互模型效果的最大保留。
③ 它可以进一步应用在后交互模型中,进一步提高模型的效果。
今天的分享就到这里,谢谢大家。
▌2023数据智能创新与实践大会
4大体系,专业解构数据智能16个主题论坛,覆盖当下热点与趋势40+演讲,兼具创新与最佳实践1000+专业观众,内行人的技术盛会第四届DataFunCon数据智能创新与实践大会将于⏰ 7月21-22日在北京召开,会议主题为新基建·新征程,聚焦数据智能四大体系:数据架构、数据效能、算法创新、智能应用。在这里,你将领略到数据智能技术实践最前沿的景观。
欢迎大家点击下方链接获取大会门票~
DataFunCon2023(北京站):数据智能创新与实践大会 �-�百格活动