fwalker 发表于 2022-4-12 17:40

如何在工业界优化点击率预估:(一)开篇

我此前一直在广告推荐领域负责排序预估方向的工业化迭代和创新,在分享和交流的过程中,发现部分业内同学要么存在思维局限性,要么又过于理想态,不加思辨的应用前沿技术,而忽视了场景特异性下的数据驱动的因果性。因此想整理一系列文章分享一下这些年自己的思考和经验,希望能给大家带来帮助,在探讨具体任务的解决方案时不仅会参考我们团队自己的工作也会借鉴业界前沿加以理解延伸,也因此本系列文章不是团队经典工作的解读稿,而更像是一篇整体迭代思维的综述,至于为什么收窄到点击率预估,而不是排序模块,是因为时间有限,想先尝试完备一个系列,后续可以再尝试扩展到不同模型,即使如此,由于预估模型的迭代通用性,对于CVR、粗排和重排等方向的优化依然具有一定的指导意义。
一、工业界的点击率预估

如标题,本文重点讲述如何从1-100去做好点击率预估,因此点击率预估的背景以及前期发展我就不再赘述了,对于点击率的基础理解可以参看怀人老师的你真的懂点击率(CTR)建模吗?,在我们广告业务中,点击率模型的目标是预估给定广告、场景、用户的情况下该用户会点击该广告的概率,即 https://www.zhihu.com/equation?tex=p%28y%3D1%7Cad%2Cscene%2Cuser%29 。下面具体说一下为什么要强调工业界和学术界这个差异,点击率预估在学术界优化目标比较纯粹,就是在特定的数据集上实现评价指标的提升,而且学界产出的优胜逻辑更关注变量控制下的创新性。这种视角下的技术产出往往会忽视
1、算法的通用性
通俗说就是照搬论文中的算法发现在工业数据上根本没用,即使是工业界的学术产出,也会存在类似问题,所谓No Free Lunch,别一看到先进技术就觉得找到了雷神之锤想在自己迭代的场景大杀特杀,一定要思辨技术的适用性和场景的问题需求是否匹配。在学习汲取别人工作的时候最好遵循三镜理论,放大镜,显微镜,照妖镜,要用放大镜扩展视野学习所有相关知识,用显微镜去看背后的思考逻辑,用照妖镜去选择真正对你有帮助的知识去汲取。
2、系统的完整性
设计的模型缺乏对系统现状以及稳定性和算力的考量,我想这块工业界的同学应该深有体会,部分算子或逻辑的设计确实能在公开数据集的消融实验看到更大的提升,但实际应用中要么工业系统架构上根本无法训练或驱动起来,要么投入到线上在维护和资源消耗上都显得性价比很低。
3、迭代的连续性
由于未考虑工业界实际系统环境以及lifelong的迭代特性,部分模型在设计上一旦上线成为主模型会减缓未来的迭代效率,逐渐锁死技术发展,毕竟学术迭代终点是基于文献的技术沉淀,而工业迭代是一份尽量考虑持之以恒的工作。
当然业界也存在为了短期利益去忽略后两点做一锤子买卖的事,但据我所了解的情况来看后人埋坑所耗费的精力远不如在当时顶住对应的业务压力。除了上述主要三点,工业界和学术界的优化路径大部分是可以相互参考的,只是在不同位置和责任上,优化目标存在些许偏差,而工业界优化点击率预估的优化目标通俗定义如下:

https://www.zhihu.com/equation?tex=+%5Cqquad+++%5Cqquad+%5Cqquad+++%5Cqquad+++%5Cqquad++%5Cqquad+++Max+%5C++Metric%28pctr%2Cs%29++

https://www.zhihu.com/equation?tex=%5Cqquad+++%5Cqquad++%5Cqquad+++s.t.+%5C+%E7%B3%BB%E7%BB%9F%EF%BC%8C%E7%AE%97%E5%8A%9B%EF%BC%8C%E4%BA%BA%E5%8A%9B%EF%BC%8C%E5%8F%AF%E8%BF%AD%E4%BB%A3%E6%80%A7%EF%BC%8C%E5%9B%A2%E9%98%9F%E5%90%88%E4%BD%9C
如上大家可以看到要想做好点击率除了优化模型提升预估准度,还需要考量诸多要素。因为我作为算法同学,本系列重点还是针对如何优化模型,所以将其他因素设置到constrain作为模型优化的上界考虑,但实际情况是互为约束,这也促使了近年来算法&工程Co-Design的迭代思维,因此新一代的算法架构师在寻求技术突破的时候可以将算法、算力与系统架构纳入整体视角一起考虑、设计和重构。接下来简单介绍下如何考量以上约束设计模型,但大家切不可局限思维带入性的认为约束是不可打破的。
(1)系统

