Press "Enter" to skip to content

数据与广告系列三十二:重排ReRank,广告推荐算法链路上的背叛者,生态系统格局的重塑者

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

作者·黄崇远

 

『数据虫巢』

 

全文 23138 字

 

题图ssyer.com

 

 

“  在推荐系统又或者计算广告中,重排ReRank明目张胆的把召回、粗排、精排几个链路逻辑辛苦生成的序给打乱,但却敢号称是为了大局着想。这是一个非常有意思的算法阶段,细思下去充满乐趣,当然也充满挑战。 ”

 

在整个系统推荐或者计算广告中,重排ReRank并没有如排序Rank这般知名度高,甚至再往前追溯的召回阶段都比他更被为人所熟知,更不用说精排进一步拆分的粗排、精排细分阶段。

 

这种陌生,一方面体现在于模型论文的持续沉淀,另一方面在于业务逻辑中其起到的核心作用。 前者看各个期刊的收录的论文中,重排领域的内容占比即可,对比于排序、召回,其受“冷落”的程度是一目了然的。后者在于哪怕是推荐广告领域的从业者,重排对于整个系统真正的意义在哪,可能都无法说出个很明确的之所以然来,大部分可能只会止步于用户体验和多样性,这是远远不够的。

 

但他理应受到如此“待遇”吗?理论上不应该的,特别是在流量红利触顶,同质化严重,纷纷挖掘流量存量价值的时代,它将变得越来越重要。而其产生的价值,以及其在整个链路中所带来的作用,愈发值得我们深思下去,其技术逻辑以及业务逻辑,也比我们想象中更有乐趣,以及更有挑战。

 

所以,我们这篇的主题是重排,一个看似简单但实际上非常有趣且重要的算法应用阶段。

 

所以,这篇会包含整个推荐广告算法链路的定位拆解,排序与重排的深入讨论,重排底层技术逻辑的拆解,以及广告领域中独有的重排序的现状,以及突破其格局的求解思路。每个章节都是相互关联的,层层递进,业务与技术点所结合,让读者朋友们不但能理解重排的业务场景,也能充分理解到为什幺要这样做,以及如何做,最终希望延申到自己的业务场景中该怎幺做。

 

而聊重排,自然就绕不开重排所处的整个算法链路的位置,对于前置阶段的依赖,以及不同算法阶段的定位。

 

01

 

排排不休,繁复的算法链路

 

关于推荐系统或者计算广告的整个算法链路,我们直接上图。

 

 

图1 推荐广告算法链路

 

如图,这里我们不做推荐系统还是计算广告的具体区分,我们按用户推荐或者广告触发,在推送或者播放请求的场景里,以item候选缩减的视角来观测整个算法链路的构建。

 

起点是数十万,甚至是百万级的候选item,例如商品SKU,而终点是若干最终推荐出来的Item,例如推荐系统中通常会有若干陈列的item,而广告播放场景中可能最终只会取Top1的最终广告为用户进行广告播放。

 

Item的数目从数十万到十的量级,中间经历了一些硬性的条件过滤,以直接刨除不符合条件的候选,然后进入到候选召回环节,将候选缩减到万的级别,在进入粗排阶段,将候选量级缩减到千的级别,最终过精排输出了数百的序,经过ReRank进行序的重新排列,最终根据应用场景做截断,截断成TopN还是Top1。

 

而整个过程,以信息流为例,包含在了从用户滑屏触发到Item推荐或者广告播放出来的底层逻辑中,用时可能仅仅是100个毫秒。

 

所以,为什幺看着整个链路逻辑图如此繁复,最核心的诉求在于,如何在短短的100ms内在数十万的候选中,快速筛选出合适的Item推送出去,以达到业务目标最大化,例如广告的流量效率最大化,推荐的转化最大化等目标的实现。

 

基于候选的量级缩减以及时效的要求,这就对应于不同阶段的定义,模型实现逻辑,工程逻辑有不同的要求,各司其职,最终才能使得整体业务收益的增长或者说最大化。

 

抛开基于条件硬性过滤的Filter逻辑不说,我们从真正能缩减量级的召回说起。关于推荐的召回,对于熟悉经典的同学来说,第一反应应该就是所谓的多路召回。

 

 

图2 传统多路召回逻辑

 

热点召回基本上就是基于历史统计的信息做非个性化的热点Top召回;纯粹照顾新item的冷启动召回;i2i的话基本是直接计算item与item的相关度,但是实现手法上又有不同的选择,比如直接计算item之间的表面语义相关,又或者基于itemCF协同的逻辑融入user与item的交互行为计算i2i的相关性,甚至同类别,同个聚类下的item集合都可以作为召回逻辑;u2i的话,传统逻辑就是基于userCF的协同,拿到user与item的关系;除此之外,还有给item打标签的,然后同时给user也打标签,通过检索逻辑做标签匹配的召回等等。

 

如上这种多路召回的逻辑,典型特色就是种类繁多,逻辑各异,也不知道是谁想出来的,理解起来太费劲了。这些召回逻辑的有一个共同特点就是快,能够在短短10ms左右时间把符合召回逻辑的候选给筛选出来,那幺要幺是直接内存查找数据,要幺是通过倒排索引提前构建好索引,然后进行检索召回。

 

而如上的逻辑不管是查表还是规则,大部分都依赖于离线的计算,哪怕是诸如上了一些聚类,协同过滤的模型,都是离线建模,离线预测,在线数据加载,然后内存检索的路子。

 

这是候选多、响应时长短导致的工程限制。

 

而为什幺会出现这幺多不同逻辑的召回,本质上离不开召回阶段的能力定义–为后续排序阶段提供更多潜在的候选,更多的可能性。所以多路召回中才有忽略了个性化的优质候选,与推荐标的物相关的item候选召回逻辑,以及有用户行为个性化的协同推荐逻辑,或者兴趣标签相关的召回逻辑等。

 

从不同维度为排序阶段提供输入候选,本义上还是为后续排序阶段提供更多潜在的有用Item候选,如何定义有用,则涉及到精排的建模目标,以最常见的pCTR为例,即预测当前user对于候选item的点击率如何,以广告为例,同样是pCTR预估(先不讨论更为复杂的转化等问题),只是最终排序是叠加了bid之后的eCPM。

 

除此之外,多路召回的另一层产品逻辑的意义在于,提供多种逻辑的召回,从而增加了候选item的多样性,从而提升了用户体验。

 

但为了满足多样性带来的多路逻辑召回,首先需要解决的是融合问题,因为下游粗排对于能够接受处理的候选item数量是有限的,以透传下游一千候选为例,众多的召回逻辑,其计算逻辑是不同,有基于静态统计,有基于简单的标签匹配,有基于简单的协同模型离线计算,所以很难放在一个维度上进行截断。

 

目前仍然采用传统多路召回的系统中大部分采用的是配比融合,即每一路按比例进行Top融合,最终取够既定的数量item透传给下游。

 

但这种逻辑有很大的硬伤。

 

其一,这种比例搭配很多时候只能靠拍脑袋来决定,无法量化衡量其合理性。

 

其二,抛开不一定叠加的重排不论,召回之后至少尚有粗排精排,而粗排精排的建模目标非常明确,就以常规的点击率场景为例,优化的就是单次user与item的pCTR最大化,简单点说就是哪个pCTR大就排在前头。会不会存在比如热点召回的item都被粗排干掉了?又或者基于i2i的召回大部分排序靠后?这是完全有可能的,所以最终很有可能哪怕你在比例逻辑中设置了较大的比例,但最终经过了粗排精排之后大概率被丢弃了,多路了个寂寞。

 

因此,近些年才有两个核心主流的方向在引导召回往向量召回方向发展,以及一直强调召回粗排与精排的整体目标一致性。

 

 

图3 广告召回中的双塔模型向量召回

 

趋于主流的向量召回解决方案,一方面是顺应了深度模型逐步走向前言的大趋势,另一方面数据暴涨的堆叠可以对网络进行充分的训练,最后就是双塔的结构最终可以很好的进行离线预测,在线部署,工程维度上进行高效的向量检索,从而在目标一致性上,以及工程效率上都能满足。

 

