阿里妈妈展示广告粗排:面向链路一致性优化的端到端序学习模型
✍🏻 本文作者: 烁炎、携远、墨惜、谨持、寒戍
1. 背景
阿里妈妈展示广告系统采用的是多阶段级联架构,包括召回模块、粗排模块和精排模块。其中,召回模块根据广告主设置的人群定向条件,将广告数量由千万级减少至万级别;粗排模块同时兼顾效果和效率,使用简单的CTR预估模型和出价策略,将广告按照ECPM进行排序,在很少的时延内挑选出百级别的广告送给精排;精排模块更重视效果,同样使用ECPM排序,但运用了更复杂的CTR模型和出价策略,更精准的挑选出具有高商业价值且被用户喜爱的商品广告展示给用户。
图1 广告系统级联架构
粗排介于系统链路的中间位置,目标是从万级别的候选集合S_M里挑选出ECPM topN的子集合S_N送给精排,是一个集合选择优化问题;在早些时期,展示广告粗排模型主要围绕着"预估能力升级"独立迭代,从最初的非个性化静态质量分升级到了业界主流的双塔模型,再进一步突破,基于算法-系统Co-Design提出了实时训练、实时打分的全连接COLD模型[1];但是,随着粗排模块的优化不断深入,获得的收益逐渐趋于饱和,在这个背景下,我们开始站在整个系统链路的视角,重新审视级联架构面临的挑战,希望可以找到下一个突破口。目前工业界使用的级联架构面临以下两个难题:
- SSB问题 :通常级联架构中各模块的模型使用用户反馈数据进行训练,然而在预估阶段,粗排模型要给更大规模的候选集合打分,其中多数广告没有足够多的用户反馈数据;此外,由于计算资源和时延的限制,粗排模型无法使用复杂的模型结构和特征,导致对用户反馈稀疏的广告预估准确度不高。
- 一致性 :粗排和精排模块的排序一致性对系统性能有重要的影响,举个例子,如下图2,令S_I是S_M集合中真实ECPM最高的Top K子集合,即S_M的理想集合,假如粗排模块倾向于给S_I的子集合S_A打高分,给剩余的子集合S_B打低分,而精排模块倾向于给S_B打高分,给S_A打低分,这就会造成S_B在粗排阶段被过滤,S_A在精排阶段被过滤,最终使S_I中的广告都没有出现在曝光集合S_K中,这种粗排和精排模块的不一致性严重损害了系统的效果;由于粗排和精排的CTR模型以及智能出价策略不同,导致预估出的pctr和bid分布不同,融合pctr和bid后,进一步扩大了粗排和精排ranking score的不一致性,给系统整体效果带来损失。
为了解决以上问题,我们提出了一种"teacher-student"架构,以缓解前链路模块的数据稀疏问题,增加和后链路模块的一致性。具体来说,精排模块中的模型使用了更强大的模型结构,和更丰富的特征,拥有比粗排模型更强的拟合能力和泛化能力,因此我们使用精排模型作为老师指导粗排模型学习。实际应用中,精排模型的预估结果会被保存到日志中并用于训练粗排模型,由于精排模型的预估集合规模远大于用户反馈数据的规模(hundreds vs several),所以这种做法可以同时改善粗排模型面临的SSB问题和与精排模型的选择一致性。如图所示,精排模型基于用户反馈数据训练完成后,指导粗排模型学习,我们将这种机制称为feedback cascading,因为用户的反馈信息通过精排模型隐式的传递给了粗排模型。
图3 feedback cascading架构
一种最直观的做法是使用知识蒸馏的方式实现feedback cascading机制,令粗排模块的模型蒸馏精排模块的模型打分,提升粗排模型的泛化能力和与精排模型的打分一致性,这是我们第一版上线的方法,线上指标取得了明显的提升。但是这种方法有两个缺点:1) 由于粗排模型的特征和模型结构比较简单,学习精排模型对亿级别用户和千万级别广告组成的pair的精准打分是一件很有挑战的事,此外由于精排模型打分分布会随着用户行为实时变化,粗排模型也需要及时适配这种变化,使得粗排模型学习精排模型打分变得更加困难;2)在广告系统中,粗排和精排模块按照公式ecpm=pctr * bid进行排序,其中pctr来自ctr模型,bid来自智能出价策略且依赖cvr等模型的预估分,由于粗排和精排出价策略、cvr等模型不同,粗排和精排的bid也会存在不一致,在融合多个因子后,粗排和精排模块整体排序打分的不一致性被进一步放大。图4统计了每条流量下相同广告粗排和精排打分的比值以及比值的占比,展示了粗排蒸馏模型和精排模型的打分一致性分布,仅有32%的数据落入到[0.8, 1.2]区间内,结合bid后,这个数字降到了21%,粗排和精排的打分不一致会进一步造成排序的不一致,进而影响到系统整体效果。
图4 粗精打分一致性分布(横轴: 粗排分 / 精排分,越趋近于1代表粗排和精排打分一致性越高;纵轴:流量占比)
由于粗排模块目标是选择出对系统回报期望最高的子集合,精排会对胜出的子集合重新进行更精确的打分并决定最终的topK曝光集合,并且计费动作只发生在精排阶段,粗排阶段不涉及真实计费,因此粗排仅需满足以下两个性质:
1) 候选集合序的正确性 ,保证价值(ECPM)高的子集合被送进精排。
2) 激励兼容 ,保证模型打分与广告主出价bid的单调性。
基于以上两点,为了进一步提升链路一致性,我们尝试突破粗排模型传统的单点预估方法,使用集合选择技术实现feedback cascading机制。具体实现上,粗排排序公式不再使用传统的 ECPM=pctr*bid ,而是使用LTR模型代替CTR模型,联合粗排bid直接去学习精排预估的ECPM序,相比知识蒸馏方法,LTR based方法大幅增加了和精排整体序的一致性,具体方法细节在下一章节介绍。
2. 基于端到端序学习的粗排LTR模型
2.1 Bid-Aware Learning to Prerank
在feedback cascading机制下,为了优化链路的一致性,我们在粗排阶段使用learning to rank的方法直接去拟合精排模型在参竞集合S_N上预估的ECPM序,由于参竞数据量过于庞大以至于模型无法完全消费,我们对参竞数据进行了分区间均匀采样。
在LTR方法选择上,我们使用了RankNet[2]作为线上粗排的基础模型,以正确区分session内item pair的相对序为优化目标,公式如下:
其中f(*) 为DNN模型,s_i和s_j是模型输出的logit值,y_i和y_j是候选广告ad_i和ad_j在精排ECPM序中的位置。
这一版模型上线后,线上效果不及预期。我们进行了进一步的分析,精排ECPM序是基于pctr*bid排序得到的,其中bid来自智能出价模块,会根据广告主账户信息、分时折扣等策略动态调整,而LTR模型根据输入的特征很难学习到这些出价策略,此外仅使用LTR score排序也不能保证激励兼容,因此我们尝试在粗排排序时仍引入bid,使用LTR score * bid作为排序公式,同时在模型loss函数中显示引入bid,保证离线训练和在线serving的一致性。
其中b_i和b_j来自粗排出价模块,为了保证激励兼容,这里对模型输出的logit做了加绝对值的处理,最终粗排线上serving时使用模型输出的logit绝对值作为LTR score,联合粗排出价的bid进行排序。
图5 端到端序学习的粗排LTR模型
我们离线分析了不同方法对粗精序一致性的影响,以精排ECPM序top 5为正样本和目标集合来计算GAUC[3]和HitRate,如下表所示,LTR模型相对于Distill模型在两个指标上均有大幅提升,证明了基于端到端的序预估方法在保持链路一致性方面要远远优于基于蒸馏的精准值预估的方法。粗排LTR模型在2021年双十一全量上线,线上大盘RPM +4.8%
模型 | GAUC | HitRate@100 |
---|---|---|
Distill | 0.704 | 0.693 |
LTR | 0.809 | 0.815 |
2.2 基于ΔnDCG的粗排LTR模型
基于Learning to Rank的端到端序一致性建模方案上线粗排后迎来了全新的迭代模式,使我们可以从集合选择的视角挖掘新的优化点。粗排从候选集合中挑选出价值(ECPM)最高的topN集合S_N ,精排从S_N 中进一步挑选价值最高的topK广告集合S_K进行曝光,考虑到粗排受RT制约导致模型能力受限,级联架构系统的设计为粗排留下了一定的容错空间,只要保证价值最高的S_K包含在传递给精排的S_N 中就不会损失系统收益。因此,我们利用级联架构的特性来进一步降低粗排的学习难度:一方面,粗粒度的学习精排ECPM序,使候选集合的排序大致正确即可,允许粗排模型将一定距离范围内的广告排序混淆;另一方面,重点关注头部子集合序的正确性,排名靠后的广告不会被精排选中曝光。
基于以上分析,我们在LTR的基础上进行了两点优化:1)将精排ECPM序分割为若干个chunk,每个chunk包含一组位置相邻的广告,构造训练数据时仅对散落在不同chunk的广告组pair,同一chunk内的广告不组pair;2)增加头部pair和长间距pair的权重,降低尾部pair的权重,具体来说,我们借鉴了lambdarank[4]的做法,引入了ΔnDCG(pair中广告位置交换后nDCG的差值)为损失函数加权:
nDCG的计算公式如下:
其中T是seesion内chunk的个数,r_i是广告i在预估序中的位置。
图6 将精排ECPM序划分为多个chunk,并在loss中引入|ΔnDCG|权重
基于ΔnDCG的粗排LTR模型在2022“天猫年货节”全量上线,线上大盘RPM +3%。
2.3 粗排-精排模型打分一致性
粗排LTR模型使粗排和精排在序的一致性上得到了大幅提升,但模型打分不再具有“点击率”的物理含义,打分量纲相对pctr有较大差异(如图7),这也带来了几个问题:
- 精排排序公式是 rank_pctr * bid ,而粗排排序公式是 prerank_ltr * bid ,由于prerank_ltr与rank_pctr分布差异较大,导致bid的实时变化(智能出价)对于粗排和精排的影响不一致;
- 线上系统的部分模块会将prerank_ltr当作pctr使用,增加了系统风险。
图7 粗排和精排模型打分分布图,其中横轴:打分*100,纵轴:打分占比
因此,我们希望在保证序正确性的基础上对粗排LTR的打分进行约束,使得LTR分数回归到pCTR区间,让bid的实时变化能够以相同的方式作用到粗排和精排上、降低系统风险和运维负担。具体方法上,将prerank_ltr拆分为两部分: prerank_ltr ==> prerank_pctr * α ,并结合pointwise和pairwise loss,令prerank_pctr负责学习精排rank_pctr分布,α 作为序学习因子(注:线上粗排排序公式也会修改为prerank_pctr * α * bid)。调整后,模型的ranking loss变换为如下形式:
同时对prerank_pctr和α进行约束:通过引入Distill loss使prerank_pctr分布对齐精排打分rank_pctr;为了防止序学习因子α偏离过大,引入正则项限制α的变化范围,使其尽量趋近于1:
其中,reg_loss公式如下:
最终损失函数为 ,整体的模型结构如下图所示。
图8 基于打分约束和序学习因子的粗排LTR模型结构
✅ Ranking Loss优化
我们在实践中发现, \mathcal{L_2} 中对prerank_pctr * α * bid做减法的方式得到的ranking loss存在如下两个问题:
- 由于ranking loss中sigmoid函数存在梯度饱和区的特性,bid量纲会极大的影响prerank_pctr,比如整体bid均值变大10倍后,prerank_pctr的均值会相应减少到原来的1/10,这就使得prerank_pctr很难达到精排rank_pctr的打分区间
- bid的绝对值大小对loss的影响较大,模型会过度关注bid较大的广告
为解决以上问题,我们将ranking loss中的减法项调整为除法项,使bid的影响更可控。具体公式如下:
其中T为温度系数。模型整体损失函数调整为: \mathcal{L'_1} + \mathcal{L'_2}。新损失函数下,bid量纲对prerank_pctr的大小影响减弱,并且bid变化对loss的影响更加合理:假设prerank_pctr和α相同,在原ranking loss中,bid从10->20和从100->110的变化对loss的影响一致,但在新loss下,bid从10->20和从100->200的变化对loss有一致的影响,后者对广告主而言更加合理。
通过GAUC和HitRate指标以及模型打分分布分析发现,新方法通过引入pointwise loss对LTR打分进行约束,不仅可以使LTR打分回归pCTR区间,在与精排序的一致性指标上也变得更优。粗排LTR与精排pCTR打分一致性优化在2022“天猫双十一”全量上线,线上大盘RPM +1.5%。
模型 | GAUC | Hitrate@100 |
---|---|---|
LTR-ΔnDCG | 0.816 | 0.824 |
LTR打分约束 | 0.820 | 0.833 |
图9 粗排和精排模型打分分布图,其中横轴:打分*100,纵轴:打分占比
3. 结语
粗排作为系统链路中的重要一环,常常面临着RT和打分规模的双向约束,以往粗排工作主要围绕在满足线上约束的条件下提升粗排模型的预估准度,经过多年迭代天花板愈发明显。过去一年,我们开始从整个级联架构的视角出发,以最大化系统链路收益为目标升级了粗排的优化体系,提出feedback cascading机制以改善级联架构面临的一些问题,并上线了基于端到端序学习的learning to rank方法并在后续进行了一系列优化,大幅提升了全链路的一致性,给展示广告大盘收入带来了显著提升。
级联架构下前后链路模块一致性的优化明显改善了系统的投放效率和效果,并能从一定程度上缓解前链路的SSB问题。但由于后链路的精排是基于用户反馈数据训练,系统链路的SSB问题并未从根本解决。我们尝试了两种解法,一种是在精排模块优化系统的SSB问题,通过搭建全链路探索通道和引入域外数据,为精排模型提供更多的无偏训练样本。另一种是在前链路模块通过样本赋权、引入域外数据、负采样等方式,使送给后链路数据更加无偏,同时过滤"简单负样本",减轻后链路模块的压力,使后链路模块更专注于区分"难样本"。至于这两种解法如何进一步融合,使系统链路既能保证一致性、通畅性,又能使每个模块各司其职,更高效的解决系统面临的SSB问题,仍是一个值得研究的问题。我们也会在未来不断探索和迭代,期待后续与大家进行分享和交流。
参考文献
[1] Wang Z, Zhao L, Jiang B, et al. Cold: Towards the next generation of pre-ranking system[J]. arXiv preprint arXiv:2007.16122, 2020.
[2] Burges C, Shaked T, Renshaw E, et al. Learning to rank using gradient descent[C]//Proceedings of the 22nd international conference on Machine learning. 2005: 89-96.
[3] Zhou G, Zhu X, Song C, et al. Deep interest network for click-through rate prediction[C]//Proceedings of the 24th ACM SIGKDD international conference on knowledge discovery & data mining. 2018: 1059-1068.
[4] Burges C J C. From ranknet to lambdarank to lambdamart: An overview[J]. Learning, 2010, 11(23-581): 81.