所谓系统上的约束,主要指引擎链路和系统工具的局限性以及稳定性。局限性比较一目了然,底层做不到直接从源头扼杀想法,沉没成本最低。但稳定性往往是在经历迭代上线方能显现,这个稳定性主要在于业务大盘效果的稳定性,以及系统链路的稳定性。对于前者比如你的模型分布变化比较剧烈,如果下游链路对你的预估分强依赖,可能造成排序结果出现异常。另一种情况是你的模型所需要的链路支持较复杂和脆弱,比如强依赖日志落盘和IO带宽,这种需求在大促瞬时流量的时候可能会直接击垮系统造成雪崩。因此我们在模型设计之初就要考虑这些问题以避免不必要的麻烦,这里对应上诉两个问题举两个迭代的例子,继承预训练的Embedding向量是目前工业界引入泛化表征信息的常用方法,但是考虑到搜推广的工业环境一种lifelong的增量状态,无监督的预训练表征可能也需要更新,从而进一步更新Embedding向量,那么这种解耦式的训练和信息供给在在线切换的时候就会存在不一致的风险,从而导致大盘效果不稳定。对应另一种情况比如实时特征落日志,当然解法可以是去升级系统链路建设Feature Service。
(2)算力

所谓算力对应的在线的计算资源,对应的具体硬件需求有GPU,CPU,和Memory。在有限算力的合理资源利用率下对模型约束反映的是打分的quota和响应RT,这两者又影响到最后的排序结果和用户体验,进一步则是业务结果,整体的发展曲线如下图,当然这里可以发展一个动态算力的背包问题的解法来确定合理的模型复杂度和打分quota配置,毕竟算力约束是 https://www.zhihu.com/equation?tex=%5Csum%5Climits_%7Bi%2Cj%7Dx_%7Bi%2Cj%7Dq_j+%3C%3D+C ,除了优化单次计算以外,也可以个性化打分量。不过本文我们要讨论模型优化设计之初我们如何考量算力的约束,首先就是算力的性价比,举一个简单的例子,比如我们想要对用户行为序列进行时序建模,常用的方案是GRU,串行的计算逻辑无疑带来算力的挑战,但如果采用叠加position embedding的attention计算在运算并行度上就会大大打开,实际效果经验上差异不大。另一方面结构设计上避免小矩阵运算,比如三路不同序列attention,直观的逻辑是分别attention再concat,但实际可以padding对齐后变成大矩阵计算,这些都能带来算力的节约。另外在逻辑结构上避免过多的中间Tensor,这也会导致GPU访存的消耗,从而降低QPS。当然这一块计算引擎优化的同学会更专业一些,他们也会帮助利用OP Pattern做一些Kernel fusion或者在线Inference的时候调整为FP16,但如果缺乏相关条件的同学要有这方面的技术sense,毕竟无法上线的模型设计一样是纸上谈兵。


(3)人力

人力分为模型迭代的人力和模型维护的人力。模型迭代的人力首先是在于模型是否具有通用性和普遍性,模型的设计是否可以模块化分开迭代,这样最大限度的避免了耦合上的人力内耗。模型维护的人力主要在于模型数量和模型稳定服务的人力投入。两种人力问题的二合一例子就是多场景在通用维护以及特异性迭代上的矛盾。今天很多团队一开始迭代一个场景对应生产一个模型,随着平台的发展逐渐迭代多个场景多个模型,如果人力不够会尝试发展多场景归纳到一个模型从而节约人力,但是其中一个场景的数据分布发生剧烈变化或者业务优化目标发生变化,又会干扰到其他场景,为了屏蔽对应风险又要进行拆分,从而出现节约模型迭代人力、增加维护稳定人力的矛盾。因此在对应问题上需要看各自业务的发展需求,如果业务目标大家认为simple is more,很长一段时间不会追求差异化,那么可以考虑多场景建模,但是如果平台发展的瓶颈期需要精细化去挖掘剩余价值,可以思考进行迭代生产链路的流水线升级,对应新增场景的生产和维护只需配置即可上线服务,这样也会节约人力。综上想说明的就是在设计模型的时候一定要考虑未来的人力投入,如果花一个月上线的提效,以后每周都要花一天时间维护稳定,那不如多花点设计一个轻维护的模型省心。
(4)可迭代性

可迭代性上文已经介绍过了,主要在于今天的模型上线成为未来的baseline后,我们在其基础上进一步迭代是否迭代节奏会受到影响,举一个最简单的例子即我们搞了个上T的模型或者算子结构极其复杂的模型,前者一次训练需要吃掉大量的训练资源,导致迭代并行度下架,后者训练QPS极具下降导致训练周期变长,两者都会极大的减缓下次迭代的节奏,从而无法完成业务目标。
(5)团队合作