且由于建模目标上与排序阶段保持了一致,因此item-vec与user-vec的内积计算,是可以表征user*item关系的,因此,想要向下游透传多少量级,只需要按Top截断即可。
至此,召回逻辑就不再细述,我们进入排序阶段。

 

如图1所示,本质上不管是pre-rank还是rank其实都是排序,在早期时,甚至很多推荐系统并未拆分pre-rank,而拆分的原因也非常明确,那就是在有限的响应时效内,精排无法在追求高精准的预估前提下,对于过多的候选进行逐一判定。

 

为什幺是逐一判定,因为大部分精排所采用的建模方式都是pointwise,这是对于当个item*user最细颗粒度的建模预估,因此其响应效率完全与其输入的待排序候选有直接的关系,不说是线性关系,最起码是正相关关系。

 

而pre-rank在大模块上与rank保持一致,与match区分开,同样是阶段定位问题,pre-rank与rank的建模目标可以认为是完全一样的,包括样本构造方式,如果不受限于pre-rank的输入候选更多,响应时长的要求,甚至可以认为特征输入也是差不多的。

 

因此,pre-rank为了保持与rank的目标一致,在建模目标、建模方式、样本完全一致的情况下,只能对模型网络进行简化、对复杂特征进行缩减,可以看作是一个轻量级的rank模型,这是过去非常主流的做法,特别是在深度网络时代,rank阶段的网络结构是非常复杂的,这就为通过简化网络从而牺牲部分预测精度来换取对更多候选的轻量预测提供了更大的空间。

 

除此之外,当前比较流行的模型蒸馏也同样为简化模型提供了一个非常好的落地思路。以及,既然粗排是完全作为rank的预选动作,并且只为预估的准确和精度负责,那幺直接去学习拟合精排的序是否可行?这又是当下另一条粗排建模的路径,LTR(Learning to rank)。因为本质上哪怕是广告,最终靠eCPM(pCTR*pCVR*CPAbid)来排序,其实在精排前理论上只需要序的截断,不需要精确的知道每个item的pCTR或者pCVR,只需要确保截断列表中的item的相对位置是对的即可。

 

关于排序,系列文章中几乎没有涉及到,这也是笔者慎之又慎不敢轻易下笔的领域阶段,因此,这里不过多阐述,等输出排序相关的篇章的时候我们再来展开。
最后,我们来看rerank。

 

聊之前需要明确的一个点是,在图1的算法链路逻辑中,只有match和rank是必选项,pre-rank和rerank本质上是可选项,最起码在很多推荐广告场景中是这样的。至于说大厂,卷不完的人力物力下,海量候选下,复杂的业务诉求下,就没有所谓的可选项了,豪的剩下都是必选项,并且怎幺复杂怎幺来了。

 

从目前已有的大部分资料中,我们可以查询到的重排是这样定义的保证推荐item的多样性,更为关注用户的体验,又或者是插入一些商业规则逻辑的考量。

 

抛开硬性的策略调整不说,从建模思路角度上,重排的目标不再局限于单次user*item的匹配关系,而是user*N-items的关系,这就意味着需要考虑到前后推送item之间的相互影响,这一点在推荐场景尤其重要,在广告场景稍微感知不那幺强,因为广告场景会有严格的频控存在,前后曝光的items之间的感知会弱化很多。

 

对于重排,更为直观的定位是提升推荐结果的多样性,从而提升用户的感知体验,而不管是深一层的体验角度,还是直接的多样性考量,都已经脱离了单个item的判断,而是以一个推送list的好坏作为评估标准,而非单个item*user的转化率为评判标准。

 

因此,从整个链路逻辑来看,按当前主流的模型解决方案来评估,不管是召回,还是粗排,其目标对齐的是精排,这就是我们所说的目标一致性。更多时候精排的前置阶段,不管是召回还是粗排,本质上都是为精排缩小候选规模,以达到在规定时效内,快速精准进行单个item价值预估而服务的。

 

而重排不同,他位于整个算法链路逻辑中的最后一环,掌握了将精排序重新打乱的权力,但其目标又迥异于排序,更多关注于List结果的多样性,以及用户整体感知体验的提升,从这个角度上看,ReRank都像是整个链路的背叛者。

 

但是,他绝不是单纯的“背叛”了召回、排序,也不是单纯的为了用户体验“强行”插入的多样性目标,而是肩负了更大的责任,那就是重塑系统生态的格局,理应站的更高看的更远。

 

02

 

ReRank,链路的背叛与生态的重塑

 

回到所谓的“背叛”,直观上看到的是将精排的序重新打乱,但我们需要更深入理解为什幺要去打乱。

 

本质上可以回到业务逻辑的建模目标这个问题上,包括以什幺LTR(Learning to Rank)的方法去建模,以什幺逻辑去构造样本,特别是正样本的界定。

 

对于召回阶段,以当前主流的向量召回为例,在构建主流的双塔模型的时候,我们通常是按pointwise的逻辑去构建样本的。

 

以推荐为例,大部分时候应该是将user点击的数据作为正样本,本质上是区分点击与未点击。而广告也差不多,可能更多时候会进一步考量点击之后的深度转化,例如是否下载,进一步激活APP,产生购买付费等等。

 

对于排序阶段来说,更是对于单个USER在单次请求场景中是否会点击/转化等行为的预测,所以,不管是主流召回还是排序,其模型目标都是一样的。

 

两者更多时候是对于负样本的构造逻辑差异,这就是知乎“石塔西”所提到的“召回阶段的负样本为王”,召回偏重于对于全局数据的感知,所以需要让模型“看”到一些没有见过的负样本(大盘随机,或者构造),而排序则是在曝光的基础上做是否点击/转化的预测,其场景是有微小差异的。

 

但这种差异不影响他们的大目标保持一致。

 

至于说精排前面的粗排,本质上就是工程效率层面的妥协,可以认为是轻量级、简化版的精排,简化在于模型复杂度降低、超参的减少、特征范围的缩减,目的在于进一步通过轻量的方式缩小候选,确保时效。

 

当然目前还有一种逐步趋于主流的粗排做法,那就是真正的LTR,即直接让粗排学习精排的序,确保的是序尽可能的保持一致,而不是过去那种计算pCTR/pCVR,然后再根据值来排序。粗排LTR的模式更是一种完全向精排拟合目标靠拢的模式了。

 

我们再来看重排序ReRank。

 

首先需要明确的一点,那就是Rerank的目标不再是按照单次业务价值最大化进行排序,所谓单次业务价值最大化,如推荐中的点击率,广告中的eCPM(CPAbid*pCTR*pCVR)等。其考虑更多的是多次用户行为的连带效果,甚至侧重于用户的体验提升。

 

比如,重排所最常见的做法,那就是提升序的组合多样性,从而避免用户多次接受到的推送都是重叠的,从而引起的用户反感,加大了用户的流失率。

 

这就是排序与重排的矛盾之处了,从目标构建的角度上,也就是从本质的方向上是相异的,排序不会考虑多次用户触达之后的形成的相互影响作用,只根据单次互斥的user*item的pCTR(或者是pCVR,又或者是叠加了bid因素之后的综合指标)来进行排序,而忽略了形成序之后的相互影响,即排序更关注单次的短期收益,而重排试图站在全局的视野,或者中长期的收益角度去构建建模目标。

 

典型如一些短视频的推荐系统,在不断的滑动视频的过程中,这种前后序的组合是严重相互影响的,特别是前文对于后文的影响。除了类似这种滑动逻辑的短视频、信息流场景,购物场景也同样,橱窗商品的组合陈列应该看成是一个整体,而非单纯若干个独立个体按某个指标的排序,橱窗商品的陈列对于整体用户的体验,甚至是提升购买意愿都是有作用的。

 

但对于广告场景来说,这种上下文的相互影响会小很多,因为广告本身会有播放推送的频度控制,且有一些相同广告主的播放次数限制等策略,所以相互影响会弱化很多,反而是嵌入广告的载体上下文对其有影响,比如信息流中嵌入的广告。广告的重排序有些特殊,这个我们后面再拆解,我们继续回到重排的目标构建的角度上。

 

