查看原文
其他

百度凤巢大模型与搜索广告满意度设计与实践

叶超 DataFunSummit 2024-01-24

导读 本文将介绍在实际工业实践中,凤巢如何结合大型模型,以搜索广告满意度业务为基础,将研究成果转化为实际生产力。本次分享主要包括四部分内容:

全文目录:

1. 搜索广告满意度2. DNN - >ERNIE3. PROMPT的应用4. AIGC与想象力

分享嘉宾|叶超 百度 资深算法工程师

编辑整理|王鑫民 同济大学

内容校对|李瑶

出品社区|DataFun


01

搜索广告满意度

工业界与科研界最大的区别在于,工业界的技术手段是要解决实际的业务问题,我们所选择的技术路线(包括技术选型和问题攻坚方面),对应的技术动作,都是根植于我们要解决的实际业务问题。

首先,让我们看一下搜索广告的场景还原。大家应该都比较熟悉用户在百度的C端搜索框中输入query的场景。当用户输入一个query时,他们其实包含一个明确的需求表达,希望从搜索结果中找到可以满足他们需求的结果,这个结果对于许多企业来说也是一个商业机会,所以平台要将这部分流量做到对应的匹配。

对于客户来说,在B端即百度营销或搜索推广中,客户需要充分表达他们能够提供的服务和自身的业务,以及想要如何获取这部分流量,包括出价和物料如创意和落地页。通过这两部分的信息交互,百度最终会通过广告形式链接服务和需求。因此,广告在其中起到了桥梁的作用。这个桥梁的作用搭得是否够好?商家的服务能不能满足用户需求,其实就是搜索广告的满意度。

再来看一下搜索广告与一般搜索的相同点。搜索广告作为与用户侧自然结果共同展现在搜索结果页上的呈现形式,其基本准入要求是要满足用户侧的相关性约束,即广告不能出现特别离谱的内容,与整个百度搜索引擎的产品调性不匹配。所以从搜索词到落地页,要满足用户侧的搜索满意度标准要求,主要指的是相关性,这一点与一般搜索的相关性需求是相同的。

搜索广告的满意度与一般搜索相关性相比有两点不同。第一点是引入搜索词到浏览行为的用户行为交互评价与一般搜索不同,搜索引擎是非个性化的结果,而搜索广告是千人千面的个性化结果,因此必须结合商业搜索广告的个性化特点,针对不同用户的不同行为给予充分的个性化后验评价。第二个不同点是,搜索广告背后链接的是客户服务,需要考虑客户能否提供好的服务,这是一个步长很长的链路评价,但这也是商业广告搜索满意度中最具特色的地方。因此,整个商业广告搜索满意度的覆盖步长从一跳、点击后交互行为到商业服务后验评价将会实现全方面的覆盖。

具体到本次话题,我们讨论的是自然语言处理的大模型,其建模关注的主要是搜索词到落地页的相关性,即当用户输入搜索词并点击商业结果后,一跳展现中是否能够满足用户的需求。

02

DNN - >ERNIE

在明确业务问题后,来看一下我们是如何起步这一方向的。这一部分讨论的主题是"DNN到ERNIE"。我们可以将这个ERNIE理解为Bert,这主要为了方便大家理解我们在进行思维转变时的业务场景。在任何企业或业务中,技术上都存在着技术惯性和场景特色。因此,在凤巢进行技术转型时,充分考虑到了我们的场景问题和技术优势。在这个过程中,有许多值得分享的地方。

首先,让我们来看一下广告计算方面的技术栈。在广告行业中,最典型的可能就是广告点击率预估模型。虽然广告点击率预估模型听起来是一个大的topic,但它实际上由三个部分组成。第一部分是海量用户日志的解析,主要是为了提取特征。第二部分是将离散特征连续化,因为客户本身是离散值,具有对应的ID,但这些ID是无法计算且没有连续的数值使之可以输入到模型中,因此业界的常用做法是使用DNN embedding将离散特征连续化,通过这一步产生一个sparse table,即一个大规模的KV词表,其key是我们之前所说的各种离散特征。

