1.3.1 推荐算法基线
推荐算法的核心建模任务可以抽象为训练一个打分函数f(u,c,i),对任意一个用户u,在上下文条件c下,从候选内容池中找到高分物品i推荐给他,但实际情况中,我们很难对每个用户在海量的内容池中对所有物品使用复杂的函数进行打分、排序,再找到高分物品列表进行推荐,所以推荐算法通常会解构为图1-4所示的基线流程。召回、粗排、精排、重排、策略,在这些分解后的每个阶段中,各自构建不同的模型,最终这些模型构成算法执行的基线,合作得到个性化的推荐内容列表。
图1-4 信息流产品推荐算法基线流程
1.召回
召回通常被称为Recall或者Match,在大型的推荐系统中,它的目标是从亿级别的候选池中找到用户最可能感兴趣的几千到上万个物品给下一阶段的模型,召回阶段在理论上需要计算的物品量最大,需要考虑计算速度和召回精度的平衡,因此在策略设计上通常会采用“多路召回、并发执行”的方式。所谓多路召回,是指从不同的维度设计用户感兴趣物品的召回方式,最终将多路召回的结果进行融合后输出,这个设计思路借鉴了集成学习[1](Ensemble Learning)的思想,不同的召回策略起到“三个臭皮匠,顶个诸葛亮”的作用。在每一路的召回策略中,我们需要考虑两点:召回Trigger(触发因子)设计和触发因子与物品的匹配建模。推荐系统的召回触发因子,可以理解为搜索算法中的Query(查询),但不同于搜索中用户通过主动输入关键词来表达确定性需求,推荐算法建模的是用户的“不确定性需求”,因此需要通过适当的策略来表达用户对物品的行为,通常分为三种:
1)基于用户过去的行为交互物品Id(如最近看过的视频、最近浏览过的商品,目的是匹配相似物品)。
2)基于用户历史行为的高阶兴趣向量(Embedding)。
3)基于用户的偏好品类或者标签。
4)基于必要的业务策略,如热门物品、新闻资讯中的突发事件等。
召回触发因子的设计必须充分考虑业务目标和业务形态的要求,常见的各类APP推荐算法的召回触发因子设计通常见表1-1。
表1-1 各类APP推荐算法的召回触发因子设计
新闻资讯类APP的业务目标通常是用户阅读的广度和深度(也可以简化为人均消费量),所以偏向于从用户偏好、偏好的扩散以及上下文这3个方向设计召回策略(上下文是指用户所处的地域及当前的社会热点等)。电商APP的业务目标是GMV,所以需要从用户的购物路径的每个节点上增加下单转化概率,因此所有显式地表现或者模型推断出的一定的购买兴趣但未形成转化,或者下单了一段时间可能产生的复购,都可以作为召回触发因子。短视频APP的业务目标是消费时长,所以一切能增加用户时长的各个角度都需要考虑。
衡量召回触发因子设计的合理性和完整性时,可以对召回触发因子进行以下3点分析。
1)是否覆盖用户行为转化路径的每个节点。
2)是否覆盖了产品的核心功能点。
3)是否和产品当前阶段的业务目标强相关。
召回触发因子与物品的匹配模型就是我们通常说的召回侧模型,在技术层面有两种类型。
1)基于协同过滤、矩阵分解、二部图关系等建模用户和物品的相关性,并以此得到I2I、U2I、U2U2I、U2I2I、U2Tag2I等一系列离线推荐列表,以用户和物品Id构建索引,进行推荐物品召回。
2)以用户历史行为序列或者用户和物品之间的共现关系为输入,基于深度学习建模用户和物品的向量表达,以模糊最近邻(Approximate Nearest Neighbor, ANN)方式召回。
以上两种召回模型我们将在第3章详细介绍。
2.粗排
粗排介于召回和精排阶段之间,它不是推荐算法框架中的必选项。一般的实践经验中,APP达到千万级的DAU(日活跃用户数)和亿级内容库的量级时,召回阶段的输出会达到几千至上万,精排模型在精度和响应时间(Response Time, RT)之间无法兼顾,因此衍生出了粗排模型。粗排模型的目标是从上万个物品的集合中打分筛选出少量(通常是几百个)符合精排阶段算法目标的物品,送入后链路的精排阶段。粗排和精排在业务目标上的最大区别是,粗排是为了尽量过滤错误的内容召回,精排是为了贴合用户需求而尽量精细准确地找到Top N物品。
基于粗排的业务目标,最早期的粗排建模比较简单直接,通常是以物品质量分、内容热度分、商品流行度预测等模型为主,在各自业务领域里代表了质量、受欢迎程度、销量等全局的内容转化效率,推荐系统以此作为召回内容的截断和过滤机制,它解决了排序模型只以CTR为目标很难保证内容的质量问题,它的缺点是目标过于单一,且无法在用户个性化偏好角度帮助精排模型,后续随着推荐算法的进化,这部分工作逐渐融入召回阶段,作为控制单路召回内容的长度或者多路召回进入粗排前的融合方法,粗排模型也逐步进化到以逻辑回归(Logistic Regression, LR)、树模型为代表的结构简单又有一定个性化表达能力的机器学习模型,并随着个性化能力的进一步优化最终跟精排模型一样进化到深度学习的方法。
深度学习阶段的粗排模型对个性化表达能力的优化,通常通过两种不同的技术方法达到相似的模型效果。
1)基于召回模型的升级。
2)基于精排模型的压缩、简化。
基于召回模型的升级,通常是指对通过用户和物品的向量内积来表达用户偏好方法的改进。召回模型因为需要满足物品向量的提前计算和存储,以及基于向量相似度召回的需求,用户和物品的向量交互通常放在Softmax前的最后一步,这也造成了模型没办法基于高阶特征交叉学习到更多的潜在信息,粗排阶段没有这方面的顾虑,所以可以基于用户和物品的向量设计复杂的特征交叉和网络结构,最直接方法的就是在DSSM[2]内的表示层之上增加特征交叉。
第二种方式是指在训练粗排模型时,采用知识蒸馏方式来进行模型训练。知识蒸馏是一种模型“压缩”的方法,一般采取Teacher-Student训练模式:以复杂模型作为教师模型(Teacher Network),学生模型(Student Network)保持简单的结构,用教师模型来指导学生模型的训练。最终,教师模型只承担训练中的“导师”角色,真正上线部署的只有学生模型。在粗排模型的知识蒸馏实践中,我们一般以精排模型为教师模型来指导粗排模型的训练,将精排模型的知识迁移给粗排模型,提升粗排模型的泛化能力,最后得到一个结构简单、参数量小,但表达力不弱的粗排模型。
以上两种建模方式我们将在第4章详细介绍。
3.精排
精排阶段的算法是推荐算法的核心,也是推荐全链路中模型体量最大、建模目标最复杂的算法,所有召回、粗排阶段的工作都是为了能尽量地减少精排模型的打分集合,让精排模型能够在往更复杂、更精准的方向发展时有更大的空间。
精排模型的发展经历了漫长的历程,前深度学习时代的模型以LR、梯度提升决策树(Gradient Boosting Decision Tree, GBDT)、因子分解机(Factorization Machine, FM)等为典型代表。LR的优势是部署简单、可解释性好,缺点是需要大量的人工特征处理,GBDT减少了一部分特征人工处理的工作,模型所具备的一定的非线性学习能力和基于残差优化的方法也常常比LR有更好的精度,FM则是具备了一定的特征交叉能力。
从Wide & Deep[3]开始,深度学习的方法渐渐取代了传统模型,以此为起点衍生出的DeepFM[4]、Deep & Cross[5]等模型均是以Wide & Deep为基础的各种改进:引入阿达马积、外积等的特征交叉方法,引入多层神经网络提升非线性学习能力,引入更原始的用户行为序列及丰富的Side Information(用户和物品附属的一系列属性信息特征)学习更高阶的用户兴趣表达,引入Attention(注意力机制)等方法自动学习特征重要性,等等。
精排模型的另一个方向是多任务学习和多目标优化,这也是在短视频信息流发展繁荣以后,用户和内容的交互方式更加丰富,对推荐建模提出了更高的要求。以多门控混合专家(Multi-gate Mixture-of-Experts, MMoE)算法为代表,通过多专家网络、门控机制等多任务结构来协同学习不同的优化目标,确保信息流推荐中用户的点击、转化、消费时长等业务目标的共同提升。
精排阶段的算法优化,除了特征工程、模型网络结构和超参数调优之外,更重要的是基于用户行为洞察之上的业务建模思考深度。比如,用户把多个商品加入购物车但不下单代表什么样的消费心态?2h时长的电影用户只看了不到10min,基于这样的数据如何构建用户偏好表达模型?用户在信息流里不停地下滑,两种行为在负反馈倾向表达上有什么差异?对用户行为洞察和理解的深度往往决定了算法最终的成败。
关于精排算法,我们将在第5章详细介绍。
4.重排
如果精排阶段的算法工作体现的是对“推荐系统对齐产品核心商业目标”这个问题的思考深度的话,那么重排阶段的算法则体现了对产品短期和长期业务目标思考的全面性,以及对商业目标和用户体验之间共同优化的探索。重排阶段的工作主要体现在以下几个方面。
首先,精排阶段的模型往往会产出多个目标的打分结果(比如,点击率与消费时长),所以需要在重排序之前先进行目标融合,基于融合后的模型对推荐物品进行打分。融合的方法通常有启发式的随机搜索(Random Search)和网格搜索(Grid Search),有基于贝叶斯的方法,还有基于强化学习的参数学习方法,这也是目前工业界正在实践的方法。在一些书中也会将多目标融合的内容归为精排阶段的工作,这么归类也非常合理,因为只有完成了多目标融合之后才能输出精排打分的结果,在本书中,多目标融合作为独立的一章进行介绍。
重排的第二项工作是基于用户体验的优化,精排模型通常都是point-wise(单点式)的单点打分建模,或者,多目标通常都只和用户偏好强相关,所以和偏好直接相关的内容会在推荐列表里以较高的密度出现,直接推荐给用户容易带来审美疲劳等负面的消费体验,重排的首要目的是增加推荐内容的多样性,所以又叫混排。为了达到混排的目的,通常有两个方向的解决方法。
1)在尽量减少对推荐列表偏序关系破坏的基础上进行打散,增加多样性。
2)通过list-wise(列表式)的打分模型优化整体推荐列表的效果(因为推荐列表的整体转化效果不等于离线测算的单点效果之和)。
第一个方法是以“贪心算法”为主的各类变种,早期是对相似性超过一定阈值的相邻内容进行保序位移,并通过线上A/B测试的效果调整参数,后面逐渐衍生出MMR[6]、DPP[7]等融合偏好度和相似度的启发式和多样性打散算法。
基于list-wise的重排建模着眼于对精排结果序列进行进一步的修正,模型训练的目标不是单个物品的转化概率,也不是物品两两之间的转化率偏序关系,而是整个推荐列表的转化概率,其中包括DLCM[8]、PRM[9]等方法。
重排阶段的第三项工作则体现了对用户体验的更加精细化的优化:端云协同。因为云上的模型每次打分都是基于用户历史行为的,存在实时反馈信号感知延迟的情况(通常收集用户在端上的行为,传输到云上进行相关的计算,再反馈到端上的策略会有1min的延迟),因此用户在信息流的行为中的实时反馈往往会无法及时利用。所以,随着手机等终端性能的大幅提升,工业界越来越普遍采用将模型部署到客户端,这不仅可以极大地消除对反馈信号感知的延迟,而且,借鉴边缘计算的思想,我们可以进一步将每个客户端作为一个微型的服务器,进行端云协同的模型训练,针对每个用户独立地构建推荐模型,做到“千人千模”。
重排阶段的相关算法,我们将在第7章详细介绍。
5.策略
策略阶段,通常是指产品运营的相关业务策略,是推荐算法的“收尾”工作,也是推荐质量的最后一道效果保障,这个阶段的主要工作是确保推荐内容符合APP运营的阶段性业务目标和长期的产品定位,符合整体的生态策略,可能需要对推荐内容做一定的修正。例如,政策规定娱乐性太强的内容不要过多地推荐给青少年,策略阶段需要对相关内容进行针对性降权;平台当前正在对某一类创作者进行流量扶持,那么相关的作者需要适当加权;“1min前,苏炳添跑进了奥运100m决赛”这个热点新闻需要有一个强插策略;当用户对某一类内容显式地表现出明确倾向的时候(比如点击Dislike按钮),那么不需要等到模型更新,直接可以在策略层做相应的内容降权的动作。
通常在整个推荐链路中,策略阶段的工作并不作为一个独立的环节,往往是融入在重排中,因为具体的策略工作往往是业务规则调整或者是启发式的参数调参,所以通常会与重排阶段的工作进行联合优化,比如,产品运营强规则下的相关内容降权、强插需要和内容多样性协同调参,基于用户实时反馈的内容调整需要在端上执行等,因此策略阶段的工作往往是作为重排算法的一个超参,同时还必须确保多个规则之间不会互相冲突。策略阶段的规则调整和调参往往更依赖于A/B测试的结果。