帕累托最优指的是这样一种社会状态:当且仅当不减少其他人的效用就无法增加任何一个人的效用时,这种社会状态就称之为帕累托最优。
在介绍多目标融合模块之前,我们先来回顾一下推荐系统的基础架构,以及多目标融合模块在推荐系统中所处的基本位置。一种在各大厂(如快手[1]、美团[2]、阿里飞猪[3]等)中常见的“多层漏斗型”推荐系统架构如下:
上述过程中,召回、粗排、精排+多目标融合、序列/多样性重排、异构混排是在服务端进行(其中异构混排亦有放在移动端的[4]),端上重排[4]是在移动端进行。下面大致介绍一下这些步骤的作用:
不同于学术界只考虑点击ratings预估的做法(即将推荐系统建模为简单的二分类问题,然后离线评估算单个AUC或者HR/MRR啥的),推荐系统的优化目标在工业界的实践中常常是有多个的(且大多为线上指标),尤其是短视频推荐场景。以短视频推荐场景为例,在推荐系统的排序建模过程中,我们需要提升用户的使用时长/正向反馈,减少负向反馈,从而提高用户的留存。短视频推荐场景中的用户反馈可分为四类:
我们的目标是提高正向反馈、减少负向反馈,提高用户体验。然而,我们之前说过,粗排/精排的个性化多任务学习模型,能预估20多个不同的预估值,如点击率、有效播放率、播放时长、点赞率、关注率等,那如何用它来排序呢?从多任务学习到多目标排序,中间有一个过渡,即如何把这些预估值融合成一个单一的排序分,最后实现多目标精排。这也就引入了本文要介绍的正题:多目标融合(multi-task fusion, MTF)。
如上图所示,多目标融合模型在精排MTL模型输出多个预估分数(对应上述各种用户的反馈)之后,对多个预估分数进行融合,随后根据融合的打分进行精排,并输入到后续的重排模块。
最简单的多目标融合方式就是手工融合,一般包括线性加法、指数乘法两种:
线性加法
线性加法的融合公式如下:
这里\(\text{score}_i\)为精排的多任务模型对第\(i\)项目标的预估分数,包括观看动作、喜欢、观看时间等目标的预估分数。
线性加法还有许多变种,比如采用加权Logloss:
线性加法的优点在于其目标权重就指示了目标在融合公式中的重要度,直观上哪个目标更重要我们就将哪个目标的权重调大。当然其缺点也非常明显,这个权重系数对于所有类型的目标都是一视同仁的。事实上对于点赞这种稀疏目标,理论上应该让预估分数高的权重更高(活跃的用户权重更高),预估分数低的权重更低(不活跃用户的权重更低),但上述形式的目标显然做不到。
指数乘法
和线性加法基本一样,唯一的区别是把累加换成了累乘。其优点和缺点正好和线性加法相反:其优点是可以做到增强高的预估分数、抑制低的预估分数;其缺点是不能调大单一目标的指数权重,因为如果简单地给单一目标增大指数那就相当于对所有目标都生效了(等价于融合公式整体乘一个系数)。
爱奇艺在多目标融合的初期实践中采用的就是加法融合的方式,但这样产出的排序得分对各子目标的得分值域很敏感(也即容易被某些显著偏大的目标所主导,比如点赞这种目标就可能存在一些明显偏大的异常值),因此他们增加了\(\alpha\)和\(\beta\)两个超参数,来联合调节各子目标得分的灵敏度与提升比例,也就得到了如下所示的带权指数加法[5][6]的公式形式:
爱奇艺在工程实践中发现,在业务目标较少时,通过加法融合公式新增目标可以短期内快速获得收益。但随着目标逐渐增多时,加法融合公式的融合能力会逐渐受限。这是因为对加法融合公式而言,新增目标后,各子目标的重要性影响会减弱。此外,哪怕是已经增加了超参数\(\alpha\)和\(\beta\)的情况下,加法融合公式仍然容易被最大的目标主导。不过,乘法融合公式就不存在这些问题。因此,在此基础上,爱奇艺又把多目标融合公式调整为了乘法:
带权指数乘法
这里公式参数含义与上述公式一致,只是把累加换成了累乘。
手工融合的优点在于其目标权重就指示了目标在融合公式中的重要度,比较直观且可解释性强。当然其缺点也非常明显,这个权重系数对于所有用户都是一样的,缺少个性化。此外,这里无论对预估分数使用加法还是乘法的方式来融合,模型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]等,下面我们主要介绍贝叶斯优化方法和进化学习算法。
贝叶斯优化算法充分考虑了真实的线上收益,通过收集多组小流量经验,基于小流量实验的评估结果来进行参数优化。
贝叶斯优化的基本思想在于由于真实优化函数计算量太大或是个黑盒(比如推荐场景中用户的真实反馈收益),我们需要用一个代理函数(surrogate function) 来近似它。而在代理函数周围可能是最小值点的附近,或者是在还没有采样过的区域采样新的点之后,我们就可以更新代理函数,使之不断逼近目标函数。我们常采用高斯过程(Gaussian process, GP) 来建模概率代理函数的分布,然后再设计一个采集函数(acquisition function),基于高斯过程回归的结果来计算下一组可能更优的采样点(使采集函数最大化)。注意:这里之所以使采集函数最大化,而不是直接使代理函数最大化,因为直接优化代理函数过于目光短浅了,因为我们还要考虑不确定性。事实上,这也是一种探索(exploration)机制的体现。贝叶斯优化与网格搜索的不同之处在于,它在尝试新的超参数组合时会考虑之前的评估结果(即利用了证据,即evidence的信息来估计代理函数的后验分布),并基于代理函数来求解采集函数的极值,从而确定下一个采样点。
贝叶斯优化包含两个关键组成部分:
首先,算法会初始化一个代理函数的先验分布,然后开始迭代。算法的第\(t\)步迭代的伪代码描述如下:
算法流程示意图如下:
注意,在实际的推荐系统场景中,我们用于定义高斯过程的代理函数就是我们之前所定义的融合幂乘函数,即\(\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\)。
前面讲述的基于贝叶斯优化的多目标融合算法虽然解决了手工融合的许多问题,但模型的参数(即多目标融合参数)仍然是单一的,不够个性化,亦不具备动态环境与上下游自适应性。
由于现在多目标融合参数量非常大(有的甚至达到了百级别),我们需要一种更高效、更自动化的方式来优化超参数,从而能够动态调整不同人群的单目标优化参数。因此,人们提出使用进化策略算法,以线上实时的真实收益为指引,对模型的参数进行优化。
注意,进化学习与强化学习的优化目标都是预期的reward,但强化学习是将噪声加入动作空间并使用反向传播来计算参数更新,而进化策略则是直接向参数空间注入噪声。
如上图所示,使用进化学习算法,线上对模型参数进行扰动,根据扰动后的结果来计算reward(常设置为人均或单刷的停留时长/播放时长/深度消费等关键业务指标),并离线进行小时级模型训练。观察到较优模型参数组合后,则更新线上的baseline模型参数。
进化算法第\(t\)轮模型迭代伪代码如下:
在工程实践中,该方法常常面临如何权衡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]。
本文主要做推荐系统浅析,主要介绍推荐系统的定义,推荐系统的基础框架,简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学,本人水平有限,欢迎大家指正。
本文从零开始介绍了游戏推荐项目的发展历程,阐述了大型项目建设中遇到的业务与架构问题以及开发工程师们的解决方案,描绘了游戏推荐项目的特点以及业务发展方向,有着较好的参考与借鉴意义。