工业界和学术界另一差别在于工业界的迭代是一个团队合作的架构,首先是跨团队的合作,算法同学在做模型迭代的时候或多或少都会依赖到工程同学的支持,小到一个打分策略的开发,大到对应的生产系统。作为算法同学,如何高效的赢得工程同学的支持除了刷脸,还要深入了解到工程系统中,这样你才能把你需求进行通用化的抽象,这样即可以方便下次复用,也可以帮助工程同学不落到琐碎的开发需求中,并能基于算法同学需求进行平台化高度的升级与建设,和算法同学一同获得成长。
然后我们再讲讲团队内部的合作,在学界迭代模型可以各做各的创新各发各的Paper,但是工业界生产模型只有一个而迭代的同学众多。这会遭遇两个问题,一是耦合上线的周期可能大于各自迭代的周期,另一个是可能存在效果的重叠。针对这个问题,一般有两种迭代范式,一种是抓准一个方向投入大量人力去深挖,这叫西西弗斯范式,好处是可以把问题做深做透拿到显著结果,坏处是人员过于集中,成长和贡献都会分散,且如果技术选型前期就判断错误那么就是一条路走到黑。另一种模式是目前很多leader采取的鸡蛋不放到一个篮子里,把人员打散各做各的,当然针对上面的问题我们会采取正交拆分的方案,比如做模型的,做特征的,做样本的认为这三者正交程度较高,这叫元策略范式。 好处是总体收益期望基本是正的,且风险较小,每个同学都得到了足够的锻炼,但坏处是无法把事情做深做透,大家可能会认为做深做透跟总的"人x日"资源有关,所以投入更多的人在短期深挖和单独投入一个人投入足够的时间深挖是等价的。但其实职场人是感性的,且在有严格绩效考核的职场,如果一个同学短时间无法产出成果就会开始否认自己从而倒逼Leader close一个潜力方向,即所谓"反摩尔定律",越晚的产出越没有价值,即使你相信这条路能走通,但如果不改变攻坚方式还是偶尔分派部分人力去挑战,可能依旧难以获得成果最后关上大门。所以我认为合理的团队内部合作是西西弗斯范式和元策略范式的结合,虽然听起来像一句废话,但这里面的配比依赖于你对组内同学的认识以及技术方向的理解,这非常考验一个Leader的经验,一般来讲对于技术难度较低且想获得ownership锻炼且心性坚毅的同学尽量让他们在少量人力资源下去挑战一个中等难度的技术方向。对于高难度的技术选型集中优势同学和潜力同学一同掘进。在方向渺茫时要综合同学的状态及时的调整和断舍离。
二、点击率模型优化方向

点击率预估模型在离线系统实际是一个自循环过程,用户行为产生的日志生成样本驱动模型训练,训练好的模型部署在线上服务用户个性化投放,投放的结果给到用户回到起点产生日志。因此我们的生产链路主要分为两部分离线训练和在线服务。不过需要注意的是虽然逻辑上是自循环系统,但由于潜在的召回和出价等扰动,使得并未完全产生数据闭环。以下是我们团队在离线系统架构,大家可以简单感受下。


由于不同团队的迭代和系统架构有所不同,上图我就不再展开,例如部分团队的样本来自于在线请求打分的直接落盘,而我们团队从迭代性考虑在样本生产上还是主要采用feature join的逻辑。整体迭代体系可以形象成下图的组织结构:"RTP计算平台 & 样本、模型、特征三兄弟 & 训练引擎XDL"。


如果将点击率预估模型看成一辆赛车,样本就是燃料,模型就是车架,特征就是轮子,要想跑的快缺一不可。但是我们不能瞎跑,还要有方向性地到达终点,因此还需要方向盘,而这个方向盘就是Loss,Loss的设计对应了我们想要的优化目标,而点击率模型在优化目标的追求上又有预估准度,排序能力,冷启泛化等标准,具体的评价指标有AUC,GAUC,logloss(上线后的PCOC)等。这些标准的重要性评判依赖所在的场景业务需求。因此围绕以上3+2的迭代结构以及这些优化目标,我将点击率优化的具体技术方向拆成如下几点,后续文章也会沿着这个顺序进行展开。当然机器学习的研究方向众多,而点击率模型做为其具体落地的应用可优化点也很广泛,这里只是挑选了主要方向:

[*]如何在工业界优化点击率预估:(二)样本
在机器学习中,训练样本决定了模型的效果上界,因此如果能选取合适的且质量较高的样本可以提高点击率模型的预估能力。本文主要分为三大类(1)有标签样本(2)无标签样本(3)外域样本三大类去介绍如何从样本层面进行点击率模型的优化。内容涉及到数据清洗,数据组织,数据时效,标签生成,数据扩增等一系列方法。