第三部分是拿到这些embedding之后,可以训练实际部署的线上点击率预估模型,即训练底层复用sparse table,并生成顶层的计算矩阵。这种技术范式是计算广告或搜索广告常见的范式。在Transformer或bert出现之前,我们求解相关性问题其实也是一以贯之的,即使用各种方法来获取embedding。

我们使用各种自然搜索语料包括商业、新闻和各种其他领域的语料,通过广告CTR预估所积累的大规模分布式计算框架训练得到各种各样的embedding。例如,用户可能具有与新闻浏览相关语料的embedding,也可能通过商业语料分布的embedding,或是通过将用户在各个行为链路前面构成的图学习产生的embedding,制作出对应的特征。因此,在这一步中各种各样的embedding任务与之前CTR模型预测的DNN embedding非常相似。在此基础上,我们依照通用范式,使用现有的嵌入表示来训练相应的相关性任务。虽然这个流程看起来非常复杂,但随着Transformer或BERT技术的出现,我们整个自然语言处理学习已经变成了一个端到端的学习任务。

那么我们的转型是否很简单,是不是直接将文本输入模型就可以了?在回答这个问题之前,我们需要结合文章主题,即我们的一切技术动作都要看到是要解决什么业务问题,达到什么样的业务目标。在凤巢中,我们的要求非常高,因此我们的目标是将这一转型彻底、完全地实现在线化计算,即在线上既要准,又要快。

具体而言,挑战是深入高噪声落地页内容挖掘,克服长文本建模带来的语义理解挑战和性能平方级增长压力。此时许多同学会想,“搜索相关性不是一个已经很成熟的技术吗?为什么在这个业务中会有这么多限制?”

我们要考虑搜索相关性中常用的特征,例如页面标题,实际上在广告场景中,由于客户在广告投放中主要目标是竞得流量,因此他们不会特意进行相应的SEO操作,如某大型电商客户3000多万营销页标题都一样,都是“APP下载,超多好货等你来”,因此页面标题在此情况下就会失真成为噪声。

其次,我们是否可以将标题退化为前卡创意作为落地页的抽象归纳呢?实际上这也是不可取的,因为广告具有复杂的点击率优化特性,用户点击信号无法代表最终的相关性,这也和我们之前的计费方式,比如CPC计费等业务模式深刻相关。

因此深入理解营销页面,只有一条路径,就是深入落地页进行长文本建模。在落地页中,我们可以发现它具有图片多、碎片化、主机零散、噪声高等特点。因此,这些特点都给我们带来了很大的挑战,尤其是长文本建模的理解和性能平方级增长的压力。

对于这些问题,业界常规解决方案包括:

(1)将在线硬件由CPU替换成GPU;

(2)进行蒸馏萃取,百度的实践中将bert提取到128维两层大小;

(3)进行模型剪枝,因为在构建判别模型时,Transformer最顶层的输出并不需要将每个Token的embedding全部传递到上层。

然而,这些常规的做法仍然无法支持我们实现最终的业务目标,无法完成上线。因此,我们采取了两项效率提升措施:

(1)离散核心词集合输入与序列模型适配;

(2)多层级Token化设计-与凤巢能力结合。

关于离散核心词集合输入与序列模型适配。我们面对的问题是一个噪声非常大、页面非常零散的长文本建模,在尽可能压缩平响时,我们要从中进行信息提取,最常见的方法是使用核心词集合输入。通常,我们会把核心词按照某种提取算法的重要性进行倒排,即越重要的核心词越会包含在队列前端,以保证重要性的召回和优先级。然而,这样做会有两个问题。

首先,语义片段会被严重破坏,例如,“北京到上海的机票”可能会被排序为“机票”“上海”“北京”,导致原本的语义丢失。其次,这种做法在bert 这样的模型中,会导致算法耦合,预估转化性较差。我们用核心词重要性稳定倒排在Token embedding做了梯度积分可视化,可以发现模型认为重要的词全部集中在头部,线上有几十个核心词的quota计算,但是尾部的核心词对结果影响不大。这种排列方式可能导致长尾信息、冷门信息或者独有的敏感信息被忽视,从而导致线上 quota 利用率较低,后续的计算浪费严重,未能充分利用算力。

