推荐系统:精排多目标融合与超参数学习方法
帕累托最优指的是这样一种社会状态:当且仅当不减少其他人的效用就无法增加任何一个人的效用时,这种社会状态就称之为帕累托最优。
1 导引
1.1 推荐系统基本架构
在介绍多目标融合模块之前,我们先来回顾一下推荐系统的基础架构,以及多目标融合模块在推荐系统中所处的基本位置。一种在各大厂(如快手[1]、美团[2]、阿里飞猪[3]等)中常见的“多层漏斗型”推荐系统架构如下:
上述过程中,召回、粗排、精排+多目标融合、序列/多样性重排、异构混排是在服务端进行(其中异构混排亦有放在移动端的[4]),端上重排[4]是在移动端进行。下面大致介绍一下这些步骤的作用:
- 召回 召回是推荐系统的第一步,负责快速从大量的物品中筛选出一部分候选物品,将样本数量由千万/百万级降到1万左右。召回并不需要十分准确,但需要不漏掉用户可能喜欢的物品。召回模块通常采用多路召回,且受限于庞大的样本量,一般会使用一些简化的特征或模型。经典召回模型包括协同过滤、FM、DSSM双塔模型等,针对序列数据和图数据,亦有序列模型SASRec和图模型GraphSAGE等。召回是源头,在某种意义上决定着整个推荐系统表现的天花板。
- 粗排 粗排可以理解为精排前的一轮过滤机制,减轻精排的压力,将样本数量从从1万左右降到1千/几百。设置粗排模块的原因是有时候召回结果还是太多,精排层的速度跟不上。粗排要同时兼顾精准性和低延迟,其模型一般也不会太复杂。最后,由于粗排处于召回和精排之间,因此粗排需要获取和利用更多后续链路的信息来提升效果,粗排和精排的联动也成为实际工程中所需要面临的挑战。
- 精排( + 多目标融合) 精排负责获取粗排的结果,并对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精确性,是整个系统中至关重要的一个模块,也是最复杂、研究最多的一个模块。不同于粗排常常使用简单的双塔模型,精排在特征和模型上都会做的比较复杂。目前,精排模型已被深度学习模型“一统天下”,包括Wide&Deep、DeepFM、DIN等,亦会使用Attention(如DIN)、对比学习、迁移学习等机制来提高模型精度。由于在工业界的实践中常常有多个线上指标,故又常使用深度多任务学习(MTL)模型。最后,由于精排关注的是物品的排序,所以其loss亦不同于常见的loss,常依据排序学习(Learning to Rank)策略来进行设计。而LTR方法按照样本生产方法和损失函数loss的不同,又分为pointwise形式和pairwise形式这两类。
- 重排 重排模块的任务是对之前排序模块的结果进行二次排序或调整,以进一步提高推荐的准确度和个性化程度。重排所要处理的问题包括序列价值最大化(也即所谓listwise、不同于单item效果的累计)、增加推荐列表的多样性等等。重排一般是做打散或满足业务运营的特定强插需求,同样不会使用复杂的模型。此外,重排还可能在移动端上,即所谓端上重排。
- 混排 混排的任务在于将多源异构内容(比如视频和广告)的返回结果进行恰当组合,得到一个综合价值最大的返回序列。
1.2 多目标融合(MTF)简介
不同于学术界只考虑点击ratings预估的做法(即将推荐系统建模为简单的二分类问题,然后离线评估算单个AUC或者HR/MRR啥的),推荐系统的优化目标在工业界的实践中常常是有多个的(且大多为线上指标),尤其是短视频推荐场景。以短视频推荐场景为例,在推荐系统的排序建模过程中,我们需要提升用户的使用时长/正向反馈,减少负向反馈,从而提高用户的留存。短视频推荐场景中的用户反馈可分为四类:
- 隐式正反馈 用户在无意间的行为,如播放时长、播放完成率、完播、复播等等。
- 显式正反馈 用户有意识地做出的反馈,如收藏、下载、关注、点赞、发表正向评论等等。
- 隐式负反馈 用户隐式表达的负反馈,如短播放、用户终止一次session等。
- 显式负反馈 用户显式表达的负反馈,如不感兴趣、负向评论、举报等。
我们的目标是提高正向反馈、减少负向反馈,提高用户体验。然而,我们之前说过,粗排/精排的个性化多任务学习模型,能预估20多个不同的预估值,如点击率、有效播放率、播放时长、点赞率、关注率等,那如何用它来排序呢?从多任务学习到多目标排序,中间有一个过渡,即如何把这些预估值融合成一个单一的排序分,最后实现多目标精排。这也就引入了本文要介绍的正题:多目标融合(multi-task fusion, MTF)。
如上图所示,多目标融合模型在精排MTL模型输出多个预估分数(对应上述各种用户的反馈)之后,对多个预估分数进行融合,随后根据融合的打分进行精排,并输入到后续的重排模块。
2 多目标融合方法介绍
2.1 手工融合
最简单的多目标融合方式就是手工融合,一般包括线性加法、指数乘法两种:
-
线性加法
线性加法的融合公式如下:\[\text{score} = \sum_{i=1}^n w_i\space \text{score}_i \]这里\(\text{score}_i\)为精排的多任务模型对第\(i\)项目标的预估分数,包括观看动作、喜欢、观看时间等目标的预估分数。
线性加法还有许多变种,比如采用加权Logloss:
\[\text{score} = \sum_{i=1}^n w_i\space \log \text{score}_i \]线性加法的优点在于其目标权重就指示了目标在融合公式中的重要度,直观上哪个目标更重要我们就将哪个目标的权重调大。当然其缺点也非常明显,这个权重系数对于所有类型的目标都是一视同仁的。事实上对于点赞这种稀疏目标,理论上应该让预估分数高的权重更高(活跃的用户权重更高),预估分数低的权重更低(不活跃用户的权重更低),但上述形式的目标显然做不到。
-
指数乘法
\[\text{score} = \prod_{i=1}^n \space \text{score}_i^{w_i} \]和线性加法基本一样,唯一的区别是把累加换成了累乘。其优点和缺点正好和线性加法相反:其优点是可以做到增强高的预估分数、抑制低的预估分数;其缺点是不能调大单一目标的指数权重,因为如果简单地给单一目标增大指数那就相当于对所有目标都生效了(等价于融合公式整体乘一个系数)。
爱奇艺在多目标融合的初期实践中采用的就是加法融合的方式,但这样产出的排序得分对各子目标的得分值域很敏感(也即容易被某些显著偏大的目标所主导,比如点赞这种目标就可能存在一些明显偏大的异常值),因此他们增加了\(\alpha\)和\(\beta\)两个超参数,来联合调节各子目标得分的灵敏度与提升比例,也就得到了如下所示的带权指数加法[5][6]的公式形式:
- 带权指数加法\[\text{score}=\sum_{i=1}^n \text{factor}\cdot\left(\alpha_i+\text{score}_i\right)^{\beta_i} \]这里\(\text{factor}\)为超参数,表示组合权重;\(\beta\)为超参数,用于提升比例与非线性处理;\(\alpha_i\)亦为超参数,表示灵敏度。
爱奇艺在工程实践中发现,在业务目标较少时,通过加法融合公式新增目标可以短期内快速获得收益。但随着目标逐渐增多时,加法融合公式的融合能力会逐渐受限。这是因为对加法融合公式而言,新增目标后,各子目标的重要性影响会减弱。此外,哪怕是已经增加了超参数\(\alpha\)和\(\beta\)的情况下,加法融合公式仍然容易被最大的目标主导。不过,乘法融合公式就不存在这些问题。因此,在此基础上,爱奇艺又把多目标融合公式调整为了乘法:
-
带权指数乘法
\[\text{score}=\prod_{i=1}^n \text {factor}\left(\alpha_i+\text{score}_i\right)^{\beta_i} \]这里公式参数含义与上述公式一致,只是把累加换成了累乘。
手工融合的优点在于其目标权重就指示了目标在融合公式中的重要度,比较直观且可解释性强。当然其缺点也非常明显,这个权重系数对于所有用户都是一样的,缺少个性化。此外,这里无论对预估分数使用加法还是乘法的方式来融合,模型serving时的超参数均是通过网格搜索(grid search)[7]来得到离线最优的几组解。而我们知道,推荐系统的实际表现还需要线上A/B实验才能确定的,这导致该方法效率较低。而且随着模型的迭代与样本分布的变化,最优参数也在变化。最后,手工融合的缺点还体现于维护成本高(因为常常要进行多次的手工调整)。
那么,我们是否可以用模型来学习超参数呢?这就涉及到了融合超参数的学习方法[8]了,也即用一个模型来学习各预估分数的组合权重。
对于融合超参数的学习方法而而言,最容易想到的应该是离线方法,也就是用一个离线模型来学习各预估分数的组合权重。这种方法的优点和缺点都很明显,分别如下所示:
-
优点 离线方法是off-policy的方法,数据利用率高(100%样本都可以被使用),且模型的自由度和复杂度较高,可以容纳item embedding并使用稀疏特征,可以训练千亿规模的参数。
-
缺点 优化的离线AUC无法直接反映业务指标。因为这个过程做了很多简化,推荐系统不是精排之后就直接对接用户了,中间还有重排(比如多样性)等的影响,甚至还有一些商业化/运营流量的混排融合,所以该方法难以考虑到线上复杂多模块间的完整影响。此外,线下训练数据和线上数据也存在分布不一致的问题。
考虑到离线超参数学习方法具有的上述的缺点,在实际工业界的应用中,我们常常使用在线的超参数学习方法。在线方法的工作流程如下图所示:
可以看到,在线超参数学习算法基于探索与利用机制,会在baseline附近探索生成\(N\)组参数,传给推荐系统后获得这\(N\)组参数对应的展现给用户的差异化排序结果,从而获得不同用户的反馈。之后再收集这些反馈日志并做收益(reward)统计,最终送给BayesOpt/ES/CEM等调参算法产生下一组更好的参数。经过不停迭代,参数就会向一个多目标协调最优的方向前进。
在线的超参数学习方法具有以下优缺点:
-
优点 直接优化线上指标,灵活性高且反馈迅速,并且可以把推荐系统当做一个黑盒,无需关心内部细节。且可以做多场景联合优化,不限于ranking,在召回等场景也可以用。
-
缺点 需要在线上划分出一部分探索流量(大约5%),从而影响少部分用户体验,且由于数据稀疏,受噪声影响较大,尤其是一些稀疏的动作标签,比如分享、下载、收藏等;能容纳的参数量较小,一般几十到数百,相对离线学习的参数规模小很多。
常见的在线超参数学习方法包括贝叶斯优化方法(Bayesian optimization)[9]、进化策略算法(evolutionary strategy)[10]、CMA-ES自适应进化算法[11]等,下面我们主要介绍贝叶斯优化方法和进化学习算法。
2.2 融合超参数学习方法
2.2.1 贝叶斯优化算法
贝叶斯优化算法充分考虑了真实的线上收益,通过收集多组小流量经验,基于小流量实验的评估结果来进行参数优化。
贝叶斯优化的基本思想在于由于真实优化函数计算量太大或是个黑盒(比如推荐场景中用户的真实反馈收益),我们需要用一个代理函数(surrogate function) 来近似它。而在代理函数周围可能是最小值点的附近,或者是在还没有采样过的区域采样新的点之后,我们就可以更新代理函数,使之不断逼近目标函数。我们常采用高斯过程(Gaussian process, GP) 来建模概率代理函数的分布,然后再设计一个采集函数(acquisition function),基于高斯过程回归的结果来计算下一组可能更优的采样点(使采集函数最大化)。注意:这里之所以使采集函数最大化,而不是直接使代理函数最大化,因为直接优化代理函数过于目光短浅了,因为我们还要考虑不确定性。事实上,这也是一种探索(exploration)机制的体现。贝叶斯优化与网格搜索的不同之处在于,它在尝试新的超参数组合时会考虑之前的评估结果(即利用了证据,即evidence的信息来估计代理函数的后验分布),并基于代理函数来求解采集函数的极值,从而确定下一个采样点。
贝叶斯优化包含两个关键组成部分:
- 概率代理模型 用于对代理函数的分布进行建模,在迭代开始前初始化为一个指定的先验分布。常用的概率代理模型有:高斯过程(GP)、树形Parzen估计器(tree-structured parzen estimator, TPE)、神经网络、决策树等。
- 采集函数\(u\) 采集函数用于衡量每一个点值得探索的程度。每轮迭代算法会基于现有的高斯过程,从候选集中选择下一步的迭代点以使得采集函数最大化。贝叶斯优化效果受采集函数的影响较大,选择不合适的话容易陷入局部最优解。采集函数的选取可以看做一个探索-利用问题,常用采集函数包括置信区间上界(Upper Confidence Bound, UCB)方法、POI方法、EI方法等(其中最为简单易用的是UCB方法)。
首先,算法会初始化一个代理函数的先验分布,然后开始迭代。算法的第\(t\)步迭代的伪代码描述如下:
- 通过优化采集函数\(u\)以获得\(x^{t+1}\):\(x^{t+1}=\text{arg max}_{x} \space u(x\mid \mathcal{D}^{t})\)。
- 通过用户的在线反馈收益\(r\)(对应贝叶斯优化中的目标函数)得到\(y^{t+1}\)。
- 对数据进行增广:\(\mathcal{D}^{t+1} = \{\mathcal{D}^t,\quad (x^{t+1},\quad y^{t+1})\}\)。
- 更新概率代理模型(如高斯过程回归),得到一个代理函数的后验分布(做为下一步迭代的先验分布)。
算法流程示意图如下:
注意,在实际的推荐系统场景中,我们用于定义高斯过程的代理函数就是我们之前所定义的融合幂乘函数,即\(\text{score} = \prod_{i=1}^n \space \text{score}_i^{w_i}\)。具体在短视频推荐场景中,\(\text{score}_i\)可能为用户time、like、follow等行为的预估分数。用户的在线反馈收益\(r\)可以设定为单次屏幕刷新中的点赞率、平均视频播放时长等,样本集合\(\mathcal{D}=\{(x, y)\}\),这里\(x =(w_1, w_2, \cdots, w_n), y=r\)。
2.2.2 进化策略(ES)算法
前面讲述的基于贝叶斯优化的多目标融合算法虽然解决了手工融合的许多问题,但模型的参数(即多目标融合参数)仍然是单一的,不够个性化,亦不具备动态环境与上下游自适应性。
由于现在多目标融合参数量非常大(有的甚至达到了百级别),我们需要一种更高效、更自动化的方式来优化超参数,从而能够动态调整不同人群的单目标优化参数。因此,人们提出使用进化策略算法,以线上实时的真实收益为指引,对模型的参数进行优化。
注意,进化学习与强化学习的优化目标都是预期的reward,但强化学习是将噪声加入动作空间并使用反向传播来计算参数更新,而进化策略则是直接向参数空间注入噪声。
如上图所示,使用进化学习算法,线上对模型参数进行扰动,根据扰动后的结果来计算reward(常设置为人均或单刷的停留时长/播放时长/深度消费等关键业务指标),并离线进行小时级模型训练。观察到较优模型参数组合后,则更新线上的baseline模型参数。
进化算法第\(t\)轮模型迭代伪代码如下:
- 采样噪声 \(\varepsilon_1, \cdots, \varepsilon_n \sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I})\)。
- 计算reward \(r_i = r (\theta_t + \sigma \varepsilon_i),\space \text{for}\space i = 1, \cdots, n\)。
- 令\(\theta^{t+1} = \theta^t + \alpha \frac{1}{n\sigma}\sum_{i=1}^nr_i\varepsilon_i\)。
在工程实践中,该方法常常面临如何权衡reward的问题。以短视频推荐场景为例,我们常常关注单次屏幕刷新中的平均播放时长、产生交互行为(喜欢、关注等)的比率,那么我们就有以下两种结合方式:
在实践中,通常reward \((2)\)的稳定性更高。
我们进一步分析,这是一个多峰优化问题,很容易造成不同业务指标之间的此消彼长(也就是所谓的“跷跷板效应”),从而陷入局部最优,导致效果不尽如人意。
当发生跷跷板现象时,我们可以将部分reward进行进一步拆分,比如将interation_rate拆分为like_rate和follow_rate两个不同的指标:
可见,在reward的优化中,我们一直在规避不同重要指标之间的置换现象,及时调整reward的形式,不断追求理想情况(也就是Pareto最优状态)。
上述的这种进化策略算法我们一般称为自然进化策略(natual evolutionary strategy, NES)算法。除了上述这种NES算法之外,爱奇艺还提出可以采用启发式的粒子群优化(particle swarm optimization, PSO)[5][6]算法来离线搜索融合参数。该算法本质上也属于一种进化策略算法(不过不同于NES算法的在线特性,PSO算法是离线的),旨在从个体构成的群体中采样并让其中成功的个体来引导未来后代的分布。
PSO算法通过初始化一群随机的粒子,启发式地进行多次迭代来求出最优解。每一次迭代中,粒子通过个体极值(该粒子所经过的历史最优解)和群体极值(种群找到的最优解)来更新各自的位置。这样,最终所有的粒子会兼顾个体的历史最优解和群体所共享的全局最优解直至收敛。
最后,上面我们介绍的都是朴素的进化算法,缺乏进化的稳定性和自动调节学习率的特性。所以,人们又提出了利用协方差矩阵自适应策略(covariance matrix adaptation evolutionary strategies, CMA-ES)进一步提升多目标融合模型的能力。感兴趣的读者可以参见文章《新闻资讯混排场景下的多目标融合实战(四)》[11]。
参考
- [1] 渠江涛:重排序在快手短视频推荐系统中的演进
- [2] 美团搜索粗排优化的探索与实践
- [3] 袁腾飞:阿里飞猪信息流内容推荐探索
- [4] EdgeRec:边缘计算在推荐系统中的应用
- [5] 一矢多穿:多目标排序在爱奇艺短视频推荐中的应用
- [6] 大厂技术实现 | 爱奇艺短视频推荐业务中的多目标优化实践
- [7] 新闻资讯混排场景下的多目标融合实战(一)
- [8] 多目标排序在快手短视频推荐中的实践
- [9] 新闻资讯混排场景下的多目标融合实战(二)
- [10] 新闻资讯混排场景下的多目标融合实战(三)
- [11] 新闻资讯混排场景下的多目标融合实战(四)