[*]如何在工业界优化点击率预估:(三)特征
正如上文的比喻,特征是模型这辆赛车的轮子,因此越好的轮子才能跑得更快,从另一个角度特征是预估的先验信息来源,只有足够的信息才能支撑我们在模型上的创新空间。本文从模型的物理意义划分多类进行介绍,分别是(1)用户特征(2)Item特征(3)场景特征(4)交叉特征(5)级联模型特征。最后会在介绍一下特征的生产和服务。

[*]如何在工业界优化点击率预估:(四)兴趣|序列建模
兴趣建模是我们团队迭代的强项也是核心赛道,其建模核心就是基于用户的历史行为序列挖掘用户和目标商品的兴趣相关度,我们团队从用户的多峰兴趣、兴趣演化、长期兴趣等视角出发持续发展出了很多工作,当然业界也在这一方向有不错的产出。但是以上工作更多聚焦了正向兴趣,但兴趣建模可以更广泛。因此本文从(1)用户正兴趣(2)用户负兴趣(3)商品侧兴趣 三部分介绍。

[*]如何在工业界优化点击率预估:(五)特征交叉建模
特征交叉建模通过参数化的形式隐式学习特征的高低阶融合信息从而提高预估能力,是点击率预估模型的重要技术方向,本文介绍了近年来特征交叉的热门技术方案及其挑战,分析模型是如何通过提高非线性特征交互的隐式学习容量来探索特征协同交互的潜力。

[*]如何在工业界优化点击率预估:(六)多场景建模
在工业界的推荐应用中经常会面临多业务、多场景的情况,为了减少迭代和维护的压力以及寻求数据共性上的学习增益,通常会集合成一个模型统一服务。但是由于不同场景的数据分布差异较大,容易造成建模效果有好有坏的跷跷板现象。因此需要研究如何捕捉数据共性带来提升,并保留数据特异性避免负迁移的建模方案,对此大家一般统称为多场景建模。本文主要从简到繁介绍多场景建模的进化过程以及背后的思考,并简单描述对应的工程改造。

[*]如何在工业界优化点击率预估:(七)图建模和预训练
在大数据时代,任何的联接行为都可以形成一张图,社交媒体有社区网络图,电商场景有用户商品的异构关联图,这些图除了能帮我们勾勒群簇关系,也能被我们利用起来辅助提升点击率预估模型的能力,而提升的手段包括预训练或端到端引入,因此本文主要从这三部分展开(1)图结构端到端训练(2)图结构表征训练(3)模型结构参数预训练。

[*]如何在工业界优化点击率预估:(八)Debias&Loss&校准
从标题可以看出本文主要从(1)Debias(2)Loss(3)校准 三部分展开,将这三部分集合一章是因为存在一定的关联内因,一言以蔽之则是Debias领域里部分方法都涉及到修改训练Loss,例如IPS等技术,而Loss一旦偏离基于点击监督的伯努利分布基本都会有打分准度的偏移,所以需要用到校准技术来进行纠偏。当然内容上不是补丁式串联,而是分别讲解各个技术给点击率预估带来的影响和优化空间。

[*]如何在工业界优化点击率预估:(九)集成学习&模型压缩
本文介绍机器学习技术中一柄矛和一把盾是如何应用在点击率预估中,矛自然是集成学习,在有监督学习算法中,想要学习出一个稳定的且在各个方面表现都很好的模型是较难的,因此可以用集成学习将多个模型组合到一起得到一个更好更全面的模型。盾则是模型压缩,随着模型增量复杂化发展,系统承载能力挑战不断加大,需要对应在效果无损的情况下进行压缩提升服务能力。
三、总结

除以上技术方向外,还有其他的点击率预估优化技巧,比如基础机器学习改进下的正则,Solver优化;比如业务驱动下的分坑预估和创意优选;比如端智能里Meta learning解决稀疏学习;比如冷启动里DropNet或者我们自研的Gated Robust Model等等,如果时间合适,这些内容我也会考虑继续在后续文章里呈现。对于已经撰写的内容,由于我所经历和了解的毕竟有限,因此能呈现的方法未必全面和最优,只是希望把我所认识到的优化角度以及思维过程分享给大家,希望能带来帮助。内容里也有我对一些方向的思考和想法,欢迎大家探讨,互相学习共勉。最后如果把这个系列当成毕业论文的话,应该有个致谢,感恩RANK团队以及公司过去所有陪我成长的同学。

jquave 发表于 2022-4-12 17:46

支持!

pc8888888 发表于 2022-4-12 17:50

这个系列太牛了,干货满满

Zephus 发表于 2022-4-12 17:57

写的很实在,干货很多
页: [1]
查看完整版本: 如何在工业界优化点击率预估:(一)开篇