这个问题的本质是思考早期预训练语言模型中 pos embedding的作用,引出三个问题:

(1)ERNIE能否退化成词袋模型?

(2)核心词稳定倒排是不是一种可以被学习的LM语法?

(3)有没有更好的输入方式?

第一个问题:可以通过将其录入词袋模型进行处理。第二个问题:核心词倒排是不是一种稳定可以被学习的语法?因为核心词排序模型是一个稳定的算法,如果每次输入都遵循这种范式,语言模型就可能会学习到这种语法,并取得一定的效果,所以我们也进行了对应的尝试,其实对应出来结果也是显而易见的。第三个问题:我们最终采用的方法是使用核心词倒排来圈定范围,最后将其还原为页面顺序。这样,微调任务和预训练任务可以实现较好的对齐,从而达到最佳效果。在这种方法下,核心词的稳定性随着落地页页面长度增长,其主要关注信息与网页重要信息分布变得更加相似,主要集中在首屏中部位置。

关于Tokenization的优化。主要存在两方面问题:

(1)字粒度语义特征缺乏对片段文本精确建模的能力:ERNIE的收敛依靠上下文语义辅助,核心词输入形式是离散片段化语义收敛在高噪声条件下困难;

(2)算力消耗大:字粒度决定了模型的算力下界为输入序列长度为字数,线上平响约束难以满足。

我们采取的做法是采取多层级token化设计,将整个token拆解为多种级别,利用百度积累的短语识别能力,带入先验切词知识,以每个token的硬编码形式语义收敛取代soft语义收敛;以精确语义到宽泛语义逐渐兜底的token策略,保证专名优先再用basic词粒度承接,最后由字粒度兜底。如“剪辑师”被识别为专名,则整个“剪辑师”将成为一个Token。如果“剪辑师”这个词没有被覆盖,而是“剪辑”和“师”,则我们将其识别为两个TOKEN;如果仍没有被覆盖,则这将退化为其原始的word形式,变为“剪”“辑”“师”。这种计算的好处是,如果我们输入的语料库是相同的字数,采用多层级Token化的方法可以使计算队列长度极大地减少。这样的计算过程也可以与凤巢已有参数服务器或大规模分布式计算能力很好地结合。

比如假设有百万级别的token,首先,我们要把所有的embedding都load到显存里,这对显存会造成极大的挑战;其次,在进行MLM算法预测每个被masked TOKEN时,其softmax的计算将会是无法承受的性能长尾。为解决这些问题,可以利用凤巢的Pserver能力将ERNIE模型进行类似点击率预估的Sparse和Dense table的两阶段拆分改编,整个token embedding会存放在Pserver里面,在每一条预训练时,通过采样的方式,获取足够多的样本进行sampled softmax,实现数据效果基本无损的同时也节省了大量显存并提高了训练效率。

第二,pserver具有一个lazy adam能力。在传统Adam做法中,对于一些长冷token,其梯度更新的非常不友好,因为它通常由于动量和冲量的存在导致梯度偏向某个方向更新。但是如果没有采用到的token,则不会有梯度计算回传,其pull和push阶段会做一个完整的隔离,这就属于我们提到的lazy的形式。这样,对于长冷的token,其学习充分不会导致过于有偏。通过这些设计和架构创新,成功地将ERNIE模型的Sparse table和Dense table都变大,实现了“既要准,又要快”的业务目标。降低了复杂语境下的收敛复杂度,也提升了模型的预估表现,并且因为token化导致序列变得更短,计算路径减少了约50%,可以提速数倍。

03

PROMPT的应用

完成DNN向预训练语言模型迈进之后,实际业务场景中仍存在许多挑战。为了解决这些问题,我们利用了prompt learning的方法。随着精细化运营的发展,整个凤巢的业务不再是由平台策略一家主导,变成了平台策略与行业化运营协同发展的过程,单元以行业为颗粒度。在行业化发展中,有许多产品迭代,我们对这个行业的搜索满意度标准进行了对应的升级,业务操作的本心是集中迭代,小步快跑。对于平台策略来说,这带来了很大的挑战,因为我们既要保证迭代行业能够取得应有的迭代效果,又要保证没有迭代的行业保持大盘的平稳。