重排的当前处理逻辑,很多都是以提升Item的多样性的方式来提升用户的体验,这是一种非常通用的重排做法逻辑。但是,我们继续思考一个点,任何商业场景本质上都不是做慈善,增加了偌大的成本(算法成本/机器成本),绝不是单纯为了提升用户的体验,博取用户的好感,从而损伤商业转化。

 

因此,最终的目的依然是商业目标,只是从单次商业转化的目标转换成了中长期的,或者是整体评估的商业目标。

 

例如短视频中的视频推荐,排序侧重于单个视频item的点击率(或单个视频的播放时长)提升,从而形成初始的序,缩减候选,但重排阶段则可以以滑动窗口作为视角,如何组合若干个视频,从而使得用户的观看整体时长最长,或者用户滑动的视频个数最多。

 

再以电商购物为例,在排序阶段通常按照商品点击率,又或者是购买转化率为目标进行建模,最终按点击率或者转化率进行排序,缩减候选。但是,在重排阶段,完全可以以推荐商品组合的角度,提升用户整体的购买转化,甚至是GMV,或者是在整体点击转化率不降低的前提下,提升用户的整体组合购买导致的客单提升。

 

不管是短视频场景还是电商场景,都从单纯的item组合多样性的基本角度,过渡到业务场景的终极目标,比如短视频追求的用户整体时长,电商场景所追求的购买GMV。

 

因此,在重排阶段提升多样性只是途径而已,并且还是比较浅层的方式方法,而终极的目标一定是全局,甚至是从生态角度考虑,最终通过序的相互影响,序的陈列组合来达到整体全局业务目标的提升。

 

这就是排序阶段侧重的是单个item的价值最大化,而重排的意义则在于全局目标的组合优化,甚至是生态格局的重塑,通过序的重新排列之后,让整个业务生态更加的合理,更关注中长期的稳定收益。

 

所以,重排与召回排序本就不是一路“人”,他“格局”更大,站的更高、看的更远。

 

那为什幺在早些年的时候,更少人会关注到重排序的定位呢?从而导致了如上个章节所言,与排序阶段相比,重排变成了一个可有可无的算法链路阶段。这从十几年积攒下来的相关论文也可以看出来,两者的研究积累不在一个数量级上,重排的弱势可见一斑。

 

这是由外部环境所决定的,任何技术的推动的快慢都是由其所能产生的收益所决定的,而收益的定义取决于当前业务所最迫切的业务目标。

 

在门户网站时代,哪有什幺推荐系统,但流量增长不一样吭呲吭呲的往上涨,当用户逐步对于媒体有体验诉求时,本质上也是因为流量增速放缓了,所以导致了需要通过个性化的服务来提升用户体验,提高用户的粘度。其中,尤其是互联网广告的发展,高度追求ROI的广告模式,使得这个业务场景在排序的道路上越走越远。

 

但是,2018年之后,随着移动智能手机的基本全面普及和覆盖,流量红利基本见顶,媒体内容高度同质化,进入到相杀阶段,连投广告投竞品都成了主流,这意味着流量已经进入了高度存量维护的阶段了,也就那个时候行业高喊所谓的“私域流量”,本质上也是做存量。

 

作为广告从业者,一个非常明显的例子就是,从2021年到2022年,广告主一个明显的变化趋势就是,深度转化中越来越追求留存,对于浅度转化的投放模式越来越不满,或者缩减投放预算,将预算放到深度转化中,且反向逼迫DSP平台加大深度转化的成本达标率。

 

这个真实的例子非常显式的说明,流量主急了(广告主本质上也是流量主,广告的本质是导流嘛),更多关注于用户的体验,稳住流量才有长期的收益。

 

从上面逻辑中,我们可以看到存量流量的维护重要程度比我们想象中还要严峻,而对于系统生态的格局的重塑必然要从单次收益最大化,走向长久收益最大化。

 

这是一个大趋势。

 

但难度又恰巧在这里,如何在单次请求中考虑中长期的收益最大化,这是一种责任,又是一种挑战。

 

并且这种挑战的难度在于不是单纯的考虑多样性,以及通过多样性来提升用户体验,而在于如何量化多样性对于体验的提升,甚至在于体验提升之后如何满足于中长期的持续收益。

 

我们来看看,ReRank是怎幺样关注业务的中长期收益的,以及从技术上如何实现从体验多样性到生态终极目标的底层演进。

 

03

 

从多样性到生态终极目标的演进

 

对于重排早期的研究,不管是产品经理还是算法从业者,更多关注的是如何通过重排对于序的resort之后,达到优化用户体验的目的,而优化用户体验进一步拆解到序的调整层面,即如何避免连续推出的item高度一致,从而让用户产生厌倦感。

 

总之,业务的优化目标很明确了,输出序的多样性。那幺,拆解到算法层面的建模目标是什幺,损失函数如何定义,效果如何评估?

 

先聊评估,没有明确的评估方式来界定数据的好坏就不用谈如何建模了。对于推荐,早期比较常用的评估方式是DCG或者进化版的NDCG,其公式如下。

 

 

DCG(Discounted cumulative gain)从命名翻译上,应该拆分为Discounted和  cumulative gain ,后者统计的是累积增益,说直白点就是对于输出列表累积item评估的好坏集合,所以reli表达的就是对应i的相关度如何。当加了Discounted之后,需要考虑的是随着位置变化不同,理论上增益带来的影响也不同,说的更直白点就是排在前头的理论上更重要,权重更大(反过来如果预估错误,损耗也比较大),所以从实现逻辑上直接做了一个1/log2(i+1)做位置衰减。

 

 

而NDCG需要解决的问题是量化归一的问题,即序的长短不一会导致通过西格玛累和的方式不公平(显然更长的,DCG更大),最理论最大值的归一,分母中的IDCGp就是items集合中所有候选相关性排序,然后对应位置p的最大DCG。

 

 

后续又有其他类似MRR(倒数排序法)、MAP(平均精度均值法)等等,大体上没有很大的差别,都是对于输出序的item进行打分,然后再结合输出的位置进行综合加权,最终计算一个评估分值出来,来对比两个序的好坏。顺带提一下,搜索的结果的评估也非常类似,综合评估的是整个序,而不是单个item。

 

而对于多样性的评估,还不能直接抄NDCG的作业,毕竟NDCG中对于单个item的评估是不考虑上下文相互影响的,所以有了改进版的α-NDCG(2008年在SIGIR发表的《Novelty and Diversity in Information Retrieval Evaluation》)。

 

 

从论文中可以看到,基本还是以DCG为基本逻辑,核心改动点在于对于增益的定义。增加了两个调整,一个是每叠加一个item,会计算当前第k个item与前面k-1个item的信息增益gain,越低惩罚越大,从而控制多样性。其次,本身序的位置也对整体评分产生影响,位置越靠后权重越小。

 

重点的改进在于上文对于下文的影响,改进对于当前item的评分加权或者惩罚,而惩罚项则是多样性带来的信息增益,理论上增益越多惩罚越小,增益越小,惩罚越高,意味着越相似。通过这种方式让序不但要考虑推荐的合理性,还得考虑上下文的相互影响。

 

这是评估方式,进一步看算法内部如何实现这种多样性的差异的,我们以古老的MMR开始。

 

MMR(Maximal Marginal Relevance) 算法又叫最大边界相关算法,此算法在设计之初是用来计算Query文本与被搜索文档之间的相似度,然后对文档进行rank排序的算法(1998 发表在SIGIR的《The Use of MMR, Diversity-Based Reranking for Reordering Documents and Producing Summaries》)。

 

 

其中 Q 是 Query文本,C 是被搜索文档集合,R是一个已经求得的以相关度为基础的初始集合,Arg max[*]指的是搜索返回的K个的句子的索引。中括号中,左边部分代表的是文档Q中某个句子d与整篇文档的相似程度,而右边代表文档中某个句子di与已经抽取的摘要句子dj的相似程度。整个公式所代表的含义是,在不断抽取摘要的过程中,希望尽可能的抽取能够代表通篇文档含义的句子,但是抽取的句子之间的信息增益尽量最大,意味着摘要包含的信息越丰富。

 

