他山之石 | 预训练模型落地"最后一公里"

2022-11-17 09:05:22 浏览数 (1)

作者 | 杨扬 @美团 算法专家 整理 | DataFunTalk

大家好,这里是NewBeeNLP。预训练模型如今在业界已经占据主导地位,但是随着模型规模越来越大,如何完美落地成为制约其效果的一大因素。今天和大家分享,来自美团的基于预训练语言模型压缩和蒸馏的落地实践。全文会围绕下面三点展开:

  • 大模型落地应用挑战
  • 面向高压缩比需求的模型压缩方法及应用
  • 面向语义匹配场景的双塔蒸馏方法及应用

01

大模型落地应用挑战

首先介绍大模型落地面临的应用挑战。

1. 预训练语言模型的现状

在 2018 年 Google 发布 BERT 模型以来,模型参数规模呈显著上升趋势。

  • 开始以3 亿参数的 large 模型和 1 亿参数的 base 模型为主。
  • 而后 BERT 发布,各头部公司基于 BERT 模型结构实现优化,提出ImageBert、ERNIE等模型。
  • 其次,各公司接连提出不同规模的预训练模型,其中包括百亿参数的t5模型以及千亿参数的GPT3模型,甚至有万亿参数的稀疏模型。

可见,预训练语言模型的参数规模在不断地增长。同时,预训练语言模型在NLP下游任务中的效果也在不断提升,在NLP 任务的落地过程中,预训练语言模型已经成为了一个基础模型,能够给下游任务带来实际的价值。

2. 美团NLP场景概览

在美团的业务场景中涉及的NLP任务主要有以下几类:

  • 搜索推荐广告。当用户发起了一条搜索请求,涉及到的任务有查询理解、召回排序以及最终展示的推荐理由,包括用户商户的标签,背后均有 NLP 模型进行支撑。
  • 智能客服/助理。智能客服能够自动对用户的某些询问给出回答。
  • 用户在内容社区发表评论或笔记等等的过程中,会通过NLP模型对内容生产进行审核治理以及分发。
  • 在ToB场景中,比如公司内部的HR 帮助台。通过FAQ 匹配等等来辅助问答,减少人工成本。

3. 一次搜索背后的NLP技术

接下来针对一次具体的搜索背后看看有哪些 NLP 技术。

比如用户搜索美团附近酒店:

  • 首先会对这个 query 去进行意图识别和类目预测,目的是找酒店。
  • 其次对query 进行成分分析,发现是想找美团这个地标附近对应的酒店。
  • 最后将美团附近的酒店进行召回排序到前面位置,提供给用户去做选择。

当用户选择了一家酒店之后,他想去看一下这家酒店的情况。对于这种情况,基于之前平台用户发布的内容,通过对这些内容进行信息抽取,比如餐厅给力、环境好等等。对抽取完的信息可以和用户评论做语义匹配来展示核心的评论信息,辅助用户决策。比如用户点击“床舒服90%”这个标签,会匹配到含有床睡着很舒服这个信息的评价。

当用户对商户仍存在疑问时,比如他想问这家酒店有没有健身房等,可以通过智能客服来满足需求。背后涉及到FAQ匹配、KBQA等。

最后也会通过文本摘要的方式将核心信息高亮展示给用户,从而能够减少人力成本、提高用户转化。

4. 预训练模型在美团的广泛应用

美团在多结构、多任务、多模态以及这种多尺寸上面都提供了不同的预训练语言模型,在平台上提供用户使用。

对于不同场景,有领域预训练去提供给用户进行使用。在用户拿到预训练语言模型之后,可以对自己的下游任务进行精调。目前平台的预训练语言模型已经覆盖到了搜索推荐、广告以及外卖配送等场景。之前业务方可能需要去调试不同的模型来选择最优的,而今用户可以直接基于平台使用预训练模型就能拿到SOTA的效果。预训练语言模型上线以来,已经支持了美团60多个业务部门的2万多组实验。

5. 预训练模型落地“最后一公里”

在预训练语言模型各个业务场景落地的过程当中,我们发现了一个很大的困难:随着模型的规模的增大,推理时间也在不断地增长,上线之后耗时不足以支撑。