通俗来说,我们需要一个机器学习模型,它的训练数据有一部分会更改掉标准和label,有一部分不变,但模型要对这两部分预估的都非常好,而且要满足长期迭代的趋势,而且要一直好。概括来说,我们需要探索出一种具有良好隔离性的增量学习范式。

如果对于CTR模型或CVR模型,通常的方法是增加行业bias或通过组合特征。然而,我们发现在预训练模型的顶层增加行业bias的效果并不尽如人意。因此,我们采用prompt方式,告诉模型此时此刻这个判别的case需要按照某种行业的标准去判别,通过这样的提示,模型很好地以prompt为锚点实现了行业良好隔离。

具体做法为:在预训练时,我们新增soft prompt token作为行业ID,并且在type embedding和position embedding中给予它独特的设置。在预训练阶段,我们将它强制mask掉,然后做mask language model的学习,从而实现让这个TOKEN或者prompt自发地根据它的数据分布来收敛到行业预估的任务。

在微调阶段,我们根据业务实际情况将行业ID输入到模型中,模型就看到一个文本的分布,而这个文本分布通过预训练模型本身就可以预估到,知道它是某一个行业,然后把它对应的行业提示词输入到模型中,让模型在微调时可以知道这是某一个行业中的文本,应该遵循对应行业的标准,实现了良好行业隔离性的增量学习方式。

我们进行了两个离线的策略评估。第一个是将训练数据按不同的行业将一定比例的行业标准进行有规则的重映射,或者保持一部分不变另一部分做重映射,来比较行业bias、原始模型和用我们方法训练的模型,它对于更改了标准部分的数据和未更改标准部分数据的策略效果,最终我们的设计顺利地达到了设计目标。第二个是通过积分梯度的方式可视化地查看行业TOKEN对于判别这一条ins的相关性的重要性,经过预训练,行业TOKEN的重要性得到了显著提升。最终,我们用这样的范式在去年有力地支持了很多行业的策略迭代,在线上取得了实际的策略效果。

由于性能原因,大部分系统通常被拆分为精排和粗排阶段。在精排阶段,各种信息都会比较完备地输入到模型中,从而得到一个精准的判别。而在粗排阶段,通常会使用双塔模型形式来进行效率优化。双塔模型的形式是指对于由一个 pair组成的数据,如sent_A和sent_B,在精排模型中,如果对于m个sent_A和sent_B,其计算量为m乘以n。但是在使用双塔模型时,我们可以用一个encoder计算a,另一个encoder计算b,最终用计算结果在顶层进行交互,因此计算量就是m加n。实际情况中,a和b的选择通常不都是完全在线计算的,有一部分可以通过离线计算存储的拉取方式进行。因此,双塔模式可以很好地解决性能问题,但同时也带来了一些优化问题和策略效果问题。

一般来说,我们采用异构或同构的双塔模型。异构和同构指的是这两个query encoder和doc encoder是否使用同一个模型。实际上,其预训练都是使用单塔模型的预训练来进行初始化。在输入文本时,我们将query和文本doc都视为单个sent_A输入。在这种情况下,我们产生一个疑问:有必要预训练一个双塔模型吗?因为单塔预训练模型和双塔预训练模型的应用场景毕竟是不一样的。

我们在预训练过程中曾有一个任务叫NSP(next sentence predict),即判断sent_A和sent_B之间的关系。但在双塔模型中,我们发现只有单侧输入的sent_A,那么sent_A的信号去哪里了呢?通过prompt的理解,我们知道prompt的核心目标是将预训练的知识与微调的知识进行打通,尽可能地对齐。因此,我们增加了一些虚拟prompt的位,即将query改成sent_A和sent_B。其中,sent_A是虚拟的prompt,doc也是单侧文本,我们也将其改成sent_A和sent_B,并将其作为虚拟prompt进行输入。那么,整个建模任务与单塔预训练模型的建模任务就变成一模一样,并且我们充分利用了整个channel空间,最终效果也非常显著。这种方法比较简单,思路十分清晰,易于操作。

