如何通过精排多目标融合与超参数学习打造推荐系统?
摘要:粗排精排的个性化多任务学习模型,能预估20多个不同的预估值,如点击率、有效播放率、播放时长、点赞率、关注率等,那如何用它来排序呢?从多任务学习到多目标排序,中间有一个过渡,即如何把这些预估值融合成一个单一的排序分,最后实现多目标精排。这也
帕累托最优指的是这样一种社会状态:当且仅当不减少其他人的效用就无法增加任何一个人的效用时,这种社会状态就称之为帕累托最优。
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模型输出多个预估分数(对应上述各种用户的反馈)之后,对多个预估分数进行融合,随后根据融合的打分进行精排,并输入到后续的重排模块。
