背景
效果类在线广告投放流程一般包含以下步骤:
-
召回(Information Retrieval,IR),从海量广告全集中召回和当前请求相匹配的候选广告集,候选广告集的规模一般是数万;
-
粗排(Approximate Rank,AR),对召回返回的候选广告集使用相对简单的模型预估每个广告的点击率 pCTR,并基于广告主在点击上的出价 bidclick计算 eCPM: eCPM=pCTR⋅bidclick,最后,再基于 eCPM从大到小进行排序,选取排序靠前的数百个广告;
-
精排(Full Rank,FR),对粗排返回的数百个广告,和粗排类似的方式、但选择相对复杂的模型预估点击率并计算 eCPM,再基于 eCPM排序后,选取排序靠前的数十个广告。
-
定价(Price),对精排返回的数十个广告按照一定的机制根据出价计算最后的定价,然后将胜出的广告返回给媒体侧进行展示,当用户点击广告时,广告平台获取相应的点击事件,并按照之前计算的定价计价,扣减广告主的账户余额。
上述流程中的粗排和精排均可以认为是排序(Learning to Rank,LTR)问题,而排序问题的求解一般有3种方式:
- Pointwise,逐个求解序列中各元素的优先级,从而得到整个序列的排序结果;
- Pairwise,序列中各元素两两配对,逐对求解两元素之间的优先级,从而得到整个序列的排序结果;
- Listwise,直接求解序列的排序结果。
这三种方法从上到下,从只考虑序列中元素自身、到考虑序列中两两元素相互关系再到考虑序列中所有元素相互关系,考虑的信息更加全面,但问题求解的样本空间也逐渐增大,从所有元素构成的样本空间、到所有元素两两配对构成的样本空间、再到所有元素组合序列构成的样本空间。 上述广告投放流程中提到的先预估点击率、再计算 eCPM、最后根据 eCPM进行排序的方法,则属于Pointwise类型的排序方法。 另一方面,粗排和精排虽然都是排序问题,但结合各自所处的广告投放环节,又有着不同的条件约束和演进方向。 精排需处理的广告数相对粗排较少,仅约数百个,因此可以在保证在线广告系统低延时、高吞吐的前提下,设计复杂的模型结构,精准地预估 pCTR,从而计算 eCPM,这方面的模型工作有DIN、DIEN等。而随着广告主愈加关注后链路转化效果,其偏向采用oCPC方式进行广告投放,即在转化上进行出价,因此,需要精排同时能预估转化率,并根据以下公式计算 eCPM: eCPM=pCTR×pCVR×tCPA,转化率预估方面的模型工作有ESMM等。另外,由于精排和后续的定价属于广告位拍卖场景,涉及广告主、媒体、广告平台三方的博弈,因此精排和定价需要满足拍卖机制中的激励兼容(每个广告主都如实报价)和个体独立(每个广告主都获得非负的效用),同时,原先按照特定公式计算 eCPM并排序的方式并不满足多目标优化(同时优化媒体用户体验、广告主GMV和平台收益),因此,需结合广告特征(包含 pCTR和 pCVR)、上下文特征,针对多目标优化,对精排和定价进行端到端的学习和推理,这方面的模型工作有Deep GSP、DNA等。 而粗排需处理的广告数相对精排较多,约数万个,另外,粗排的排序逻辑与精排近似,主要承担承上启下、初步筛选的作用,减少精排的计算量,因此,粗排一般使用相对简单的模型进行点击率、转化率的预估,在模型准确度和计算复杂度上达到均衡。基于这个思路,粗排模型不断发展,从简单的后验统计、到浅层模型、再到深层模型。虽然模型结构不断变化,但粗排均是Pointwise类型的排序方法,其存在以下不足:粗排模型训练样本使用的是精排进一步筛选出的广告的展现、点击日志,存在样本偏差问题;粗排模型虽然不断演进,但受限计算复杂度的约束,其预估的点击率、转化率难以对齐精排,而随着广告出价方式和调控机制的发展, eCPM的计算已不是简单的预估点击率和出价的相乘,这样导致粗排更难以通过预估点击率和出价相乘对齐精排的排序结果。因此,粗排模型的演进从Pointwise类型的排序方法------先预估每个广告的点击率、再计算 eCPM进行排序,发展至Pairwise类型的排序方法------直接学习并推理精排的排序结果。 本文是对《COLD: Towards the Next Generation of Pre-Ranking System》、《COPR: Consistency-Oriented Pre-Ranking for Online Advertising》这两篇论文的阅读笔记。这两篇论文由阿里妈妈分别于2020年和2023年发表,介绍了其粗排模型的演进历程。
Pointwise
《COLD: Towards the Next Generation of Pre-Ranking System》由阿里妈妈于2020年发表,介绍了其粗排模型基于Pointwise类型的排序方法,从简单的后验统计、到浅层模型、再到深层模型的演进历程,并主要介绍了其深层模型COLD在模型结构和工程实现上的优化思路,从而在保证在线系统性能要求的前提下,在模型准确度上取得较好的提升。
后验统计
论文首先介绍了粗排模型的演进历程。第一代粗排模型使用简单的后验统计。根据广告历史展现、点击计算后验点击率作为广告粒度的静态分,其并不是个性化的,因此不同用户和上下文环境的广告请求其粗排阶段的排序结果均是相同的。