通过比较不同模型的推理耗时,比如百亿的GLM模型的耗时较久,需要26秒。对于线上来讲,比如搜索相关性场景的上线标准是40毫秒以内,那么控制模型的 inference 时间是势在必行的。

一方面可以通过增加 GPU 资源来分散请求,然而增加GPU资源的同时降低了ROI。此外,对于一个意图场景里的多个意图,每个意图可能会分别使用到不同的模型。若每个模型都需要增加GPU资源,可扩展性很差。另外一类方法是针对大模型的inference时间,通过有效地构建一些模板或者自动学习一些模板,实现提示学习。但存在的问题是需要去把整个大模型load进来,才能去做学习。而且,业务方也需要针对大模型的提示学习,重新部署预训练模型上线的框架,然而成本较高。

为了达到模型效果和推理性能的平衡,模型压缩的优势凸显而出。

6. 预训练模型压缩技术

首先回顾预训练语言模型压缩现有的一些技术,主要分为以下三个类别。

  • 知识蒸馏。知识蒸馏的主要的思想是:通过教师模型,也就是大模型,将他的知识教给学生模型,让小模型去学习,使得小模型能够保留更多大模型的效果,同时保留了自己本身高效的性能。相关的工作比如说有TinyBert等等。
  • 模型剪枝。模型剪枝是基于既定的规则,比如说根据模型的梯度去计算模型里面比如attention head或feedforward这类神经元的重要度,根据重要度排序,从而将不重要的参数进行裁剪,减少模型参数,提高模型响应时间。
  • 模型量化。比如对于需要部署在端侧的预训练语言模型,对模型性能要求较高。如果想进一步优化模型精度,可以把它的精度压缩到int8或者int4进行优化,而后部署到端侧。

02

面向高压缩比需求的模型压缩方法及应用

下面介绍面向高压缩比的模型压缩需求和相关方法的探索,以及如何在实际业务场景中进行落地。

1. 高压缩比下的预训练模型压缩

以BERT-large为例,本身是一个24层的模型,效果在0.93上下。通过单步蒸馏可以发现学生模型在16层的时候,下降效果是可以接受的;在两层或四层的时候,模型效果在0.82上下,效果较差,然而实际当模型只有当满足两层或四层时才能够上线。可见通过单步蒸馏来实现高压缩比需求效果较差,考虑引入助教模型来改进压缩效果。

2. 自动助教寻优的预训练模型压缩方法

针对以上问题,我们提出了一个自动助教寻优的压缩方法(AutoDisc)。

首先定义了最优助教,指以尽量少的参数来最大限度地保留教师模型的性能。实际上,可以手动寻找最优助教,假如教师模型是12层的,手动枚举10层、8层、6层等均可尝试作为助教模型,再从中选择最优的。

然而,这种做法耗费资源、时间和精力。所以我们提出了自动助教寻优的方法。可见,图中蓝色线的部分是所有的助教大小,蓝色线随着助教模型的变小,效果逐步降低。绿色线的部分是我们通过对不同规模的助教模型蒸馏得到一个一层的学生模型的效果,效果是在不断地变化的,可以发现,四层的助教模型,获得了最好的效果,可见选一个好的助教的重要性。

具体算法步骤是:

首先得到助教候选集,比如对于一个12层的Bert-base 模型,构造不同规模的助教候选,比如10层、8层等等,对这些助教模型进行优化,从优化后的助教里进行最优助教选择。一方面,可以对每个助教模型都单独进行优化,但训练成本比较高,所以我们提出了参数共享和优化下采样的方法。参数共享指最大的教师模型包含所有助教的参数,大的助教包含小的助教参数。

接下来进行优化下采样,可以将共享后的结构类比为三明治的结构,通过优化头部和尾部的参数,从而达到优化整个模型参数的目的,最后每个助教模型都得到了优化。

优化后的助教,再根据刚刚提到的Tradeoff 来选择一个规模小但是效果尽可能优秀的助教。而后对此助教模型进行蒸馏,得到最终的学生模型。

3. 高压缩比实验效果

在高压缩比的场景下,我们在GLUE benchmark上进行了实验,压缩比分别选取了保留 15% 的参数、5%的参数以及 10% 的参数。