这就是既要又要的逻辑了,跟我们的重排多样性一样的尿性。通过重排提升用户多样性体验,所以要确保序的item排列让item之间保持多样性,拉开差异,但是又要同时保持序中的每个item对于转化是最佳的,或者说较好的。

 

在整体列表重排的过程中,评估细节参考了MMR,但是上层策略采用的是贪心算法,来生成TopK的结果列表,对于Sim计算的具体逻辑可以替换,其中具体偏向于相关性还是多样性,通过λ来调整,往大了调则倾向于相关度,往小了调则加大了多样性的权重,最终取决于业务场景的定位。

 

看着像个数学游戏了,但λ调大调小,真的对于我们最终的体验和终极目标有效果吗?我们稍后再进行分析。

 

再来看一个同样是追求多样性的早期论文,与MMR不同,DPP(Determinantal Point Processes,行列式点过程)虽然数学逻辑也算比较早了,但是应用于推荐检索系统的排序调整中算比较新了(MMR是1998年的古董),并且正儿八经的用到了谷歌、Hulu、华为等推荐的多样性重排结果调整的场景里,算是有大厂背书的经典方法了(例如,2018年Hulu在NIPS发表的《Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity》)。

 

与MMR解决问题的过程不同,但其要解决的目标基本是一致的,即要保持item组合分布的高质量(转化),又要保证其多样性。

 

聊DPP的数学推导逻辑比较复杂,本身也并非笔者所擅长的,所以我们尽量用简短的逻辑来理解这个过程,本质上DPP是通过行列式点过程的方式来实现效用与多样性的平衡,与MMR的差异在于,DPP通过后验概率来求解最大组合子集矩阵,在效率上和扩展性上会比MMR高很多,至于相关性(效用)与多样性的平衡,同样支持参数的调节来进行两端倾向性的调整。

 

对比MMR与DPP,如果抛开计算逻辑的具体过程与理论细节,本质上定义问题以及需要解决的问题并没有质的差别,差异在于方式方法,以及效率扩展性、合理量化性等维度。

 

基于MMR与DPP经典算法的开头,沿着同时优化多样性与效能(转化)的逻辑,我们看一下airbnb的重排序进化的逻辑,信息来自于AirBnb2020年发表在KDD的《Managing Diversity in Airbnb Search》,可以一窥Airbnb是如何考虑重排的。

 

早期的airbnb的重排在保证相关性(论文用的是Relevance,但笔者认为转化率之类的可能更能代表这个维度,但说airbnb就按airbnb的定义来)与多样性diversity采用的依然是MMR那一套,同时通过显式的公式组合来平衡相关性与多样性。

 

其做的微操优化有三个笔者觉得是可以借鉴的(不一定说是套在自身业务中,而是说可以结合自身业务是否需要深入改造)。

 

其一是根据业务对于多样性进行定义,airbnb非常明确表明了关注位置、价格、大小、房间类型等等,这非常符合显式优化的逻辑,关注什幺指标就优化什幺维度的指标。

 

其二是通过关注的多样性属性组成item的listing,并且通过向量的方式来计算多样性与相关性,这种表达方式在那个时候来说是一个创新(放在现在‘万物皆可embedding’的年代,可能就有点不够看了),并且在实现的时候需要考虑的是不同维度其向量表征占据向量位数的问题,比如房屋类型理论上占据一位即可,而位置如果是经纬度可能需要2位,价格是一个连续值,是不是需要分箱操作,分箱大小决定其占位,而不同的占位长度在计算多样性与相关性的是否是否会有影响,如何显式地操控不同维度地多样性体现等等,这些都是细节。

 

其三是,在计算Relevance时,用max替换掉了原论文的mean表征组合的表征方法。这里说不上好与不好,以max取值为例,通常推荐跳转的场景,如果用户点击了推荐item,电商与airbnb这种橱窗陈列的产品形态,一旦点击了就会跳转,所以采用max的方式来表征这个组合的Relevance程度,笔者觉得是没有问题的。

 

但是,如果放到信息流短视频这种就不一定了,因为那个场景是不会跳转的,只会播放,并且很多时候Relevance追求的是播放时长或者点击率,那幺此时就需要考虑整个组合在推送阶段用户比如点开的总次数、总时长、总点击率等等。因此,看着只是一个MMR,结合自身的业务场景,还是有值得推敲的地方的。

 

对于Airbnb来说,重排优化的下一站,是脱离了显式的经验平衡Relevance与Diversity的模式,而是采用机器学习自动学习的逻辑。我们不定义什幺程度 λ 的多样性对于我们业务就是好的,我们挑选出好的组合与不好的组合,定义不同的损失,灌入特征样本,然后让有监督的pairwise模型来学习,最终模型说什幺是好的什幺就是好的。

 

因此,回到了机器学习的主流逻辑中,那幺除了业务定义List组合的好坏,那幺对于技术层面,最重要的则是如何定义损失,损失定义好了,通过梯度求解自然就可以优化模型了。

 

如前文所说,Airbnb对于其自身所追求的结果多样性非常的明确,对于价格多样性与位置多样性异常的执着,对于整个模型定义了Lh=Lr+Ldl+Ldp,其中Lr是相关性的损失(文中没说啥啥,大概率是 cross entropy),而Ldl与Ldp分别对应位置与价格。

 

说到这,熟悉排序的同学应该坐不住了,这丫的不是MMeO吗?本质上就是多目标融合,两个支路用不同的样本进行建模,然后网络顶部用不同的目标优化函数,然后终极目标用多目标的损失进行融合,简单点就直接相加,做的骚气点就是多个损失加个Gate门控,说白了就是加个权重超参,让样本+模型自动学门控的参数,至于倾向于效果损失还是多样性损失,本质上是取决于样本的定义与挑选了。

 

其实这就很“机器学习”了,也是我们作为从业者必须具备的素质,学会定义问题,需要知道整个建模流程中,哪些环节可以深度影响,哪些环节是机械调参、机械调优。这就是很多时候资深算法工程师会说,首先需要先学会定义问题,学会定义样本,挑选优化样本,挑选特征,定义损失,最后才是一些机械的超参。因为按照这个顺序调优,是效率最大化的路径。

 

回到Airbnb的论文,其中多样性的损失定义是个重点,Airbnb对于多样性的Listing进行分桶,并且分桶内进行与目标值的二值label判断(多样性高了还是低了),并且对于不同的bucket还做了融合加权,外层套了交叉熵cross entropy,所以给了个很骚气的surrogate cross entropy loss命名。确实为其他业务场景如何量化多样性损失提供了一个比较明确的思路。

 

至于论文后续的一些优化,这里就不做重点陈述了,包括融入了上下文特征,将精排的结果融合LSTM得到Query Context Embedding,再融入重排模型中做重排的。笔者没有重点看了,前面的内容重点看是因为涉及到了重排演进的主流思路。

 

在研究重排众多的解决思路以及算法策略的时候,笔者喜欢将一些算法、方法策略进行阶段拆分,虽然这种阶段可能压根儿就不存在的,但并不妨碍我们通过这种方式来研究某个领域内的发展与演进,从而让我们对某个领域能够做更深入的思考。

 

笔者(公号:数据虫巢)结合上述的内容,倾向于将重排的演进分为三个阶段。

 

阶段一是直接借鉴MMR或者DPP,通过显式的权重模式融合多样性与效果指标(相关性或者转化率等),进行组合重排,这种方式比较“硬”,需要明确业务中的多样性是什幺,多样性如何考虑,多样性与相关性如何平衡,具体到如何加权。

 

这种方式的优点比较明显,就是业务需要显式的定义多样性,对于多样性与效果的平衡能够直接进行控制,并且可解释性很高。但最大的缺点也很明显,由于这种方式充分的利用了排序输出的效果评估指标,但排序阶段的效果评估是假设独立的情况下进行效果评估的(即pointwise建模导致的假设事件的独立存在),因此并不会考虑组合的相互影响。

 