浅层模型
第二代粗排模型使用浅层模型,比如Logistic回归模型。令 xu为用户特征、 xa为广告特征、 xua为用户和广告的交叉特征,对上述特征进行加权求和后通过Sigmoid函数映射至0到1的区间,作为点击率预估值:
yx=σ(θTx)=concat(xu,xa,xua)
浅层模型实现简单,但模型表达能力相对深层模型较弱。

双塔模型
第三代模型是双塔模型。双塔模型最早是由微软于2013年提出的DSSM模型,并应用在搜索场景下的搜索词和关键词匹配中,后续由于该模型易于工程实现,逐渐被广泛应用于搜索、推荐、广告等场景中。 阿里妈妈在粗排中所使用的双塔模型如图3所示。令 eu为用户特征经过Embedding层后的Embedding向量, ea为广告特征经过Embedding层后的Embedding向量。这两个Embedding向量分别经过各自的全连接网络后,得到用户向量 vu和广告向量 va,对这两个向量求内积后再通过Sigmoid函数得到预估点击率:
yvuva=σ(vuTva)=FC(eu)=FC(ea)

从模型结构可以看出,虽然分别使用各自的子网络对用户特征和广告特征进行深度挖掘,但是用户特征和广告特征直至最终的Sigmoid函数才会交叉,导致模型的表达能力有所欠缺。 使用双塔模型进行粗排的工程实现如图4所示。每天使用历史的展现、点击日志进行模型训练、参数更新,然后离线对用户和广告集合中的所有用户和广告使用其特征计算其向量,并保存至索引中。在线推理时,对于每次广告请求,从索引中获取当前发起广告请求的用户的用户向量和召回返回的粗排候选广告集合中所有广告的广告向量,对于每个广告向量,计算其与用户向量的内积,并进而通过Sigmoid函数计算广告预估点击率,最后再使用eCPM公式得到粗排的广告排序分进行排序。

从中可以看出,计算复杂度较高的用户向量和广告向量计算均可离线完成,在线推理时只需从索引中按主键获取相应的向量进行简单计算即可,大大减少了在线计算量,但是该工程实现也存在以下不足:所有用户和广告均需离线计算其向量,导致离线计算量较大,但实际有大量非活跃用户并不会发起广告请求、大量受众较少的广告也并不会被召回;同时,在离线计算后产生的新用户和新广告在索引中并没有其向量,导致无法对其进行粗排;另外,离线计算的用户和广告向量在全量更新至各自的索引时,会由于更新的时间差导致索引中用户和广告向量版本在一段时间内不一致,从而影响在线推理的准确度。
深层模型
由于双塔模型在模型表达和工程实现上的不足,所以阿里妈妈进一步改进粗排模型,使用深层模型,并在输入中即对用户特征和广告特征进行交叉,充分挖掘用户和广告之间的相关性。在精排模型方面,阿里妈妈已先后迭代了GwEN(Group-wise Embedding Network)、DIN、DIEN等深层模型,如果直接将其应用在粗排,则较大的计算量会导致粗排超时,因此,阿里妈妈在精排模型(论文中使用的是GwEN)的基础上进行网络结构和工程实现的优化,在提升粗排模型表达能力的同时,减少计算耗时,保证粗排的性能要求,经过优化后的粗排模型即COLD (Computing power cost-aware Online and Lightweight Deep pre-ranking system)。
GwEN
在《Deep Interest Network for Click-Through Rate Prediction》这篇介绍DIN的论文中,作者简单介绍了阿里妈妈之前所使用的精排模型------GwEN,以作为和DIN进行比较的基线模型,其模型结构如图5所示。