04

AIGC与想象力

生成式大模型想象力主要解决的是AIGC的问题。很多同学想知道,我们一直在思考如何判别搜索满意度,搜索满意度和AIGC有什么关系?我们是不是为了硬炒概念而去做这个事情?回归到今天的主线,任何技术问题都是为了解决业务问题,因此,我们需要看看搜索广告的商业生态问题。

直接说结论,供给侧是搜索广告商业生态问题的天花板,也就是说,如果搜索广告的优质供应不变,任何用户体验的单维优化都难有突破。搜索广告的物料是由客户提供的,对于客户参与竞拍的流量,我们要给予商业产品契约精神公平的对待,不能遗弃,也不能凭空创造出一些优质物料。

因此,如果供给侧或客户侧没有没有做供给改变,无论是削减Badcase还是奖励Goodcase,从结果上看,都很快会触及天花板,因为其源头不更新。

因此,如果想解决这个问题,唯一的方法就是采取多管齐下的方式来驱动优质内容的正循环。百度要连同客户协同优化,一起改善商业问题。例如,客户拥有许多库存广告,通过我们检索到的投放尝试和主动曝光披露,客户发现只有优质广告和内容才能实现最佳投放效果,然后通过这样的效果激励传导给客户,客户才会有动力将其库存广告与百度同向运营以实现把它变成优质广告。

如果没有这一条通路,客户是没有动力的,因此我们的惟一路径就是要使其运转起来。例如,好的广告带给百度好的生态,而好的生态会给广告主带来更好的投放效果,从而促使广告主与我们共同提供更多的优质内容。AIGC 带来的生产力变革就是在这里。

在过去,我们模型优化虽然能够提高判别效率,但实际上,它只能提高激励效果,即对于广告主而言,广告主的优化可以带来多少增量,是系统优化判别模型所带来的。但是,对于广告主来说并没有减轻他的工作难度,也就是说,对于库存广告变成优质广告的运营优化,这是一个很重的工作,我们可以只提供效果,但不能减轻广告主的负担,也不能提高我们的协同优化效率。我们只能保证在逻辑上,这一闭环有足够的原动力。因此,AIGC在进行判别时不仅可以提高准确性,激励效果还可以提升双方协同共赢的生产力。因此,AIGC的变革不是为了炒概念,而是要在这个循环的过程中,实际为业务带来真正的价值。

关于凤巢AIGC目前的阶段性成果和结论。首先,我们开始尝试的生成式,例如直接生成输出,模拟不同的分档,使用模型判别是几分。其次,我们使用了PET和p-tuning的方式进行优化,这些方式可以在更大规模的生成式模型中获得更好的效果。

后来,我们还引入了思维链的方式,不仅仅可以问模型现在这个判别的搜索满意度,也可以询问模型在判别时的原因。在这方面,我们做了很多prompt的工作,这些工作会为未来带来怎样的想象力?

第一、自动化物料生成。我们可以将客户的物料做一个自动化的工具,让SEM能力不足的客户可以用到自动化的生产工具来产生优质内容。

第二、debug和解释性工具。对商业产品,投放效率越高并不一定总是最好的,客户的投放体验或者客户参与的有效性上,也是需要考虑的部分。因此,在整改、披露或做系统解释时,我们可以使用AIGC以客观的方式回答客户的问题,例如:“这个为什么不好?这个为什么好?”

第三、系统级别LLM reward。凤巢系统是一个多级、多漏斗的系统,而使用生成式模型的能力可以变成一个扁平又宽广的漏斗,其中必须有reward model或系统反馈的feedback。搜索满意度在其中是一个重要的因素。这将有助于在未来建立更高级的系统级别的变革和想象力。

05

Q&A

Q1:行业隔离的预训练方式是怎么实现隔离的?

