【CTR】美团搜索粗排优化的探索与实践
粗排是工业界搜广推系统的重要模块。美团搜索排序团队在优化粗排效果的探索和实践中,基于业务实际场景,从精排联动和效果性能联合优化两方面优化粗排,提升了粗排的效果。本文介绍了美团搜索粗排的迭代路线、基于知识蒸馏和自动神经网络选择的粗排优化工作,希望为从事相关工作的同学带来一些启发或者帮助。
1. 前言
众所周知,在搜索、推荐、广告等大规模工业界应用领域,为了平衡性能和效果,排序系统普遍采用级联架构[1,2],如下图 1 所示。以美团搜索排序系统为例,整个排序分为粗排、精排、重排和混排层;粗排位于召回和精排之间,需要从千级别候选 item 集合中筛选出百级别 item 集合送给精排层。
图1 排序漏斗
从美团搜索排序全链路视角审视粗排模块,目前粗排层优化存在如下几个挑战点:
- 样本选择偏差:级联排序系统下,粗排离最后的结果展示环节较远,导致粗排模型离线训练样本空间与待预测的样本空间存在较大的差异,存在严重的样本选择偏差。
- 粗排精排联动:粗排处于召回和精排之间,粗排需要更多获取和利用后续链路的信息来提升效果。
- 性能约束:线上粗排预测的候选集远远高于精排模型,然而实际整个搜索系统对性能有严格的要求,导致粗排需要重点关注预测性能。
本文将围绕上述挑战点来分享美团搜索粗排层优化的相关探索与实践,其中样本选择偏差问题我们放在精排联动问题中一起解决。本文主要分成三个部分:第一部分会简单介绍美团搜索排序粗排层的演进路线;第二部分介绍粗排优化的相关探索与实践,其中第一个工作是采用知识蒸馏和对比学习使精排和粗排联动来优化粗排效果,第二个工作是考虑粗排性能和效果 trade-off 的粗排优化,相关工作均已全量上线,且效果显著;最后是总结与展望部分,希望这些内容对大家有所帮助和启发。
2. 粗排演进路线
美团搜索的粗排技术演进分为以下几个阶段:
- 2016 年:基于相关性、质量度、转化率等信息进行线性加权,这种方法简单但是特征的表达能力较弱,权重人工确定,排序效果存在很大的提升空间。
- 2017 年:采用基于机器学习的简单 LR 模型进行 Pointwise 预估排序。
- 2018 年:采用基于向量内积的双塔模型,两侧分别输入查询词、用户以及上下文特征和商户特征,经过深度网络计算后,分别产出用户&查询词向量和商户向量,再通过内积计算得到预估分数进行排序。该方法可以提前把商户向量计算保存好,所以在线预测快,但是两侧信息的交叉能力有限。
- 2019 年:为了解决双塔模型无法很好地建模交叉特征的问题,将双塔模型的输出作为特征与其他交叉特征通过 GBDT 树模型进行融合。
- 2020 年至今:由于算力的提升,开始探索 NN 端到端粗排模型并且持续迭代 NN 模型.
- 现阶段,工业界粗排模型常用的有双塔模型,比如腾讯[3]和爱奇艺[4];交互式 NN 模型,比如阿里巴巴[1,2]。下文主要介绍美团搜索在粗排升级为 NN 模型过程中的相关优化工作,主要包括粗排效果优化、效果&性能联合优化两个部分。
3. 粗排优化实践
随着大量的效果优化工作[5,6]在美团搜索精排 NN 模型落地,我们也开始探索粗排 NN 模型的优化。考虑到粗排有严格的性能约束,直接将精排优化的工作复用到粗排是不适用的。下面会介绍关于将精排的排序能力迁移到粗排的精排联动效果优化工作,以及基于神经网络结构自动搜索的效果和性能 trade-off 优化工作。
3.1 精排联动效果优化
粗排模型受限于打分性能约束,这会导致模型结构相比精排模型更加简单,特征数量也比精排少很多,因此排序效果要差于精排。为了弥补粗排模型结构简单、特征较少带来的效果损失,我们尝试知识蒸馏方法[7]来联动精排对粗排进行优化。
知识蒸馏是目前业界简化模型结构并最小化效果损失的普遍方法,它采取一种 Teacher-Student 范式:结构复杂、学习能力强的模型作为 Teacher 模型,结构较为简单的模型作为 Student 模型,通过 Teacher 模型来辅助 Student 模型训练,从而将 Teacher 模型的“知识”传递给 Student 模型,实现 Student 模型的效果提升。精排蒸馏粗排的示意图如下图 2 所示,蒸馏方案分为以下三种:精排结果蒸馏、精排预测分数蒸馏、特征表征蒸馏。下面会分别介绍这些蒸馏方案在美团搜索粗排中的实践经验。
)
图2 精排蒸馏粗排示意图
3.1.1 精排结果列表蒸馏
粗排作为精排的前置模块,它的目标是初步筛选出质量比较好的候选集合进入精排,从训练样本选取来看,除了常规的用户发生行为(点击、下单、支付)的 item 作为正样本,曝光未发生行为的 item 作为负样本外,还可以引入一些通过精排模型排序结果构造的正负样本,这样既能一定程度缓解粗排模型的样本选择偏置,也能将精排的排序能力迁移到粗排。下面会介绍在美团搜索场景下,使用精排排序结果蒸馏粗排模型的实践经验。
策略1:在用户反馈的正负样本基础上,随机选取少量精排排序靠后的未曝光样本作为粗排负样本的补充,如图 3 所示。该项改动离线 Recall@150(指标解释参看附录)+5PP,线上 CTR +0.1%。
图3 补充排序结果靠后负例
策略2:直接在精排排序后的集合里面进行随机采样得到训练样本,精排排序的位置作为 label 构造 pair 对进行训练,如下图 4 所示。离线效果相比策略1 Recall@150 +2PP,线上 CTR +0.06%。
图4 排序靠前靠后构成 pair 对样本
策略3:基于策略2的样本集选取,采用对精排排序位置进行分档构造 label ,然后根据分档 label 构造 pair 对进行训练。离线效果相比策略2 Recall@150 +3PP,线上 CTR +0.1%。
3.1.2 精排预测分数蒸馏
前面使用排序结果蒸馏是一种比较粗糙使用精排信息的方式,我们在这个基础上进一步添加预测分数蒸馏[8],希望粗排模型输出的分数与精排模型输出的分数分布尽量对齐,如下图 5 所示:
图5 精排预测分数构造辅助损失
在具体实现上,我们采用两阶段蒸馏范式,基于预先训练好的精排模型来蒸馏粗排模型,蒸馏 Loss 采用的是粗排模型输出和精排模型输出的最小平方误差,并且添加一个参数 Lambda 来控制蒸馏 Loss 对最终 Loss 的影响,如公式(1)所示。使用精排分数蒸馏的方法,离线效果 Recall@150 +5PP,线上效果 CTR +0.05%。
Loss = H ( y , f ( x ) ) + λ ∥ r ( x ) − p ( x ) ∥ 2 \text { Loss }=H(y, f(x))+\lambda\|r(x)-p(x)\|^{2} Loss =H(y,f(x))+λ∥r(x)−p(x)∥2
3.1.3 特征表征蒸馏
业界通过知识蒸馏实现精排指导粗排表征建模已经被验证是一种有效提升模型效果的方式[7],然而直接用传统的方法蒸馏表征有以下缺陷:第一是无法蒸馏粗排和精排之间的排序关系,而前文已提到,排序结果蒸馏在我们的场景中,线下、线上均有效果提升;第二是传统采用 KL 散度作为表征度量的知识蒸馏方案,把表征的每一维独立对待,无法有效地蒸馏高度相关的、结构化的信息[9],而在美团搜索场景下,数据是高度结构化的,因此采用传统的知识蒸馏策略来做表征蒸馏可能无法较好地捕获这种结构化的知识。
我们将对比学习技术应用到粗排建模中,使得粗排模型在蒸馏精排模型的表征时,也能蒸馏到序的 关系。我们用 ϕ \phi ϕ 来表示粗排模型,用 ϕ T \phi^{\mathrm{T}} ϕT 来表示精排模型。假设 q \mathrm{q} q 是数据集中的一个请求 { ( x 0 , y 0 ) ∣ y 0 = 1 } \left\{\left(\mathrm{x}_{0}, \mathrm{y}_{0}\right) \mid \mathrm{y}_{0}=1\right\} {(x0,y0)∣y0=1} 是该请求下的一个正样例,而 ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x k , y k ) ∣ y 1 , 2 , . . , k = 0 \left(\mathrm{x}_{1}, \mathrm{y}_{1}\right),\left(\mathrm{x}_{2}, \mathrm{y}_{2}\right), \ldots,\left(\mathrm{x}_{\mathrm{k}}, \mathrm{y}_{\mathrm{k}}\right) \mid \mathrm{y}_{1,2, . ., \mathrm{k}}=0 (x1,y1),(x2,y2),…,(xk,yk)∣y1,2,..,k=0 是 该请求下对应的 k \mathrm{k} k 个负样例。
我们将 x 0 \mathrm{x}_{0} x0 分别输入到粗排和精排网络中,得到其对应的表征 ϕ ( q , x 0 ) \phi\left(\mathrm{q}, \mathrm{x}_{0}\right) ϕ(q,x0) 和 ϕ T ( q , x 0 ) \phi^{\mathrm{T}}\left(\mathrm{q}, \mathrm{x}_{0}\right) ϕT(q,x0) ,与此同 时,我们将 x 1 , x 2 , … , x k \mathrm{x}_{1}, \mathrm{x}_{2}, \ldots, \mathrm{x}_{k} x1,x2,…,xk 输入到粗排网络中,得到粗排模型编码后的表征 ϕ ( q , x 1 ) , ϕ ( q , x 2 ) , … , ϕ ( q , x K ) \phi\left(\mathrm{q}, \mathrm{x}_{1}\right), \phi\left(\mathrm{q}, \mathrm{x}_{2}\right), \ldots, \phi\left(\mathrm{q}, \mathrm{x}_{\mathrm{K}}\right) ϕ(q,x1),ϕ(q,x2),…,ϕ(q,xK) 。对于对比学习负例对的选取,我们采用策略 3 中的方案,对 精排的顺序进行分档,同档内精排、粗排的表征对看成是正例,不同档间粗排、精排的表征对看成 是负例,而后用 InfoNCE Loss 来优化这个目标:
L C K T = − ∑ q ∈ Q [ log exp ( ⟨ ϕ ( q , x 0 ) , ϕ T ( q , x 0 ) ⟩ / τ ′ ) ∑ j = 0 K exp ( ⟨ ϕ ( q , x 0 ) , ϕ ( q , x j ) ⟩ / τ ′ ) ] ( 2 ) \mathcal{L}_{C K T}=-\sum_{q \in Q}\left[\log \frac{\exp \left(\left\langle\phi\left(q, x_{0}\right), \phi^{T}\left(q, x_{0}\right)\right\rangle / \tau^{\prime}\right)}{\sum_{j=0}^{K} \exp \left(\left\langle\phi\left(q, x_{0}\right), \phi\left(q, x_{j}\right)\right\rangle / \tau^{\prime}\right)}\right] \quad(2) LCKT=−q∈Q∑[log∑j=0Kexp(⟨ϕ(q,x0),ϕ(q,xj)⟩/τ′)exp(⟨ϕ(q,x0),ϕT(q,x0)⟩/τ′)](2)
其中 < ⋅ , ⋅ > <\cdot, \cdot> <⋅,⋅> 表示两个向量的点积, τ ′ \tau^{\prime} τ′ 是温度系数。通过对 InfoNCE IOSS 的性质进行分析,不 难发现上式本质上等价于最大化粗排表征和精排表征互信息的一个下界。因此,该方法本质上是在 互信息层面上最大化精排表征和粗排表征之间的一致性,能够更有效地蒸馏结构化知识。
图6 对比学习精排信息迁移
在上文公式 (1) 的基础上,补充对比学习表征蒸馏 Loss,离线效果 Recall@150+14PP,线上 CTR + 0.15 % +0.15 \% +0.15% 。相关工作的详细内容可以参考我们的论文[10] (正在投稿中)。
Loss = H ( y , f ( x ) ) + λ ∥ r ( x ) − p ( x ) ∥ 2 + β L C T K ( 3 ) \text { Loss }=H(y, f(x))+\lambda\|r(x)-p(x)\|^{2}+\beta L_{C T K} \quad(3) Loss =H(y,f(x))+λ∥r(x)−p(x)∥2+βLCTK(3)
3.2 效果性能联合优化
前面提到线上预测的粗排候选集较大,考虑到系统全链路性能的约束,粗排需要考虑预测效率。前文提到的工作都是基于简单 DNN + 蒸馏的范式来进行优化,但是存在如下两个问题:
目前受限于线上性能而只使用了简单特征,未引入更加丰富的交叉特征,导致模型效果还有进一步提升的空间。
固定粗排模型结构的蒸馏会损失蒸馏效果,从而造成次优解[11]。
根据我们的实践经验,直接在粗排层引入交叉特征是不能满足线上时延要求的。因此为了解决以上问题,我们探索并实践了基于神经网络架构搜索的粗排建模方案,该方案同时优化粗排模型的效果和性能,选择出满足粗排时延要求的最佳特征组合和模型结构,整体架构图如下图7所示:
图7 基于 NAS 的特征和模型结构选择
下面我们对其中的神经网络架构搜索(NAS)以及引入效率建模这两个关键技术点进行简单介绍:
神经网络架构搜索:如上图7所示,我们采用基于 ProxylessNAS[12]的建模方式,整个模型训练除了网络参数外增加了特征 Masks 参数和网络架构参数,这些参数是可微分的,随着模型目标一起学习。在特征选择部分,我们给每一个特征引入一个基于伯努利分布的 Mask 参数 ,参见公式(4),其中伯努利分布的 θ 参数通过反向传播进行更新,最终获得每个特征的重要度。在结构选择部分,采用了 L 层 Mixop 表示,每组 Mixop 包括 N 个可供选择的网络结构单元,在实验中,我们采用了不同隐层神经单元数的多层感知机,其中 N= {1024, 512, 256, 128, 64},同时我们还增加了隐藏单元数为 0 的结构单元,用于选择具有不同层数的神经网络。
g i = { [ 1 , ⋯ , 1 ] , with probability θ i [ 0 , ⋯ , 0 ] , with probability 1 − θ i g_{i}=
对于特征耗时来说,每个特征 fi 的延时期望可以被建模为如公式(5)所示,其中 是服务端打点记录的每个特征时延。
E [ latency i ] = θ i × L i \mathbb{E}\left[\text { latency }_{i}\right]=\theta_{i} \times L_{i} E[ latency i]=θi×Li
在实际情况中特征可以分为两大类,一部分是上游透传类特征 F 1 \mathrm{F}_{1} F1 ,其延时主要来源于上游 传输延时;另外一类特征 F 2 \mathrm{F}_{2} F2 来自于本地获取(读取 K V \mathrm{KV} KV 或者计算),那么每个特征组合的 时延可以鿆建模为:
E [ latency ] = max f i ∈ F 1 , f j ∈ F 2 ( E [ latency i ] + β ⋅ ∣ F 1 ∣ , E [ latency j ] + γ ⋅ ∣ F 2 ∣ ) \mathbb{E}[\text { latency }]=\max _{f_{i} \in F_{1}, f_{j} \in F_{2}}\left(\mathbb{E}\left[\text { latency }_{i}\right]+\beta \cdot\left|F_{1}\right|, \mathbb{E}\left[\text { latency }_{j}\right]+\gamma \cdot\left|F_{2}\right|\right) E[ latency ]=fi∈F1,fj∈F2max(E[ latency i]+β⋅∣F1∣,E[ latency j]+γ⋅∣F2∣)
其中 ∣ F 1 ∣ \left|\mathrm{F}_{1}\right| ∣F1∣ 和 ∣ F 2 ∣ \left|\mathrm{F}_{2}\right| ∣F2∣ 表示对应特征集合的个数, β \beta β 和 γ \gamma γ 建模系统特征拉取并发度。
对于模型结构的延时建模可参见上图 7 右边部分,由于这些 Mixop 的执行是顺序进行的,因此我们可以采取递归的方式的计算模型结构延时,整个模型部分的耗时可以用最后一层的 Mixop 来表达,示意图如下图 8 所示:
图8 模型延时计算图
图8 左边是装配有网络架构选择的粗排网络,其中 表示第 层的第 个神经单元的权重。右边是网络延时计算示意图。因此整个模型预测部分耗时可以用最后一层模型来表示,如公式(7)所示:
E [ latency ′ ] = E [ latency ′ ] \mathbb{E}\left[\text { latency }^{\prime}\right]=\mathbb{E}\left[\text { latency }^{\prime}\right] E[ latency ′]=E[ latency ′]
最终我们把效率指标引入模型,最终模型训练的 Loss 如下面公式 (8) 所示,其中, f \mathrm{f} f 表示 精排网络, λ 、 λ 1 、 λ 2 \lambda 、 \lambda_{1} 、 \lambda_{2} λ、λ1、λ2 表示平衡因子, p ( x ) 、 r ( x ) \mathrm{p}(\mathrm{x}) 、 \mathrm{r}(\mathrm{x}) p(x)、r(x) 分别表示粗排和精排的打分输出。
通过神经网络架构搜索的建模来联合优化粗排模型的效果和预测性能,离线 Recall@150 +11PP, 最终在线上延时不增加的情况下,线上指标 CTR +0.12%;详细工作可参考[13],已被 KDD 2022 接收。
4. 总结
从 2020 年开始,我们通过大量的工程性能优化使粗排层落地 MLP 模型,在2021 年我们继续在 MLP 模型基础上,持续迭代粗排模型来提升粗排效果。首先,我们借鉴业界常用的蒸馏方案来联动精排优化粗排,从精排结果蒸馏、精排预测分数蒸馏、特征表征蒸馏三个层面分别进行了大量实验,在不增加线上延时的情况下,提升粗排模型效果。
其次,考虑到传统蒸馏方式无法很好处理排序场景中的特征结构化信息,我们自研了一套基于对比学习的精排信息迁移粗排方案。
最后,我们进一步考虑到粗排优化本质上是效果和性能的 trade-off,采用多目标建模的思路同时优化效果和性能,落地神经网络架构自动搜索技术来进行求解,让模型自动选择效率和效果最佳的特征集合和模型结构。后续我们会从以下几个方面继续迭代粗排层技术:
- 粗排多目标建模:目前的粗排本质上还是一个单目标模型,目前我们正在尝试将精排层的多目标建模应用于粗排。
- 粗排联动的全系统动态算力分配:粗排可以控制召回的算力以及精排的算力,针对不同场景,模型需要的算力是不一样的,因此动态算力分配可以在不降低线上效果的情况下减小系统算力消耗,目前我们已经在这个方面取得了一定的线上效果。
5. 附录
传统的排序离线指标多以 NDCG、MAP、AUC 类指标为标准,对于粗排来说,其本质更偏向于以集合选择为目标的召回类任务,因此传统的排序指标不利于衡量粗排模型迭代效果好坏。我们借鉴[6]中 Recall 指标作为粗排离线效果的衡量指标,即以精排排序结果为 ground truth,衡量粗排和精排排序结果 TopK 的对齐程度。Recall 指标具体定义如下:
Recall@K= ∣ topK candidates from preranking & topK candidates from ranking ∣ ∣ topK candidates from ranking ∣ \text { Recall@K= } \frac{\mid \text { topK candidates from preranking \& topK candidates from ranking } \mid}{\mid \text { topK candidates from ranking } \mid} Recall@K= ∣ topK candidates from ranking ∣∣ topK candidates from preranking & topK candidates from ranking ∣
该公式的物理含义即为衡量粗排排序前 K 个和精排排序前 K 的重合度,该指标更加符合粗排集合选择的本质。
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/126295849
- 点赞
- 收藏
- 关注作者
评论(0)