GwEN的输入是由用户特征、广告特征、用户行为特征、上下文特征构成的多个特征组,每个特征组采用独热或多热编码,例如输入:
weekday=Friday,gender=Female,visited_cate_ids={Bag,Book},ad_cate_id=Book
可表示为:
weekday=Friday 0,0,0,0,1,0,0gender=Female 0,1visited_cate_ids={Bag,Book} 0,...,1,...,1,...,0ad_cate_id=Book 0,...,1,...,0
每个特征组经过Embedding层后转化为相应的固定长度的Embedding向量(多热编码会转化为多个Embedding向量,需再进行池化转化为固定长度的Embedding向量),再将所有特征组的Embedding向量拼接在一起后输入全连接网络层,最后通过一层Softmax层输出预估点击率。
网络结构优化
COLD的网络结构复用GwEN,但进行了轻量化的改造。轻量化改造的方案一般包括模型剪枝、特征筛选等。论文采用特征筛选方案,如图6所示,在原GwEN的Embedding层之后增加SE(Squeeze-and-Excitation)模块。Squeeze-and-Excitation Networks(SENet)是由自动驾驶公司Momenta于2017年公布的一种图像识别模型,其和2017年Google提出的Transformer模型一样,均采用了注意力机制,通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率,取得了2017年ILSVR竞赛的冠军。

论文使用SE模块计算各特征组Embedding向量的权重。令模型输入包含 M个特征组, ei表示第 i个特征组的Embedding向量,向量的维度为 k,则特征组Embedding向量的权重可通过以下方式计算:
s=σ(We1,...,em+b)
其中, s∈RM, W∈Rk×M, b∈RM, s的第 i个元素 si表示 ei的权重标量,使用 si与 ei的每个元素进行相乘,得到 ei加权后的Embedding向量 vi,再将加权后的Embedding向量拼接在一起输入后续的全连接网络。 论文在计算Embedding向量的权重后,按权重排序,选择靠前的 K个特征组进行模型训练和在线推理。而 K值的设置,论文进行了多轮离线实验,评估不同 K值下的模型表达能力(通过GAUC指标)和系统性能指标(通过QPS和RT),通过权衡,确认最终的 K值。
工程实现优化
COLD的工程实现如图7所示,其在线推理包含两步:第一步,对于每次广告请求,从用户特征表获取当前发起广告请求的用户的用户特征,从广告特征表获取召回返回的粗排候选广告集合中所有广告的广告特征,并进而计算用户和广告的交叉特征;第二步,将特征输入网络,先转化为Embedding向量,再拼接在一起输入全连接网络,前向传播后输出预估点击率。工程实现的优化包括并行化、列式计算和降低精度等。

并行化
由于需对多个候选广告预估点击率,而每个广告的计算相互独立,因此,可以按广告维度进行并行计算。
列式计算
对于多个候选广告的特征计算,论文不采用按广告维度的行式计算,而采用按特征组维度的列式计算,如图8所示,这样可以借助SIMD(Single Instruction Multiple Data)实现同时对多个数据执行指令以加速特征计算。

降低精度
网络前向传播中的运算主要是矩阵相乘,而Float16相对Float32在矩阵相乘上有更高的性能,因此,可以使用Float16替代Float32。而某些求和池化操作会导致计算结果在Float16下溢出,因此论文进一步设计了分段平滑函数linear_log以保证计算结果不会过大:
linear_log(x)=⎩ ⎨ ⎧−log(−x)−1xlog(x)+1x<−1−1≤x≤1x>1

Pairwise
虽然以前模型结构不断变化,但粗排均是Pointwise类型的排序方法,其存在以下不足:粗排模型训练样本使用的是精排进一步筛选出的广告的展现、点击日志,存在样本偏差问题;粗排模型虽然不断演进,但受限计算复杂度的约束,其预估的点击率、转化率难以对齐精排。因此,粗排模型的演进从Pointwise类型的排序方法------先预估每个广告的点击率、再计算 eCPM进行排序,发展至Pairwise类型的排序方法------直接学习并推理精排的排序结果 。《COPR: Consistency-Oriented Pre-Ranking for Online Advertising》由阿里妈妈于2023年发表,介绍了其在粗排阶段直接学习精排排序结果并进行推理的相关工作------COPR(Consistency-Oriented Pre-Ranking)。 首先介绍广告请求中的两种日志。每次广告请求,精排会对粗排返回的 M个广告预估点击率、计算 eCPM、并按 eCPM进行排序,将排序结果写入排序日志(Ranking Log)。一次广告请求的排序日志如下所示:
R=(ad1,pCTR1,bid1),...,(adM,pCTRM,bidM)
其中,每个广告包含其广告特征、精排预估点击率和出价。 精排从排序结果中选取靠前的 N个广告展示给用户。系统将广告展现和用户是否点击写入展现日志。一次广告请求的展现日志(Impression Log)如下所示:
I=(ad1,y1),...,(adN,yN)
其中,每个广告包含其广告特征和是否被点击的标记 y。