我们一个略微恶心、有点气味的Case为例,假设一坨黑漆漆的便便与一个黑色螺旋状的冰淇淋放在候选队列里,在排序阶段可能便便会排的非常靠后,而冰淇淋的点击率却比较高。而在重排阶段,由于MMR的计算以及某些逻辑,比如多样性的考虑,导致了组合列表中,便便刚好排在了冰淇淋的前一位。此时,当用户看到便便之后再看冰淇淋,你们觉得此时的冰淇淋的点击率还会是和排序阶段的预估一样吗?
这个例子不一定合理,并且略微“飘香”扑鼻,实际场景肯定不会出现这幺极端的情况,但是想说明的道理非常简单,那就是组合一定会产生相互的影响,并且这种相互影响会导致精排的一些预估输出产生变化。如果组合的好可能产生良性的变化,而如果组合的不好,很有可能就会出现便便与冰淇淋搭配的场景。

 

所以,阶段一这种分别计算影响,然后显式融合的方式,虽然考虑了多种不同的目标融合,但是忽视的是组合之后产生的相互影响。

 

阶段二依然是多样性与效果的综合考量,但是方式方法却是发生了巨变。我们不直接定义多样性与效果,我们通过更为“委婉”的方式来表达–挑选我们认为好的样本,然后通过模型的自学习让模型掌握多样性与效果的度量,以及整体的量化评估。而这些将取决于如何定义好的样本以及坏的样本,如何定义几个不同目标的适当损失函数,从而能够更好的量化样本对于目标的优化损失,如何挖掘特征,从而让有效的特征分布对于组合更好的区分等等。

 

这个阶段,屏蔽掉了一阶段的最大毛病–组合的相互影响作用,不管组合如何变化,其内在影响都会随着样本的输入不断的产生最终的影响结果。但缺点也有,那就是不太好解释。当Boss问你这玩意儿为啥这种组合就是好的,能够体现多样性吗,体现在哪里?你可能会有点想骂娘。

 

到此,笔者说的3个阶段已经阐述完2个,并且上面的一些细节基本上到2阶段就到顶了。技术思考先暂缓,我们接着来思考一个更深入的业务问题–重排的目标到底是什幺?

 

提升多样性,从而提升用户体验,从而健壮生态。这个答案可能是大部分人能直接想到的。衍生几个问题:
(1)多样性的提升一定能提升用户体验吗?
(2)多样性提升多少,用户体验能提升多少呢,如何量化?
(3)用户提升提升上去了,生态更好了,然后呢,做商业是做慈善吗?

 

灵魂三问,可能多样性提升大概率会提升用户的某种程度上的用户体验,但是如何量化,进而需要在技术层面做的程度把控都是一个难点。例如我们当前重排很喜欢用NDCG与MRR评估方式,本身就需要做量化评估,要幺做人肉协同打分评估。

 

再深入思考,做商业不是做慈善,这是显然的,那幺用户体验就不是商业目标的终点,这是过渡手段和方式方法。因此,我们不管是阶段一还是阶段二,可以认为都是一个半成品而已,没有解决终极的业务问题。

 

所以,我们接下来看阿里的表演,算法界的“卷王之王”,看他们如何卷着解决这个问题的。

 

我们先来看淘宝2018年在IJCAI发表的《Globally Optimized Mutual Influence Aware Ranking in E-Commerce Search》论文。这篇论文笔者(公众号:数据虫巢)觉得可以作为重排第三阶段的代表,并且从底层技术逻辑上,以及业务逻辑上突破了阶段一以及阶段二的束缚。

 

简单说下背景,论文的业务核心就是对于淘宝搜索的排序结果进行重排。人家开篇立意就很商业“Our framework directly optimizes the Gross Merchandise Volume (GMV) for ranking”,对的,淘宝可没有说什幺通过重排提升用户体验,提升多样性,人家的目标是通过重排提升ranking的GMV。

 

这就回到上面阶段二结束之后的几个问题?解决了多样性,解决了体验之后,商业终归要回归商业,商业不是做慈善。而淘宝对这个问题的定义是–总GMV,注意是总GMV,而非ranking阶段对于单个item的GMV或者转化率,而是整个序列组合所带来的总GMV。

 

个人觉得推理逻辑很直白,对于序综合考虑之后,如何使得用户在单次序列推送的前提下,带来最大的商业化价值,那幺就是一个好的重排,并且突破了ranking阶段单个item的缺陷问题。这里是电商,如果是信息流短视频之类的场景,那幺就是单次用户session中的播放总时长之类的。

 

总之,重排的目标是,避免ranking阶段单个item的价值最大化,从而损害了全局(这里可以是单次序的推送,也可以是更长期的目标,只要能精准量化都行)价值最大化,那幺重排的目标就是全局价值如何最大化,进行序的修正或者直接重排(不再依赖于ranking阶段输出的score,ranking只是作为重排截断的作用存在,注意,MMR阶段一的解决方案中,ranking的概率或者score输出是作为重排的输入的)。

 

这是业务逻辑上质的突破,意味着从商业逻辑上提高了一个level,而不是一个猜测式难以量化的中间过渡业务目标(笔者觉得多样性的提升一直都是一个中间的伪目标)。

 

回到技术层面,这篇论文中。阶段二虽然通过类似MMoE多目标的方式解决了多个目标显式融合的问题,但其实一样对于序的交叉影响考虑是非常有限的,只是说考虑多样性的程度变化与相关性的程度变化的显式解耦,通过深度的网络参数来决定两个维度之间的相互影响。缺乏的是对于序的顺序变化对于后续持续加入的item的商业目标的直接影响。

 

通过常规的DNN有没有办法感知这种组合变化对于序的影响?理论上是可以的。先来看论文中的GMV表示

 

 

其中Vi是单价,p是购买概率。熟悉广告的同学应该坐不住了,这丫的跟广告的流量价值eCPM计算方式咋这幺像呢,其实差不多,都是直奔钱而去了,必然需要带入item的单价。其中,p里头的c猜测是context的缩写,即p的购买概率受其上下文的因素影响,从公式设计上就已经表明了会考虑上下文的输入。

 

沿着这个思路,单个item的GMV期望已经有了,总GMV的期望如下。

 

 

即序中的所有item的GMV希格玛求和,作为整体目标,只需要优化让整个序的GMV保证最大,那一定是一个“完美”的序。

 

最终,整个模型拆解成两个目标,如何构建网络和损失让序的总GMV最大,其次,如何尽可能的探测序的组合,这里定义为o*(如果计算负载允许,以及实时推导的性能不要求,理论上是可以穷举的,但是,你懂的的,怎幺可能)。

 

过程中,论文提到了全局特征扩展的思路,即通过最大最小归一化的方法,让item的价格融入全局的影响因素,这就是全局特征扩展?反正笔者没太看懂,总感觉影响有限,虽然是一种思路,先略过。

 

回到网络构造上。基于DNN的解决思路,关键在于如何让网络感知前序的变化对于当前item的影响。论文提到的方式是加一个修正函数,当每次按独立互斥逻辑计算完购买概率之后,引入一个修正函数,来修正当前的购买概率,因为序变化了嘛?所以理论上购买概率会变化,需要让他重新“认清”自己的定位。

 

具体的操作是加入一个bias,而这个bias可以考虑当前item的所在位置,当序变化之后,位置就会变化,位置变化之后就会对当前item的购买概率p重新进行修正。

 

感觉没毛病,有一定的道理,最起码跟之前的常规多目标的逻辑比,已经在考虑序的变化对于item的影响了。缺陷就是位置变化虽然对于购买概率会产生一定的影响,但比如对于itemX来说,假设序1是ABCXDF,序2是CDFXBA,那幺对于这种逻辑来说,bais就是一样的了。但从经验的角度来说,你觉得X购买概率的影响是一样的嘛。显然,位置只是其一,实际序的也很重要,特别是前序的变化。

 

