最近开始接触推荐系统的相关模型,内容有点杂乱。主要是想了解一下跨域的CTR预测问题,在网上找了一下资料,找到了一些跨域的推荐算法,比如:DTCTR,MV-DNN等等。但是看了看模型感觉都不想要的解决方案,有点类似有又有点不同。后来觉得,这些算法应该是处理跨域的召回推荐问题,所以想用这篇文章来整理一下笔记与思路。
主要的内容是记录推荐系统的整个算法架构(不是系统架构),然后再记录一下看过的一些召回模型(单域与跨域)。资料均来源与各种博客,这里只是做一个对我个人的简单记录,详细内容可以见参考资料。
1. 推荐系统算法架构
详细见参考资料1.
我们在入门学习推荐系统的时候,更加关注的是哪个模型AUC更高、topK效果好,哪个模型更加牛逼的问题,从基本的协同过滤到点击率预估算法,从深度学习到强化学习,学术界都始终走在最前列。一个推荐算法从出现到在业界得到广泛应用是一个长期的过程,因为在实际的生产系统中,首先需要保证的是稳定、实时地向用户提供推荐服务,在这个前提下才能追求推荐系统的效果。
算法架构的设计思想就是在实际的工业场景中,不管是用户维度、物品维度还是用户和物品的交互维度,数据都是极其丰富的,学术界对算法的使用方法不能照搬到工业界。当一个用户访问推荐模块时,系统不可能针对该用户对所有的物品进行排序,那么推荐系统是怎么解决的呢?对应的商品众多,如何决定将哪些商品展示给用户?对于排序好的商品,如何合理地展示给用户?
所以一个通用的算法架构,设计思想就是对数据层层建模,层层筛选,帮助用户从海量数据中找出其真正感兴趣的部分。
下面是按每个分段来对推荐系统的细节进行介绍:
1.1 召回
召回层的主要目标时从推荐池中选取几千上万的item,送给后续的排序模块。由于召回面对的候选集十分大,且一般需要在线输出,故召回模块必须轻量快速低延迟。由于后续还有排序模块作为保障,召回不需要十分准确,但不可遗漏(特别是搜索系统中的召回模块)。
如果没有召回层,每个User都能和每一个Item去在线排序阶段预测目标概率,理论上来说是效果最好,但是是不现实的,线上不延迟允许,所以召回和粗排阶段就要做一些候选集筛选的工作,保证在有限的能够给到排序层去做精排的候选集的时间里,效果最大化。另一个方面就是通过这种模型级联的方式,可以减少用排序阶段拟合多目标的压力,比如召回阶段我们现在主要是在保证Item质量的基础上注重覆盖率多样性,粗排阶段主要用简单的模型来解决不同路的召回和当前用户的相关性问题,最后截断到1k个以内的候选集,这个候选集符合一定的个性化相关性、视频质量和多样性的保证,然后做ranking去做复杂模型的predict。
目前基本上采用多路召回解决范式,分为非个性化召回和个性化召回。个性化召回又有content-based、behavior-based、feature-based等多种方式。
- 召回主要考虑的内容有:
1)考虑用户层面:用户兴趣的多元化,用户需求与场景的多元化:例如:新闻需求,重大要闻,相关内容沉浸阅读等等
2)考虑系统层面:增强系统的鲁棒性;部分召回失效,其余召回队列兜底不会导致整个召回层失效;排序层失效,召回队列兜底不会导致整个推荐系统失效
3)系统多样性内容分发:图文、视频、小视频;精准、试探、时效一定比例;召回目标的多元化,例如:相关性,沉浸时长,时效性,特色内容等等
4)可解释性推荐一部分召回是有明确推荐理由的:很好的解决产品性数据的引入;
1.2 粗排
粗排的原因是有时候召回的结果还是太多,精排层速度还是跟不上,所以加入粗排。粗排可以理解为精排前的一轮过滤机制,减轻精排模块的压力。粗排介于召回和精排之间,要同时兼顾精准性和低延迟。目前粗排一般也都模型化了,其训练样本类似于精排,选取曝光点击为正样本,曝光未点击为负样本。但由于粗排一般面向上万的候选集,而精排只有几百上千,其解空间大很多。
粗排阶段的架构设计主要是考虑三个方面,一个是根据精排模型中的重要特征,来做候选集的截断,另一部分是有一些召回设计,比如热度或者语义相关的这些结果,仅考虑了item侧的特征,可以用粗排模型来排序跟当前User之间的相关性,据此来做截断,这样是比单独的按照item侧的倒排分数截断得到更加个性化的结果,最后是算法的选型要在在线服务的性能上有保证,因为这个阶段在pipeline中完成从召回到精排的截断工作,在延迟允许的范围内能处理更多的召回候选集理论上与精排效果正相关。
1.3 精排
精排层,是学习推荐入门最常常接触的层,我们所熟悉的算法很大一部分都来自精排层。这一层的任务是获取粗排模块的结果,对候选集进行打分和排序。精排需要在最大时延允许的情况下,保证打分的精准性,是整个系统中至关重要的一个模块,也是最复杂,研究最多的一个模块。
精排是推荐系统各层级中最纯粹的一层,他的目标比较单一且集中,一门心思的实现目标的调优即可。最开始的时候精排模型的常见目标是ctr,后续逐渐发展了cvr等多类目标。精排和粗排层的基本目标是一致的,都是对商品集合进行排序,但是和粗排不同的是,精排只需要对少量的商品(即粗排输出的商品集合的topN)进行排序即可。因此,精排中可以使用比粗排更多的特征,更复杂的模型和更精细的策略(用户的特征和行为在该层的大量使用和参与也是基于这个原因)。
精排层模型是推荐系统中涵盖的研究方向最多,有非常多的子领域值得研究探索,这也是推荐系统中技术含量最高的部分,毕竟它是直接面对用户,产生的结果对用户影响最大的一层。目前精排层深度学习已经一统天下了,精排阶段采用的方案相对通用,首先一天的样本量是几十亿的级别,我们要解决的是样本规模的问题,尽量多的喂给模型去记忆,另一个方面时效性上,用户的反馈产生的时候,怎么尽快的把新的反馈给到模型里去,学到最新的知识。
关于精排层的ctr预测的模型,在上一篇文章中已经系统的大概介绍过,见:推荐系统专题 | 单域推荐系统模型汇总(召回与排序算法)
1.4 重排
常见的有三种优化目标:Point Wise、Pair Wise 和 List Wise。
重排序阶段对精排生成的Top-N个物品的序列进行重新排序,生成一个Top-K个物品的序列,作为排序系统最后的结果,直接展现给用户。重排序的原因是因为多个物品之间往往是相互影响的,而精排序是根据PointWise得分,容易造成推荐结果同质化严重,有很多冗余信息。而重排序面对的挑战就是海量状态空间如何求解的问题,一般在精排层我们使用AUC作为指标,但是在重排序更多关注NDCG等指标。
重排序在业务中,获取精排的排序结果,还会根据一些策略、运营规则参与排序,比如强制去重、间隔排序、流量扶持等、运营策略、多样性、context上下文等,重新进行一个微调。重排序更多的是List Wise作为优化目标的,它关注的是列表中商品顺序的问题来优化模型,但是一般List Wise因为状态空间大,存在训练速度慢的问题。
由于精排模型一般比较复杂,基于系统时延考虑,一般采用point-wise方式,并行对每个item进行打分。这就使得打分时缺少了上下文感知能力。用户最终是否会点击购买一个商品,除了和它自身有关外,和它周围其他的item也息息相关。重排一般比较轻量,可以加入上下文感知能力,提升推荐整体算法效率。比如三八节对美妆类目商品提权,类目打散、同图打散、同卖家打散等保证用户体验措施。重排中规则比较多,但目前也有不少基于模型来提升重排效果的方案。
ps:Point Wise、Pair Wise 和 List Wise的介绍可以参考链接:【推荐】pairwise、pointwise 、 listwise算法是什么?怎么理解?主要区别是什么?
1.5 混排
多个业务线都想在Feeds流中获取曝光,则需要对它们的结果进行混排。比如推荐流中插入广告、视频流中插入图文和banner等。可以基于规则策略(如广告定坑)和强化学习来实现。
- 总结:
召回、排序这些里面单拿出任何一个模块都非常复杂。尽量可以通过点来认识面,以免对于全局缺乏认识。
所以主要的推荐系统的思路是:采用召回候选集+业务规则过滤+模型打分排序
1)召回(matching):一般包括召回和粗排两个部分。粗排部分负责将各路召回的内容进行统一的排序,取出top的内容送入到排序模块中。粗排一般使用一些不那么复杂的模型,例如gbdt、lr、fm等。
2)排序(ranking):一般包括精排和重排等部分。精排部分主要涉及到的技术为点击率预估(CTR预估),使用point-wise的方法对三元组打出一个分,然后进行排序。
2. 召回模型
2.1 单域召回模型
2.1.1 基于用户的协同过滤算法(UserCF)
基于用户的协同过滤算法(UserCF)的思想是给用户推荐和他兴趣相似的其他用户喜欢的产品,比如这里举个例子:
- 例如,我们要对用户 AA 进行物品推荐,可以先找到和他有相似兴趣的其他用户。
- 然后,将共同兴趣用户喜欢的,但用户 AA 未交互过的物品推荐给 AA。
给用户推荐物品的过程可以形象化为一个猜测用户对物品进行打分的任务,就可以理解为用户对物品的喜欢程度。
2.1.2 基于物品的协同过滤(ItemCF)
基于物品的协同过滤(ItemCF)的思想是给用户推荐和他之前喜欢的物品相似的物品,举个例子:
- 预先根据所有用户的历史行为数据,计算物品之间的相似性。
- 然后,把与用户喜欢的物品相类似的物品推荐给用户。
|
- 举例来说,如果用户 1 喜欢物品 A ,而物品 A 和 C 非常相似,则可以将物品 C
推荐给用户1。ItemCF算法并不利用物品的内容属性计算物品之间的相似度, 主要通过分析用户的行为记录计算物品之间的相似度, 该算法认为,
物品 A 和物品 C 具有很大的相似度是因为喜欢物品 A 的用户极可能喜欢物品 C。
基于物品的协同过滤算法和基于用户的协同过滤算法很像,同样可以理解为一个打分的过程。
小结:以上的协同过滤算法其实可以看出,其完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与物品的交互信息就可以实现推荐,这个精排模型各种复杂的稀疏数据处理交互注意力融合等是不一样的。但是也存在一些问题,处理稀疏矩阵的能力比较弱。
2.1.3 隐语义模型
与UserCF和ItemCF不一样,隐语义模型会先通过一些角度把用户兴趣和这些书归一下类, 当来了用户之后, 首先得到他的兴趣分类, 然后从这个分类中挑选他可能喜欢的书籍。也就是通过构建隐语义模型来获得最后用户与物品的评分矩阵。
举个例子:
更具以上两个用户与物品在另外类别上的一个评分表,就可以得到最后用户和物品的评分表(直接通过向量内积来实现)
而例子中的小清晰, 重口味, 优雅这些就可以看做是隐含特征, 而通过这个隐含特征就可以把用户的兴趣和音乐的进行一个分类, 其实就是找到了每个用户每个音乐的一个隐向量表达形式(与深度学习中的embedding等价)。但是现实中,这种P、Q矩阵一般很难获得。有的只是用户的评分矩阵,如下所示:
这种矩阵非常的稀疏,如果直接基于用户相似性或者物品相似性去填充这个矩阵是不太容易的,并且很容易出现长尾问题, 而矩阵分解就可以比较容易的解决这个问题。
2.1.4 矩阵分解算法
在矩阵分解的算法框架下, 可以通过分解协同过滤的共现矩阵(评分矩阵)来得到用户和物品的隐向量,也就是得到用户矩阵U和物品矩阵V(在后面的跨越召回算法中,很多是根据这两个UV矩阵来进行推荐的)
- 总结:
可以看出,在召回算法中,一直围绕的是用户与物品之间的评分矩阵来进行推荐(比如选出TopN个分数最高的物品,再送入下一个精排模块)。对于矩阵分解来说,为了解决用户与物品之间的评分矩阵的稀疏性问题,将评分矩阵分解成了用户矩阵U与物品矩阵V,也就是通过数学的方式建立了两个基于隐语义的矩阵。
但是,无论如何处理,召回模型本质上都是建立在这个评分矩阵上的,本质上也仅仅利用了用户与物品的交互信息实现召回推荐。这是没有利用到物品本身或者是用户自身的属性的,也就和精排模型所处理的特征类型不太一致。这就是我觉得有点相同又有点不同的原因。
因此,对于跨域的召回模型和对于跨域的ctr估计(精排)模型是有一定区别的,对于跨域的召回模型同样是建立在用户与物品的评分矩阵上,或者是基于评分矩阵而分解的用户矩阵U与物品矩阵V之上,而不是两个域各类的离散特征(filed),因为召回和精排的目标本身就是不一样的。
弄清楚了这个原因,就知道为什么同样是跨域,但是看起来也是非常的不同。召回阶段的跨域主要想处理的是冷启动和数据稀疏的问题,通过借鉴另一个域的用户与物品的交互,来指导当前领域的物品召回推荐问题,以筛选出更好的TopN个物品用于精排操作。而跨域精排,是希望引入同一媒体的跨域数据或者引入其他媒体的广告用户行为数据,来丰富用户特征以实现优化物体的 ctr 预估准确率。
以上是我的个人理解,有不对的地方希望可以指导指导。有了这个理解层面的基础,下面就开始记录一下跨域的推荐系统。
2.2 跨域召回模型
- 什么是跨域推荐?
在传统的推荐系统中,我们通过分析单一领域内的用户历史交互行为来进行用户兴趣的预测,从而进行推荐,比如说通过用户在抖音app上的历史观看视频来为用户进行后续的视频推荐。而跨域推荐旨在结合多个领域的数据,引入其它领域(源领域)的信息来进行辅助,使得在目标领域甚至多个领域上都能进行更好的推荐。
当然,不是随便拿来几个领域都能直接进行跨域推荐,不同领域间一般要存在一些重叠的信息,例如抖音和西瓜视频的公共用户,或者抖音和西瓜视频的相同视频等等都属于重叠信息的范畴,一般需要存在这样的重叠信息,才能进行不同领域间信息的迁移。比如通过公共用户在西瓜视频上的记录建模用户的兴趣,从而在抖音上进行更好的推荐。(处理冷启动问题)
- 为什么需要跨域推荐?
传统的推荐系统中一方面存在着数据稀疏问题,如用户的观看视频数相比抖音短视频总数来说非常少,存在数据稀疏问题;另一方面存在冷启动问题,如对于新加入app的用户或是新上传的短视频来说,很难进行精确推荐。
而跨域推荐可以有效地解决上述两个推荐系统的痛点,我们可以通过对用户在其它领域的交互信息进行分析,从而捕捉到用户在一定方面的偏好。这样就可以用来丰富目标领域的数据,或者在对新用户启动时增加可供利用的信息,从而在一定程度上解决这两个问题。
当然,跨域推荐系统相比一般的推荐系统要更加复杂。在传统推荐系统中,我们只需要考虑建立当前领域内的一个推荐模型进行分析;而在跨域推荐中,我们更要关心在不同领域间要选择何种信息进行迁移,以及如何迁移这些信息,这是跨域推荐系统中非常关键的问题。那么根据迁移信息的不同以及迁移方法的不同,可以对跨域推荐模型进行分类,也可以根据不同领域间重叠信息的种类进行分类。
- 跨域推荐模型分类
根据重叠信息的种类进行分类,可以分为四种场景:
1)两个领域间没有任何重叠(No Overlap)
2)两个领域间包含重叠用户(User Overlap)
3)两个领域间包含重叠物品(Item Overlap)
4)两个领域间既包含重叠用户又包含重叠物品(Full Overlap)
按照解决方法进行分类,同样可以分为四种场景:
1)基于共享实体表示的模型
2)基于域间映射的模型
3)基于异构图嵌入的模型
4)基于多领域协同训练的模型
2.2.1 基于共享实体表示的模型
适用场景:存在多个推荐领域,领域之间存在重叠实体(用户或物品),实体间的特征一般较为相似,想要提高多个领域上的推荐性能。
核心方法:该类模型关注不同领域间的重叠实体,通过共享或结合重叠实体在不同领域间的表示来融合不同领域的信息,建立领域之间的联系,提高多个领域的推荐性能。一般来说该类模型的结构可以分为三层,首先在embedding层获得用户以及物品在每个域的embedding向量;之后通过结合层将重叠实体(这里以重叠用户为例)的embedding以某种方式进行结合,这样重叠实体的表示向量中就会包含每个领域的信息;最后在预测层训练一个推荐模型,根据用户和物品的embedding表示进行推荐。
代表模型:
DTCDR(CIKM 2019)
对于每个域中的实体,都根据评分信息+其它内容信息产生不同的embedding表示。其中,通过评分信息(Ratings)获取用户矩阵U与物品矩阵V,同理内容信息(Content)也获取到用户内容信息矩阵UC与物品内容信息矩阵VC。
评分矩阵的分解可以通过上述提到的矩阵分解来实现,将一个评分矩阵分解成用户矩阵与物品矩阵,也就是分别与隐向量构建了两个信息矩阵,这个是召回模型Embedding的方式,和排序模型是非常不一样的。
之后就是通过对构建出来的域间隐矩阵进行交互,每个域分别构建损失函数联合训练。
MV-DNN(WWW 2015)
MV-DNN通过搜集得到的用户特征和物品特征生成初始的embedding,将不同领域的物品作为数据的不同视图(view)输入,用户作为数据的主视图输入,其中所有视图共享相同的MLP结构,但不共享网络的参数。每个物品视图通过MLP结构获得最终的表示向量,然后与用户视图的结果计算余弦相似度作为预测。
所有物品视图是共享了相同的用户视图的。如果是传统推荐模型的话,应该在每个领域内分别构建一个双塔模型,分别包含一个用户视图和物品视图,如果有N个领域,则会对应有2N个视图。而在MV-DNN中由于共享相同用户视图,则共有N+1个视图。通过共享用户视图使得用户在不同领域内的偏好可以得到有效利用,提高推荐性能。
所以这里的Item View 1其实也可以理解为第一个域中的所有物体的集合,Item View N就是第n个域中的所有物体的集合。这种直接通过DNN来处理每个域的Embedding其实是很常见的,亮点是最后用户视图与每一个域通过构建余弦相似度作为预测。
不过,我没怎么感受到域间迁移与交互的过程,只是纯纯的进行一个余弦相似度预测。现在看来不是很完善,缺点很明显缺失域间交互,不过也正常,毕竟是2015年的论文了。
2.2.2 基于域间映射的模型
适用场景:存在多个数据较为充足的源推荐领域,以及数据较为稀疏的目标推荐领域,想要提高目标推荐领域上的冷启动推荐性能,而冷启动用户大多在源推荐领域有交互记录。
核心方法:该类模型同样着眼于不同领域间的重叠实体,其利用重叠实体学习一个映射函数(一般是由源领域到目标领域的映射),如下图所示:
代表模型:
EMCDR(IJCAI 2017)
很清晰的看见,这个模型同样是建立在评分矩阵上的,首先在每个领域对评分矩阵进行矩阵分解得到领域内每个实体的特征表示,即用户矩阵U和物品矩阵V,用之前的矩阵分解的方法即可,都是类似的。
之后其利用重叠实体训练一个由源领域到目标领域的映射函数,就是试图使源域映射后的用户表示接近目标领域的用户表示。映射函数可以是线性的(图中step2 Linear mapping),也可以是非线性的(图中step2 MLP mapping)。训练完成后利用得到的映射函数便可以将冷启动用户映射到目标领域,进行推荐。
2.2.3 基于异构图嵌入的模型
适用场景: 不同领域间有一定的重叠实体,并且除评分信息外一般要具有一些辅助内容信息,如用户评论,物品标签等等,使得用户-用户的相似性以及物品-物品的相似性可以很好地衡量,想要提高多个领域上的推荐性能。
核心方法: 该类模型利用不同领域的实体建立一个所有领域共享的异构图,如下图所示:
通过将全部交互信息以及内容信息整合到一个共享图中,用户以及物品在不同领域的特征可以被全面地考量,使得对用户以及物品的建模更加鲁棒。顶点之间的边一般用某种相似性进行表示,如用户-物品边可以用正则化的评分表示,用户-用户边用内容向量的相似性表示。之后利用图表示学习(如GraphSAGE)得到顶点的表示向量,通过推荐模型进行推荐。
代表模型:
HeroGraph(RecSys 2020)
HeroGraph模型对每个实体分别学习两个表示向量,分别是通过embedding层得到的领域内的表示向量,以及通过异构共享图使用图表示学习得到的向量,然后将二者以某种方式结合起来(如拼接,池化等)就得到了每个实体的表示向量。如此一来,在每个领域内,用户和物品的表示都得到了(同样是基于评分矩阵),通过一个推荐模型(如MLP,内积等)就可以得到评分预测,从而在多个领域上实现更好的推荐。
2.2.4 基于多领域协同训练的模型
适用场景:领域之间的关系不明显,或者不想对领域间的关系进行建模,想要直接利用多个领域的数据提高多个领域上的推荐性能。
核心思路:利用多个领域的数据同时对多个领域上的模型进行训练,通过模型间的信息交互使得每个领域的模型的推荐性能得到提高。
代表模型:
XPTRANS(AAAI 2016)
相比于一般的矩阵分解模型,其对源领域和目标领域两个领域进行联合分解,同时将跨域知识作为约束条件指导矩阵分解,使得联合分解的结果包含一定程度的域间交互知识。
- CoNet(CIKM 2018)
CoNet模型为两个领域分别设计了一个前向神经网络作为推荐模型,特殊的地方在于每一层接收的输入不仅包含该领域的网络前一层的输出,同时包含另一个领域前一层的输出,实现一种对偶的信息交互(不过现在看来,其实也是比较普遍了,其实就是相互间进行交互)
CoNet通过一个矩阵H对另一个领域前一时刻的输出进行一次线性变换,用来控制另一个领域对该领域的影响。这样每个网络中的每一层都在进行对偶的信息交互,并没有显式地建模领域之间的关系,却能使得每个领域在推荐过程中都能很好地利用其它领域的信息,提高推荐性能。
- 总结:
这里的跨域推荐算法均作用于召回的阶段,用来实现一个教好的TopN物品推荐。这里的模型可以看见,全部基于评分矩阵或者矩阵分解的用户矩阵与物品矩阵中,和跨域的ctr推荐其实是不一样的。但是,这些跨域的召回模型可以提取其想法,可能可以在跨越ctr中带来改进的想法。
参考资料:
1. Datawhale的FunRec项目
2. 智能推荐算法演变及学习笔记(一):智能推荐算法综述
3. 走进跨域推荐系统