COPR网络结构如图10所示,其将CLOD作为基线模型,并在COLD的基础上进行升级,增加排序对齐模块。 COLD网络结构不再介绍,其输入为用户特征、广告特征和上下文特征,输出为点击率预测值。可以使用展现日志对COLD模型进行训练,令 y^为COLD模型点击率预测值, y为展现日志中广告是否被点击的标记,则训练COLD模型所使用的交叉熵损失函数可表示为:
Lctr=I∑−ylog(y\^)−(1−y)log(1−y\^)
对于排序对齐,COPR并没有直接将粗排和精排排序结果完全对齐,而是设计了基于块的采样(Chunk-Based Sampling),如图11所示。论文将每条排序日志平均切分为 D个块(Chunk),每个块中广告个数为 K=DM,对每个块,从其 K个广告中抽样一个广告,如此共抽样 D个广告,构成新的精排排序结果:
Rchunk=(adsd,pCTRsd,bidsd,D−d)d=1D
其中, D−d表示排序优先级,值越大,优先级越高。COPR即基于上述新的排序结果进行学习,也就是说在块的粒度实现粗排和精排排序结果对齐。 K值越小,粗排和精排排序结果一致性越高,相应要求粗排模型表达能力越高,但其计算复杂度也越高。若 K=1,则粗排和精排排序结果完全一致。论文将 K设置为10。

不同于以往粗排模型预测每个广告的点击率 y^i,并希望 y^i与精排模型预测点击率 pCTRi对齐,COPR设计了图10中所包含的松弛网络(Relaxation Net),通过该网络学习并推理调节因子 α:
α=ReLU(MLP(x))+1e−6∈R+
再使用该因子调节 y^:
y~=α⋅y^
y~表示调整后的点击率预测值,使用 y~与 bid相乘作为 eCPM,并按 eCPM排序作为粗排排序结果。 因为需要对齐粗排和精排排序结果,所以对于 Rchunk中的任意两个广告 adsi和 adsj,若 i<j,则应有 y~si⋅bidsi>y~sj⋅bidsj,因此,论文设计了广告两两配对的排序对齐损失函数:
Lrank=i<j∑log1+e−(y\~sj⋅bidsjy\~si⋅bidsi−1)
论文进一步指出,不同位置的两个广告排序错误所造成的影响是不同的,例如,块1和块10中两个广告排序错误的影响要大于块11和块20中两个广告排序错误的影响(因为越靠前的广告越有可能被展现和点击),所以,需要对上述损失函数每个广告配对设置权重项。论文使用了LTR算法中常用的评估指标DCG设计权重项,对于某个排序结果,DCG的计算公式如下:
DCG=i=1∑Dlog(i+1)2pi−1
其中, pi表示广告 i在当前排序结果中的优先级,而理想的排序结果即精排排序结果,其DCG可表示为:
IDCG=i=1∑Dlog(i+1)2D−i−1
而广告 i和广告 j配对的权重可表示为:
ΔNDCG(i,j)=IDCG2D−i−2D−jlog(i+1)1−log(j+1)1
将上述权重项加入排序对齐损失函数中:
Lrank=i<j∑ΔNDCG(i,j)log1+e−(y\~sj⋅bidsjy\~si⋅bidsi−1)
另外,论文希望 α作为调节因子,在调节点击率、对齐排序结果的同时,尽量接近1,减少对点击率的影响,因此,在损失函数中还引入了对 α偏离1的惩罚项:
Lreg={α−1α1−1α>1α<=1
最终,损失函数可表示为:
L=CTR Loss Lctr+Consistency Loss λ1Lrank+λ2Lreg
COPR工程实现如图12所示,离线对排序日志进行采样,基于展现日志和采样后的排序日志进行模型训练,在线使用模型预测点击率和调节因子,再使用调节后的点击率计算 eCPM,按 eCPM排序后得到粗排排序结果。

参考文献
《COLD: Towards the Next Generation of Pre-Ranking System》 《COPR: Consistency-Oriented Pre-Ranking for Online Advertising》