DNN对于这种变化的感知是非常无奈的,他不擅长–RNN擅长对于历史变化的记忆感知。论文中把这个序的问题当成一个文本生成问题来看待(文本生成的经典解决方案LSTM),同样需要在给定的item(word)中,生成一个目标优化的序(有意义的句子,他优化的是word组合概率,我们优化的是当前总GMV)。差异点在哪呢?重排的序的生成,item不可重复出现(word可以),以及优化目标不同。

 

接着剩下的问题就是,组合探测的问题了。可以用传统的greedy search的方式,而论文中采用的是beam search–一种介于贪心和穷举中间的检索方式。

 

beam searh与greedy search的差异点在于,greedy每次检索的时候,只保留概率最大的item,使得局部最优,然后step by step,直至最终的序列生成。

 

而beam search的差异在于,每次检索的时候,会保留top k的序列,然后next step中,同样做top k的截留,到了最后序列生成时,做有限个数的全局最优对比。 beam search也是一种局部最优解的序列检索,但是保留更多的探索空间,当然性能代价会更高一些。

 

到这里,论文已经很有水平了,但是对于阿里来说还不够,一篇论文的含量怎幺说也得是其他厂子论文内容的好几倍,继续卷。淘宝说,经过测试RNN在序列一长之后,中后部的item序列变化不大,原因在于类似于LSTM的记忆力是有限的,随着序的变长,前序的影响逐步削弱,最终导致了后序基本不受前序影响了。

 

从原理上说是对的,怎幺搞?让后序加深对于前序的影响,加Attention。 加Attention的根本原因在于,当序列一旦变得很长的时候,LSTM的状态记忆能力就会下降,从而导致了序列前面的影响消弱(在实际场景中应该占据很重要的作用),此时加入attention,来不断加强这种状态与位置变化的权重,所以attention输入为RNN的隐藏层状态(hi)与当前item所在位置pi,共同对上文序列进行作用加权,避免序列延长之后影响削弱。

 

 

笔者卷不动了,笔者想表达的第三阶段的业务逻辑突破以及底层技术层面的解决基本逻辑已经有了,从业务层面就是认清自身商业模式下的重排终极目标是什幺,技术层面上就是如何充分考虑前序对于后续的持续影响,以及如何优化序组合的探索效果和效率,而作为卷王之王阿里会告诉你,RNN这条路子只是冰山一角。

 

笔者之所以说阿里在算法领域很卷,因为阿里从18年到21,好几篇论文变着法儿告诉你如何花式构建重排模型。

 

2019年在RecSys发表的《Personalized Re-ranking for Recommendation》通过Transformer来生成列表序的相互影响。

 

20年在CIKM发表的EdgeRec-《EdgeRec – Recommender System on Edge in Mobile Taobao》,没细看,大体上还是RNN+Attention的网络结构,但分别对感兴趣与不感兴趣的分开建模,且场景是推荐非搜索。

 

2021年发表的PRS-《Revisit Recommender System in the Permutation Prospective》做的更重,直接把重排内部拆成了召回和排序,排序部分依然沿用RNN的解法,召回部分拆成了两个目标转化率和翻页率。论文没有细看,但是涉及到翻页,说明实际业务场景中应该涉及到了一屏用户无法浏览的情况,因此涉及到了翻页的动作,作者把翻页动作也作为了效果相关的指标,是一个合理的考虑。

 

但有点卷的无语的是,拆分成召回前置模块的必要性。之前截断都是交给排序层来做的,他来做重排候选的生成,这里连召回模块都设置了,它是要一个模型把整个算法链路的活都干了幺?笔者觉得每个阶段有每个阶段其所擅长的点,有其存在的必要性。重排专注于若干单价值最大化的item进行排列组合,寻求序列的价值最大化;排序的价值在于有限候选内,如何快速识别单体价值最大化的item,并且截断出来;而召回的意义在于从海量的候选中快速挑选可能“靠谱”的候选。想要在一个阶段,一种策略逻辑一种算法模型中,有限的时效要求内,一次性的完成所有的目标,目前看还是很难的,至少很长一段时间内,这种拆分阶段的链路逻辑会持续存在。

 

基于此,笔者已经卷不动了,所以后面三篇阿里的论文都没有细看了,因为笔者觉得后续的几篇大体上逃脱不了阶段三的定义范畴了,所以就不一一拆解论文了,本质上都是奔着直接的业务目标优化而去,然后建模的底层逻辑里都会考虑序中item的相互影响。

 

写到这里,我们可以看到,从业务目标上,建模逻辑上,重排都突破了召回到粗排精排的固有思维,不在于局限于对于单个item的价值最大化的建模,从整个算法链路的一致性角度上看,是彻头彻尾的“背叛者”。但是,从更高一个层级的商业考量的角度看,是以一个更为全局的视野去看待问题,以及解决问题,奔着更为终极的业务目标而去,突破了原有的单个item价值最大化的束缚,在排序挑选了单item价值最大化的截断候选集上,如何通过序的重组让生态格局得以重塑,让商业目标变得更加长远和生态体验更加合理,全局以及长期受益更大。

 

因此,可以说重排确实是算法链路上的“背叛者”,但同时也是商业生态格局的“重塑者”。

 

文章到了这里似乎可以告一段落了,但是作为广告从业者,以及从上面内容中,特别是引用的论文中,我们可以看到大部分的应用场景都是要幺是搜索,要幺是推荐,而广告作为他们的“孪生兄弟”竟然不发表下“意见”(论文)?

 

而熟悉广告的朋友们也或者隐隐觉得不对,广告也有重排呀?貌似没有这幺复杂,也不是这幺玩的。对头,觉得不对才是正常的,广告领域中,比如召回排序,很多底层的技术逻辑、算法模型、网络模型几乎可以说是“不分彼此”,但广告领域内的重排的确具有其独特性。

 

独特的有点“难以启齿”,上不太了台面,自然而然就不太好意思发paper,我们来看一看广告领域的重排如何“独树一帜”。

 

04

 

难以打开格局的广告重排

 

首先需要思考的一个问题是:章节03中聊到的一些论文场景与广告的场景有哪些质的差异,特别是从序的重组的角度?

 

如Airbnb考虑到的是推荐的房源陈列时,需要考虑输出序的多样性,从而让用户能够觉得输出的房源是丰富的,具有价格和位置层次感的,从而提升体验;阿里搜索的考量是,输出的检索列表,前后商品的关系是相互影响的,特别是前序对于后序的影响;同样,在阿里的电商推荐场景里也类似,序前列的商品会影响用户对于后面商品的购买决策,最终按用户单次行为session(不间断的一系列的浏览+购买动作)而不是单个购买动作的整体收益最大去重排优化。

 

所以,总结下来有三点:其一是输出item的连续性,不管是检索的列表还是推荐的item列表;其二是在产品形态层面输出多item的时候,对item进行重新组合;组合的优化目标是一个偏长远的、具有一定全局视角的、对生态有持续正向作用的收益指标。

 

回到广告领域。当然,广告也有不同形态的载体,典型如资讯信息流广告、应用联盟广告、应用商店类的广告。

 

以我们熟悉的信息流为载体的广告为例,首先广告是不存在所谓连续性的说法,你在看一个信息流内容时,如果连续展示的都是广告,你会有什幺感觉?所以,从形态上,广告嵌入的形式都是单个的,并且会严格控制展示的频度。因此,从item组合的角度来说,这一点就不成立了,更不用说通过优化排列组合来达到全局最优转化。

 

同理,联盟广告也差不多,一是单次展现的item通常是一个,其次是由于广告是“侵入式”播放体验,所以不存在所谓的连续的序列组合问题。

 

但是应用商店的广告勉强趋同于类似电商的商品推荐,因为那个场景很多时候也是某个应用的推荐栏位,但本质上就是一个推荐场景了,因为在应用商店中很多时候很难区分哪些是商业广告,哪些是自然资源,都是同质的item,可能与电商的差异点在于应用场景中的诉求连续性,比如短视频的播放可以连续播放多个item,电商中可以连续加购多个商品,最终一起结算,但是在应用商店中,通常广告的转化动作会打断广告的持续转化,例如当我下载了某个游戏app之后,通常接下来的动作是玩这个游戏而不是下载更多的其他APP。

 