A1:行业隔离的预训练方式实现隔离的方法是让该特征变得非常具有重要,用户在模型判别这个case的时候,要充分考虑这个提示词。当模型足够大时,需要提升该提示词的重要性。因此,在预训练时,对于每个行业分配一个固定的TOKEN,并强制将其match到该行业。根据我们当前预训练的语料分布,因为其实预训练也是广告主日志的采样,同样按照预训练的预料分布做该行业的预估,使得模型对于这个token代表的含义具有充分的认知。当在finetune阶段输入到模型中时,就能实现良好的隔离效果。

Q2:最后相关性模型是单塔模型还是双塔模型?然后用prompt构造样本训练,可以举个例子吗?prompt是q≥t,还是t≥q 生成的?

A2:凤巢的相关性模型有多个版本,根据实际场景的频响约束和资源约束进行权衡,可能在粗排阶段采用双塔模型,在精排阶段采用单塔模型,业务端可能采用其他级别的模型。用prompt构造样本训练,例如,用户可以询问搜索词和文本的相关性来构建prompt。

Q3:输入文本超长时,双塔模型、prompt的和sent_B长度优先保留哪个

A3:我们的sent_A会是一个短串,也就是说softprompt数量很少,大约不超过5个。如果长度比较长,还是优先保证这个结构的实现。因为在实际计算中,模型需要计算的长部分是doc encoder,而doc encoder是离线计算的,所以可以接受较长的长度。query encoder和用户搜索词的长度不会特别长。

Q4:长文本处理那两个方法就是离散核心词和多层级 Tokenization优化哪个效果提升得更好一些?

A4:Tokenization 优化效果会更好一些。

Q5:单塔到双塔sent_A和sent_B的输入?

A5:用户搜索词和广告主提供的素材相关性,sent_A就是用户搜索词以及相关的知识拓展,sent_B就是广告主提供的物料素材,例如落地页内容和相关的知识拓展。无论是双塔模型还是单塔模型,我们的query侧和document侧都是按照这样的业务规则划分的。

Q6:搜索广告线上主要badcase有哪些类型方面,举个例子,可能是哪些导致的,为业务测试手段来规避。

A6:针对badcase,其实有很多与相关性不相关的情况,其导致原因也比较复杂。大致来说,当广告主进行流量竞得表达时,以及用户query需求匹配时,有可能是用户客户在表达的时候,因为投放操作的不熟练;有一些操作也有可能是我们在流量匹配的时候,有一些没有特别完美的匹配,这些问题最终会在相关性评估漏斗的入口处体现。对于query和候选广告,存在一些badcase和goodcase。其实百度在实际的产品上,也就是营销产品上已经有各种各样的披露手段,大家在实际投放的时候应该有实际的感受。

Q7:双塔预训练是从头预训练吗?

A7:我们是可以用soft prompt的方式,用双塔模型直接复用单塔预训练的成果。

今天的分享就到这里,谢谢大家。


分享嘉宾

INTRODUCTION


叶超

百度 

资深算法工程师


叶超,本硕均毕业于上海交通大学。2017年加入百度凤巢至今,担任百度凤巢资深算法工程师,主要工作方向为搜索相关性、用户个性化行为预估等,于2021年获得百度最高奖。


往期优质文章推荐

往期推荐


当大语言模型遇见推荐系统

一个范式了解通用人工智能的进化!神经网络大模型 ⊕ 知识图谱 ⊕ 强化学习 = AGI

蚂蚁金融事理图谱构建及应用

快手3D数字人直播互动解决方案

大语言模型是推荐系统的解决方案吗?

如何应对大数据量挑战?分布式事务型 KV 数据库 TiKV 的实现和实践

懂数据才能搞好业务,数据平台在Qunar的精细化运营中如何实现业务增值?

ChatGPT技术的国产化

数据驱动:指标体系如何助力业务增长

数据服务化在京东的实践

云原生实时湖仓系统的一数多擎实践之路-OushuDB




点个在看把好内容分享给更多人

继续滑动看下一个

百度凤巢大模型与搜索广告满意度设计与实践

向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存