通过这些实验结果,我们可以发现,在没有加入助教模型的情况下,效果下降比较明显,尤其是压缩比较大的时候,它的下降会更加明显。不论是加了手动助教还是自动助教,都会比不加助教效果好。其次,AutoDisc自动助教寻优的选择方式比手动助教寻优效果更佳。

4. 多教师策略

不同的助教,发挥了不同的价值,代表了不同层次的语义信息。可以通过以下多种蒸馏方式融入多教师的价值。

5. 迭代式多教师蒸馏

迭代式多教师蒸馏的框架,其实包含以下两个阶段。

首先在预训练阶段,通过教师模型,在无监督的语料上进行迭代式蒸馏,得到一到N个助教。同时在此无监督语料上输出知识(Soft label),然后结合原来的语料的Golden label 教学生模型进行学习。最后得到一个通用的小模型,这个小模型,可以作为下游任务的初始化模型,来提高下游任务的效果。

此外,下游任务也可以同样地使用迭代式蒸馏的策略,在有监督的业务语料上去输出他们的知识,也就是这里的Soft label,然后结合原来标注的Golden label,完成对student 的知识迁移,然后进行知识蒸馏,最后得到更好的一个 student。

6. 迭代式多教师蒸馏

上面介绍的是面向高压缩比的算法的优化。此算法的优化我们同时与悟道团队合作,实现了一个百亿模型的落地。

GLM是一个结合自回归和自编码的预训练语言模型。它也提供了包括从1亿到100亿的多尺寸的模型。面向不同需求的这种小模型,我们基于百亿模型在广告、智能助理以及评论的情感分析中实现了落地。接下来介绍一下落地的一些情况。

7. 美团搜索广告

首先介绍美团搜索广告的落地。在美团搜索广告的场景下,用户输入一个 query 比如说少儿古典舞,最后会通过query 和商家提供的信息进行语义匹配,得到召回和排序。

问题具体可被定义为,对于用户query,比如说少儿舞蹈,此外,和商户相关的文本包括了商户的名称和商户提供的一些服务以及他的团单等等,进行两者的相关性的匹配。具体通过预训练语言模型计算出用户的 query 和商户相关的一个打分,形成相关性特征,最后提供给后面的模型实现过滤和排序。

通过对 RoBERTa-large 模型蒸馏得到BERT-Medium,BERT-Medium最终以2000万参数的规模进行上线,离线的AUC值达到93.3%。此外,我们对百亿模型进行蒸馏到BERT -Medium,对同样大小的模型进行上线。

可以看到直接进行单步蒸馏,效果有些下降。进行迭代蒸馏比单步蒸馏效果更佳。最终采取了多教师迭代式蒸馏,达到了最好的效果。同时我们也将这个模型部署上线,对广告的收入日均提升了2.7%。

8. 智能助理-酒店问一问

第二个高压缩比落地的场景是在智能助理的酒店问一问场景,在用户对酒店存在疑问的时候,会去找这个客服去进行一些问题的提问。包含了信息查找和观点的问答。

可将问题定义为用户的 query 和后台的意图进行匹配,然后返回相应的一个关联答案。通过智能客服来解决用户的问题,既提升了信息查找的效率,也降低了人工成本,促成了更多的交易。

在这个场景上,之前是基于一个三层的 BERT 小模型,2021年上半年将百亿模型做了落地。通过多教师迭代蒸馏的方式,F1比原先的小模型提升了约10个百分比。将这个模型部署上线,日均帮助商家多回答了5000多个问题,提升了用户体验以及帮助商家节省了人力成本。

03

面向语义匹配场景的双塔蒸馏方法及应用

面向语义匹配的场景,我们有一个很大的需求是需要把它做成双塔模型。所以我们基于双塔模型又进行了蒸馏方法的探索,并且在相应的场景去做了落地。

1. 搜索广告业务架构及不同模型耗时

以搜索广告业务的架构为例,在召回时候,我们需要根据用户 query 去召回语义相关的广告,候选非常大。如果我们用 BERT 原生的单塔结构,因为每来一个query需要跟所有的候选进行交互模型的输出打分,那么推理耗时非常高。所以对此场景,会优先使用双塔模型。可见,部署一个单塔的交互模型Bert-base 有300多毫秒的耗时。现有的一些方法比如Deformer、DiPair等结合了后交互的双塔模型,它们的耗时的话根据各自后交互的复杂程度有不同的耗时。但是相比单塔结构的耗时下降了许多。