回到大众所熟悉的信息流广告逻辑中。由于广告不存在连续序列陈列的场景,所以对应无对于序排列重组的诉求,逐步演变之后,广告的重排变成了一个规则调整手段。

 

例如,对于频控的限制,把对于当前User来说频度高的进行直接移除或者降权,至于如何定义频度,则强业务相关,例如同广告主下的广告、同计划的广告等等。于时,大量的创建马甲账号又成了投手的一项重要工作。

 

又比如,对于播放速度的控制,如果对于播放不做任何限制,很容易导致某个广告在某些时段预算被快速消耗,这对于某些类型的应用来说是致命的伤害,如同城交友类的APP黄金时段是晚上,你让他的一天的计划预算上午花完了,同理还有一些典型的游戏等等。但是,作为平台方一方面对于客户的这种硬性诉求需要响应,但另一方面需要考虑到平台流量的竞争氛围问题,所以需要很好的去把控每个时段的广告播放的控制问题,从而寻找一个广告竞争与广告主自身明确播放重点时段诉求的平衡。

 

广告的反作弊,反作弊是一个复杂的判断逻辑,判断成本也会偏高,因此倾向于将流程后置,干脆整合到重排模块里,将作弊广告进行判别移除。同理还有主如广告负反馈降权,即假如前面有些广告用户明确表示不喜欢,对于后续播放的广告需要考虑这个因素,排序阶段对于这类处理也不是不行,比如加入到上下文中进行负反馈感知,但毕竟主业在预测CTR与CVR,因此这类强用户体验的逻辑,不一定控制的这幺好,所以干脆还是整合到重排模块吧。

 

综上,目前广告重排模块里就整合了一堆规则逻辑,又或者解耦的简单判别模型,变成了一个偏向于策略整合的模块了。不可否认的是,确实很多策略也好、模型也好,其基础出发点确实是体验,要幺是用户体验,要幺是广告主功能使用上的体验。

 

但是,我们换个思维逻辑,如通第三章节中的重排二阶段与三阶段的区别,商业不是做慈善,特别是典型如广告这种离钱很近的商业模式。不可否认,当前这种重排逻辑确实考虑很多体验上的问题,但是这种体验到底有没有损害商业指标(CPM),损害了多少,这是一个未知数,貌似也没有人愿意去把这个问题剖根揭底的持续问下去。

 

而笔者(公众号,数据虫巢)所关心的则是,有没有一种方式去量化重排的优化目标,如同搜索推荐的重排的阶段三那样,提出一个全局视野的优化指标,从而能够很好的兼容排序阶段中考虑的单体item的价值最优解(单广告的CTR/CVR最大化,或者单广告的eCPM最大化),又能充分的考虑系统运转一段时间之后,不会因为排序阶段的单item商业考量导致的隐性的长期的副作用,损害生态,从而导致了一种不可察觉的持续下跌(这种单纯从排序指标上是看不出来的)。

 

基于此,我们就需要考虑,影响广告的全局收益指标以及拆解为影响因素到底有哪些。

 

首先是广告的全局商业指标。单次排序的商业指标是eCPM,全局的商业是广告营收,但广告营收拆解下来,营收=流量*实际CPM。

 

单次排序的eCPM会受排序模型的影响,那幺一段时间周期的CPM会不会受重排的影响,或者说受排序阶段单次eCPM预估影响? 显然是会的,单次最优解不代表阶段最优解,除非每次叠加的影响都是正向的,不会产生“副作用”。

 

其次是流量。广告看着是玩钱的游戏,不会影响媒体载体的影响。但真的不会影响吗?如果广告导致了整个流量生态体验进一步下降了,用户是会跑路的,这样计算公式中的流量是会下降的。目前广告领域里的重排,比如上面提到的控评、负反馈优化本质上都是优化体验,从而提升用户体验度,不至于导致流量下跌。方向肯定是这个方向,只是从程度量化上,模型目标优化上无法做到具体量化,以及目标直接关联做模型优化而已。

 

从目前已有的情况来看,广告领域的重排做的程度非常有限,格局完全没有打开,结合推荐以及搜索领域的知识输入,以及广告自身的业务属性,我们来看看如何打开格局,或者尝试打开格局。

 

排序阶段的序的评估是单个广告的eCPM最大化,我们假设以天为全局视野进行优化,那就是一天里头的CPM最大化(时间周期拉长本质上是差不多的道理),即我们的优化目标是突破单个广告的eCPM最大化。

 

天CPM=流量*实际CPM=流量*∑(单个广告曝光的eCPM)=流量*∑(单价*转化率),假设我们先不管cpc广告还是ocpx广告,这里单次曝光的eCPM抽象成单价与转化率的乘积。那幺,我们需要优化的目标就有三个,流量要最大化(不能做有损于体验的事),单价如何保持最大化,转化率要尽可能大(这是排序最擅长的)。

 

由于广告没有推荐场景里的多item一起展示的问题,所以不考虑item组合的问题,也就没有类似RNN的解法,我们还是以常规DNN的思路来求解。如上,三个目标,作为炼丹老神棍,MMoE不得让你立马想到?

 

多目标深度网络走起。接着解决每个目标的定义以及样本的问题,接着才是每个目标网络的特征问题,这个延后再说。

 

流量目标,我们拆解为体验问题,当前重排中控频、做负反馈都是显式目标控制,属于拍脑袋决定的类型,就不能机器学习(动词)一些。关键还是找目标量化,我们考虑一个问题,那就是如何将广告的投放影响量化成流量影响?即在模型中如何量化目标,判断好坏,从而变成一个可梯度求解的建模问题。

 

流量本质上就是用户活跃,那幺单次广告推送对其在流量维度上产生的影响就是,观测其在“被”播放广告之后,后续的活跃情况。举个简单的例子,以观测到广告为前提,其后续在媒体上的活跃度变化为量化目标,进行建模。再具体点,例如以看到广告为时间节点,假如看到之前一天活跃频次为5,看到之后下降成了2,那幺就判定这次广告对其活跃状态的影响为负,构建了一条负样本。反过来,如果是正,或者不降则为正样本。如此,将活跃频次映射成流量影响,从而构建起了广告对于用户在流量上的目标。

 

当然,在实操中有很多细节,例如正常情况下广告是不会对流量造成很纯正的正向影响的,所以在构建正样本时,并不能直接以提升作为标准,而是下降的某个百分比或者程度作为分界线。其次,广告后续是否点击转化的行为不能作为特征使用,因为在你实际建模的时候,重排发生的场景实际上并未形成用户的点击既成事实,所以避免行为特征的穿越,避免使用这种特征,而广告播放前的任何行为都可以当成特征来用。

 

正负样本有了,特征有了,损失按照常规的Cross Entropy来做,至于模型网络,这个就不说了吧,跟搭积木似的想怎幺搭就怎幺搭了,有了这些就可以做梯度求解了。

 

流量这一路搞定,继续看单价。看单价需要看 ∑ (单价*转化率) ,因为是西格玛求和的优化。回忆一下第3章节中阿里的论文,总GVM最大求解,上公式。

 

 

看着是一样的,也是单价与转化率的乘积,只是阿里这里转化率需要考虑上下文对于转化率的影响,但实际上差异很大,阿里这里之所以存在∑求和,是对需要同时曝光的多个item的单次session(比如多次加购,总购买金额)的购买金额和的求解,但是广告这里不存在序列组合,这里的针对依然是单个item建模,所以实际上的目标没变,不存在∑。

 

那幺就拆解为 单价*转化率,转化率可以直接使用排序建模的转化率,或者相同的建模思路,但是可以把上文影响加深,包括同用户下的上文广告,但更有效果的是上文原生内容的影响,可以适当加大对于当前item的转化率影响,类似阿里论文的中加o的上文特征。

 

价格因素影响,这点是最难理解的,理论上广告投放一次的价格是明确的,是客户设置的,最多加上ocpx的调权因子α,虽然是一个波动值,但是也是一个常数不可优化。

 

所以,重点戏来了,车要加速了,请坐好。我们进一步思考,价格相关的环境影响是什幺,实际上假设这次我们把播放机会给予了当前广告之后,对于周边广告形成的实际广告竞争氛围的影响,是一种潜在的影响,例如考虑给某个广告之后,后续会不会对整体竞争氛围带来正向还是负向的影响。

 

所谓正向,即在大环境中,整体竞价氛围是正向的,充分的竞价能够让单价变得更加的平稳而高,恶性的氛围会导致单次广告的收益高,但是会“扰乱市场”,导致了后续的竞争氛围降低,变成一个恶性循环。

 

所以,在这个维度上,我们这个系列中曾极简描绘广告竞价中说到的“价高者得”,在这里就不一定行得通,价高者当然是影响因素,但对于竞争氛围形成良性生态也是量化目标。我们来拆解后者。以流量目标拆解为例,假设当前我给了α*CPA_price,那幺对于后续的竞价生态影响到底是如何的?

 

看实际竞得价格的变化,上涨了还是下降了,观测周期可以拉长到一个小时,半天一天,具体如何量化,例如实际平均竞得价格的上涨还是下降。单个实际价格会对后续持续的竞争价格有这幺大的影响吗?不一定,但我们可以堆样本数来量化衡量,这不是深度学习建模所擅长的吗?

 

落实到细节处,影响周期是小时级还是天级,这个需要具体测,其次是特征考虑,需要把广告主的特征加入,其价格历史变化波动加入,以及是否考虑缩小影响范围,比如相同ocpx类型的,相同广告行业的,因为一定范围内,竞争氛围才具有可比性。最后,在内部,实际上也有两个目标,也是个多目标建模,一个是偏无上限的单价,另一个是好坏判定的类别模型,这个好处理,有了样本上类别损失函数,但另一个目标如何做融合是个难点。

 

回归类的目标与类别类的目标如何融合?这里我们可以把无上限的回归指标做成类别指标,比如加层sigmod,变成01范围,然后再做目标融合。

 

看着三个维度的目标都已经清晰了,都可以做目标建模了,看着也合理,剩下最后一个问题,三个目标如何融合?关于多目标如何融合,其实已经很多论文给答案了,感觉比较合理的方式是加Gate门控,本质上是多目标的权重,这里就不展开了。

 

所以,广告的重排也不是不能做的,也不是只能停留在频控、单纯的一些显式指标优化,至于对于终极目标是否有影响就单纯黑盒上的,人家也是有格局的,可以考虑流量具体量化影响,可以考虑排序阶段重点考虑的转化率,甚至可以考虑单次广告播放对于竞价氛围的影响,最终让单次广告的视野扩展到周期内的最大收益上。

 

你看思路有了,而且还比较清晰,看着还是可以梯度求解的,就差给你整网络结构图了,论文整起来,能写出来绝对是够看的。至于笔者我是没有这个实力写了,整不动,哪天有类似思路的论文,立此文为证,喝水不挖我这个挖坑人呐(对,就是公众号数据虫巢,作者大虫子,大本名黄大崇远)。至于笔者当前实际上有没有落地?这个嘛,不存在的,这辈子可能都不会有的,这幺复杂除了阿里能卷起来,一般厂子哪整的动,况且老夫也不做重排呀,做定向、做召回做排序就是不做重排,虽然老夫也想做,总不能整个链路都给老夫给包圆了吧,哪天真的做了,说不定可以小试一把。

 

所以,以后不准再说广告领域的重排没有格局了,潜力还是很大的,期待“有缘人”一起开挖,挖开这个坑。

 

05

 

持续的思考与总结

 

至此,整个重排算是打完收工了,从整个推荐广告的算法链路说起,聊重排阶段的背叛与历史使命,再聊到不同厂子论文的不同阶段,再聊到广告领域的重排现状,然后一顿没有实操过的大理论打开广告的重排格局。

 

洋洋洒洒数万字,连大虫子自己都不知道自己咋那幺能写(如果我告诉你这篇难产了快一个多月了,是不是就觉得正常很多了),是不是一下子感觉读起来一下子难度高了不少,就跟玩游戏似的,困难度从之前的普通一下子到了地域级别的。

 

其实应该也还好,大虫子还是比较注重内容的递进性,有背景,有前提,有递进的逻辑,有业务铺垫,有技术思路,也有论文拆解,我觉得每个参与其中的从业者,一篇下来整个重排的思路是清晰了,底层的技术逻辑也是清晰的,这也是这篇长文想要达成的目标。

 

有背景、有业务出发点、有关联知识、有底层技术逻辑、内容上层层递进,尽量一篇把一个领域知识讲完,这就是笔者开始尝试的内容的组织思路,从行文和笔法上,希望能尽量通俗一些,便于理解一些,比如标题上更有意思,也能充分理解这个章节要表达什幺。这是大虫子在尝试的行文转换,和内容组织的尝试,希望读者朋友们能够喜欢和适应。

 

当然,有偏重也有缺点。比如这篇,实际上笔者大虫子是没有实际操刀过重排项目的,但为什幺依然坚持写呢?

 

几个点吧,最主要的自身这块的认知缺失,对于整个广告领域,我一直认为我脑海里在拼图,不过自身实际有没有涉足的,都想最终拼好它,形成一个完整的地图,所以一直持续的保持思考和摄入。所以这篇难产了快一个多月了,看了很多论文和资料,对于自身所处的广告,也看了很多内部的重排资料,思考了很久,才敢下笔以及构建好行文逻辑之后,也还在边写边完善细节。

 

其次,我一直想把笔端文字最终不单纯给予手机端的读者朋友们看,有一天也希望能够拿着墨香书本能够回想有一天对自己的崽子说,你看“老子当年也是可以写书的”,也算书香传家了?但公众号与实体书籍的行文逻辑是不同的,严谨很多,所以有点痛苦。

 

实际上大虫子已经写了十几万字了,有一些是文章的整理有一些是新增的章节,但是越写下去越没有底气,就跟你懂的越多发现自己越无知越渺小,所以越不敢下笔。关于最重要的几个大章节一直纠结于先写公众号文章来梳理思路,反正天马行空思路飘逸也没有人骂我,了不起后面再做章节整理嘛?所以,从emb相关的就有意思的写全,思路写透,文笔可以飘,但是逻辑需要严谨,不然后面改不动了。

 

核心还是不想糊弄读者朋友们,希望给出去的东西是一个成体系的,哪怕是重排这个小领域,是层层递进的,是业务与技术结合的,理解起来容易的。

 

说到这,这也是本系列甚至是后续难产中的书的缺点了(是优点也是缺点),大虫子所擅长的是业务与技术的结合点,擅长的是技术逻辑的拆解,思路思路的演进,场景到技术问题的拆解和定义,不擅长的是对公式的推导,对某个算法模型的就揪根剖底。比如这篇文章,缺少的是比如对MMR,对那些提到论文的一步一步拆解,一步一步深究。

 

但是缺点还是优点,全凭读者朋友们判断了,笔者是更侧重于前者,感觉这块更少人关注,更少人能够把业务逻辑与技术逻辑结合起来,能够循序渐进的铺陈开来,以及更少人能够去拆解这种技术逻辑,这种阶段化的演进,找到演进的核心驱动点,而这些恰巧又是大虫子所擅长的,并且喜欢做的。

 

而另一个维度,非常细节的底层技术层面,比如某个论文的剖析拆解,相对还是比较多的参考,基本一些知名的论文对应论文解析文章非常多,以及比如典型如《深度学习推荐系统》这本书,王喆大佬就非常擅长从模型层面来陈述技术底层,这些都不是笔者大虫子所擅长的。

 

做自己所擅长的事,换个角度说,一起补齐广告推荐,以及技术领域的拼图吧。

 

所以,这个系列会持续下去,后面逐步延申到召回、排序,我一直迟迟不敢动手的领域,这个领域太多东西,复杂难搞。

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。