2. 语义匹配模型结构对比

对于后交互的模型,因为Doc侧或者商家POI(Point of Information)侧有很多,如果线上实时计算会非常的耗时。那么大部分人会选择使用双塔模型进行落地。使得Doc侧可以离线缓存,线上只需要计算query侧的一个向量。再将Doc侧向量的离线缓存抽取出来,最后进行匹配。

此外,对后交互模型,是在Later Intearction Layer层进行交互;对纯双塔模型,query侧通过BERT模型产出了query的embedding,POI侧产出POI的embedding,然后这两个embedding不进行任何的交互。最后计算cosine距离或者说通过pooling得到相关分,效率较高。然而,这种做法在前期时候没有任何的交互,所以效果相对来讲比前面的交互模型和后交互模型要差的多。

这里针对语义匹配的双塔模型提出了引入虚拟交互的蒸馏损失。虚拟交互的定义是:虽然query和Doc侧在底层的时候没有交互,但是我们可以通过计算attention将交互信息计算出来,将其称之为虚拟交互。在训练的时候把双塔模型的虚拟交互信息计算出来去迁移交互模型的交互信息,让其模拟单塔模型。

3. VIRT-引入虚拟交互的双塔模型蒸馏

此外,由于现有的后交互模型在底层时没有任何交互,可以把VIRT虚拟交互迁移到后交互模型中,来进一步提升后交互模型的效果。接下来就具体介绍一下VIRT是如何做的。

因为交互模型本身进行了两个句子的全交互,所以效果较好。所以我们把核心的attention知识迁移到双塔模型中。由于双塔模型X这个句子和Y这个句子分开编码,那么它本身的 attention 不包含两个的交互,所以我们要想办法把它迁移过来。

首先对于交互模型来讲,Muti-head Attention包含了X到X,X到Y,Y到X以及Y到Y 的注意力。双塔模型缺失的部分是X到Y、Y到X的交互。那么我们应该想办法把缺失部分补齐,从而让它能够学习到交互模型的知识。

这里选取的算法是,通过计算训练阶段交互的attention,得到了X到Y、Y到X的表示,然后去计算VIRT loss,在训练阶段不断地让双塔模型拟合交互模型的这个交互注意力,让它去学习这个知识。同时由于在底层的时候计算了这样的交互注意力,所以我们想在上层进一步做一个适配,进一步提升模型的效果。

在上层双塔模型本身有一个X的表征和Y的表征,那么可以通过刚刚计算的这个虚拟注意力,来进一步优化Y的表征,让它更多地关注到X,同时X也是一样的(VIRT-adapted Interaction)。得到了更新过后的表征,然后通过一些线性运算,或者直接使用两个表征可以进行最后的相关性打分。

4. VIRT公开数据集实验效果

在公开的数据集上验证了这个算法。我们对比了纯双塔模型Siamese Bert,以及三个后交互方法。其中DeFormer模型,由于它的后交互是整个BERT层,耗时会比较多;DiPair模型由于取了X的topN和Y的topN个token,所以效率较高;Poly-encoders由于引入了后交互,涉及比较简单的content attention的计算。VIRT-encoders即引入了VIRT loss和VIRT-adapted Interaction。

当我们去掉VIRT loss,也就是底层的虚拟交互,效果有所下降。去掉VIRT-adapted Interaction,效果也是有所下降。此外,当去掉VIRT-adapted Interaction时,其实是一个纯双塔,能保持和Siamese Bert同样的性能,效果比上面所有后交互模型好。

5. VIRT在搜索广告场景中应用

虚拟交互在优化双塔模型的过程当中,也在搜索广告的场景当中进行了落地,优化的是搜索广告的语义相关性,主要是计算用户的query和商家POI的相关性。

我们的主要工作是,基于3亿的模型进行蒸馏得到了2000万参数的Bert-Medium双塔小模型进行上线。小模型保留原模型96.2%离线效果的同时推理速度提升了56倍。可以看到之前的场景,当用户输入少儿古典舞时,最开始的top输出的商家和团单是不太相关的。经过以上的算法优化后,排在第一的商家精确地表达了少儿舞蹈的意图,并且团单也是相关的,用户体验得到了提升。

0 人点赞