Fork me on GitHub

一直播千万量级用户推荐系统设计之路

作者简介

冯丙见

一下科技大数据部门资深架构师

一直播现在大家都能看到它的影子,技术上面来讲很多东西都是通用的,可以在这里面借鉴一下,看看是不是有一些在你工作当中可以适用的东西。

从三个方面介绍一下我们的系统,一个是面向我们架构设计,一个是用户画像系统,还有一个是评估推荐系统。

1、推荐系统架构设计

我们先来看一下推荐系统产生的背景,随着互联网技术发展,信息过载成为普遍问题,信息消费者,从海量信息中找到自己感兴趣的内容比较困难,作为信息生产者,让自己生产的信息脱颖而出,受到广大用户的关注也是比较困难的。

这个问题很早之前就已经意识到了,并且有了解决方案。最早的解决方案是以雅虎,后来推出了搜索引擎,因为搜索引擎找到相关的内容给用户,如果用户描述的关键字不准确,或者用户本身没有什么需求,这个时候推荐系统不需要用户描述它的需求,是根据它的历史给用户推荐感兴趣的内容,推荐系统是用来满足用户需求不是很明确的时候,帮用户找到可能感兴趣的内容。

推荐系统的主要任务就是建立用户和信息之间的联系,一方面帮用户找到他可能感兴趣的内容,同时另一方面把信息呈现在可能对它感兴趣的用户面前,以此达到双方共赢。

解决海量信息过载时用户获取信息效率,解决用户无明确需求时信息获取,长尾物品推荐,满足小众个性化需求,我们现在常见的是个性化推荐,已经成为了各大网站的标配了。

再一个app上面的话是中间件存在,一个内容的话,是推荐系统根据模型推荐你内容,同时做一些相关性的推荐,比如说“看了又看,买了又买”相关性的推荐。或者你买了一个东西,给你推荐和这个东西最相关的,在一些社交网站会推荐一些相似用户或者好友相似推荐。我们会预测到用户感兴趣的话,会给推一些感兴趣的信息。

我们看一下整体流程,过滤出优质内容,去除低速、敏感信息。我们根据用户的兴趣找到他感兴趣的内容,用常用的一些算法找到感兴趣的内容,比如说看了一个美食的视频,就可以把新的视频推荐给你。

如果发现你跟某一个人很相似,那个人看过我的视频,你没看过,就可以把这个推荐给你,在这个量级,一个用户很难说一天一次把这些多文章和视频看完,所以我们进行三步走,就是把用户最感兴趣的内容放在最前面,根据用户、物品特征,含量信息预估视频的可能性,根据这个可能性从高到低的排序,把最可能看的推荐给他,经过这一步之后剩下的可能是几十个或者几个了,这个量级用户一次是有可能看完的。

我们看一下推荐系统的架构,在推荐系统里面用户跟系统有两种交互的场景,右边这个表示的是用户的一些行为数据,比如说观看信息、购买信息之类的行为信息会上报到我们的接收服务里面,缓存到消息推荐里面,后面会做两种方式的处理,一种是用这种数据训练两种模型,用来做后面的推荐用。

我们看一下推荐系统常用的算法。流行度推荐算法是热门排行榜,基于内容是标签推荐。协同过滤有UserCF 基于用户协同过滤;ItemCF 基于物品协同过滤;ModuleCF 基于模型协同过滤,还有基于图模型,基于社交关系。

推荐系统架构-排行榜

我们看第一大类是排行榜,它在推荐系统里面是非常重要的一个算法,非常简单,容易实现、非常容易理解,解决新用户冷启动问题,可作为老用户的兴趣发现方式,可作为其他算法补充,可作为系统降级方案。

缺点是所有人看的一样,没有个性化,排行榜更新相对较慢,短期不会修改太大的变化,容易受到攻击,也就是被刷榜。

介绍一下它的思路,把排行榜想象成一个梯子,每个物品都在奋力往上爬,他们的动力来自用户的手动投票,物品本身都要承受一定的重力,会从梯子上掉下来,用户投票可以抵挡部分重力,投票数不及时或者不够的话,排行榜上的物品够会掉下来。

左上角是它的公式,P表示物品得票数;T表示物品已发布时间(单位为小时),加上2是为了防止最新的物品导致分母过小;G表示“重力因子”,即将物品排名往下拉的力量。

我们看一下贝叶斯平均,曝光人数是1的时候,点击人数是1,ctr是100%,曝光人数是2的话,点击人数是1,ctr是50%,曝光人数是10000的时候,点击人数是3000,ctr是30%。

思路是先估计一个值,然后不断用新的信息修正,使得它越来越接近正确的值,如果投票人数少,总分接近全局平均分,如果投票人数多,总分接近项目平均分。

看一下它的公式,n是该项目的投票人数;x是该项目的每张选票的值;m是平均投票得分;C是平均投票人数。

推荐系统架构-基于内容推荐

下面讲一下基于内容推荐,利用用户已知兴趣特征和物品的特征相匹配为用户推荐感兴趣的商品。我举一个例子,这张表里面用户A的旅游权重是0.8%,美食是0.3%,舞蹈是0.7%,根据这个权重做一些推荐。用户B也是一样的思路。

基于内容推荐来说,优点就是实现比较简单,推荐结果比较容易理解,对于新物品在没有用户评分的情况下,也可以进行推荐,只从当前用户提供的评分构建兴趣模型,不需要像CF一样找近邻。

缺点就是对于新用户有冷启动的问题,需要生成标签,图片,视频很难提取标签,它只能推荐和用户兴趣相似的物品,无法发现令人惊喜的推荐。意思就是说如果你喜欢美食不喜欢旅游的,就只会给你推荐美食相关的,绝对不会给你推荐旅游的。

推荐系统架构-协同过滤

我们知道推荐系统构架重要的一点就是协同过滤,根据目标用户的行为特征,为他发现一个兴趣相投,拥有共同经验的群体,然后根据群体的喜好来为目标用户过滤能感兴趣的内容。

我们看一下它的优缺点,优点是推荐个性化、自动化程度高,能够有效的利用其他相似使用者的回馈信息,不断更新信息,加快个性化学习的速度,允许用户之间的分享观点,避免了内容分析的不准确;可以发现使用者潜在的但自己尚未发现的兴趣偏好。缺点是用户和项目的数量都非常大,这种情况下,评分矩阵会极度稀疏,这会对算法的效率产生消极影响,新用户、新项目存在冷启动问题,可解释性差。

推荐系统架构-相似度计算

因为会涉及到用户相似度,Jaccard相似度。杰卡德相似度是两个集合的交集元素个数在并集中所占的比例。非常适用布尔向量计算例如使用用户的收藏行为,计算用户之间的相似度。它的算法也是非常简单的。

然后是欧氏距离。欧式距离计算m维空间中两个点之间的真实距离,欧式距离得到的值是一个非负数,最大值是正无穷。通常相似度计算需要转换为[-1,1]之间。度量的是空间中两个点的绝对差异,适用于分析用户能力模型之间的差异,比如消费能力、贡献能力等。

第三个是余弦相似度,余弦相似度计算两个向量的夹角余弦值来评估他们的相似度;余弦相似度适用于文本、用户、物品相似度计算;取值在[-1,1]之间;趋近于1, 表示两个向量的方向相近;趋近于-1,表示两个向量的方向相反;趋近于0, 表示两个向量近乎于正交。

我们比较一下两种协同,从使用场景来说,UserCF适用于用户相对物品较少场景。ItemCF适用于物品数相对较少场景比如直播场景持续开播的主播相对较少。从实时性来说,UserCF用户有新的交互行为,推荐结果也需要等待模型更新时才变化。LtemCF用户有新的交互行为,推荐结果也需要等待模型更新时才变化。

冷启动方面,UserCF新用户、新物品有交互行为后,也需要等待模型更新才能有推荐结果或被推荐出去。LtemCF有两点,1. 新用户只要对一个物品有交互行为就可以给他推荐类似的其他物品;2. 新物品需要等待模型更新。推荐的理由,UserCF不能提供很好的推荐理由。LtemCF可以提供,因为看了或者买了XX所有给你推荐XX的理由。

左上角的图是用户评分为矩阵,每一行代表一个用户,每一列代表一个物品,空的部分是没有打过分,空的是他看过或者是他买过的,很少有主动评分的场景。我们的目标是把控制填出来,按照评分的高低反映给用户就可以了,做法就是把大的矩阵拆分成小矩阵。为什么说这是小矩阵,因为它的纬度远远低于大矩阵。(图),K因为是同一个,它们相乘了以后还是这样的,所以是还原了大矩阵,还原了以后把所有的坑填满了就可以反映给用户了。

我们看一个例子,左边是大矩阵,分解成两个小矩阵,用已知的值算出来以后,比如说第一个用户。(图)按照这个评分就可以反应给用户。

我们看一下Spark ALS,它需要用户ID,物品ID,还有评分。模型训练完了以后,给所有用户进行推荐,推荐完了以后得到一个新的。这个从高到低进行排序的,我们把这个反映给用户就可以了。

推荐系统架构-领域和矩阵分解

我们看一下领域和矩阵分解的不同,方式来看的话,领域是基于领域本质是基于统计的方法,没有学习的过程。矩阵分解是一种基于机器学习的方法,通过优化一个设定的指标建立最优的模型。

从复杂度来看,领域是有M个用户,N个物品,O(M_M)或O(N_N)。矩阵分解是M个用户,N个物品,F个隐类,O(F*(M+N))。

冷启动方面,领域:ItemCF新用户只要对一个物品有交互行为就可以给他推荐类似的其他物品,其他情况需要等待模型更新。

矩阵分解:新用户、新物品有交互行为后,也需要等待模型更新才能有推荐结果或被推荐出去。

推荐的理由,领域可以提供推荐解释,矩阵分解不能提供推荐解释。

推荐系统架构—多算法融合

推荐系统架构—多算法融合。在召回结束以后我们要合并为一个列表,第一种是交叉式混合,直接将不同的推荐算法的结果组合在一起推荐给用户,从而每个推荐算法的优质结果都会被展示给用户。

第二种是切换式混合,根据不同应用场景决定使用哪一种推荐算法,使用场景改变的话则切换推荐算法。

第三种是分级混合,先界定不同算法的好坏,优先使用好算法的推荐结果,得不到结果时使用次好的算法,依此类推。

推荐系统架构—排序

在召回阶段,多个通道的召回的内容是不具有可比性的,并且因为数据量太大也难以进行更加精确的偏好和质量评估,因此需要在排序阶段对召回结果进行统一的准确的打分排序。

它的做法就是右边这张图,结合用户的一些行为数据模型来,然后当用户访问的时候,我们会拿到一些符合用户的特征,我们刚才拿到了列表,用户这次什么时候访问的,使用什么设备访问的,以及什么地方来的,这种信息输出到这个排序模型里面会反馈一个结果,用户看了这个视频这个物品的可能是性多少,按照这个可能性进行从高的排序,把这个结果反映给我们。

排序-LR+GBDT,Facebook2014年的一篇论文中,提及到GBDT+LR的解决方案,先使用GBDT对一些稠密的特征进行特征选择,得到的叶子节点,再拼接离散化特征放进去LR进行训练。利用GBDT替代人工实现连续值特征的离散化,而且同时在一定程度组合了特征,可以改善人工离散化中可能出现的边界问题,也减少了人工的工作量。

2、画像系统

我们介绍一下第二部分是推荐系统—用户画像,应用的场景最主要的是用户分析和研究用的,就是单一用户行为细致分析和用户调研,可以做单独群体使用习惯研究。还有产品和运营,了解系统用户现状,优化用户体验实现精准营销,实现精准化营销。

是可以跟业务系统相关的,推荐系统,基于内容统计,排序阶段特征获取,PUSH系统,找到可能对主播感兴趣的用户。用户刚好喜欢这个主播所具有的特征,给他发信息,以此让他参加。

我们看一下用户画像的架构,最底层是原始数据,比如说物品的信息,还有各种日志,观看日志,评论日志,送礼日志等等,有了这些以后对它们进行规划。可以做一些统计行为信息,用户什么时间段喜欢看视频,每天看多少个,用户的付费能力怎么样,每天付费多少,可以根据这些行为日志,算出用户的兴趣,比如一个用户经常看跟美食相关的视频。有了用户画像以后,可以提供给运营系统,还有push系统。

用户画像分几类,一个是基础属性年龄、性别、设备型号、安装渠道、常驻地等等。用户行动就是观看时段、观看时长、消费等级、活跃度。用户兴趣是感兴趣的类别和感兴趣的标签。

3、评估推荐系统好坏

最后讲一下评估推荐系统好坏。算法评价指标有三类,1.准确率,推荐列表中用户喜欢的物品所占的比例。2.召回率,用户喜欢的物品出现在推荐列表中。3.覆盖率,描述一个推荐系统对物品长尾的挖掘能力,推荐系统能够推荐出来的物品占总物品集合的比例。

产品层面,1.用户留存;2.用户付费率;3.用户观看时长。

目标就是制定一个KPI,推荐系统的算法跟别的不太一样的,不像传统的能够定量知道加几台服务器接口能够提升多少,做法就是要进行不断大量的实验,找到真正可以提高的算法,流程就是首先要做一些离线实验,当我们确定算法以后进行一些离线实验,本身会得到一些算法上面的指标评估,进行AB测试然后查看结果,调优算法,达到我们的目标会给它切更多流量,如果没有达到这个目标就下线,这种方案不太成功的话,我们就换一种方式。

要做到这种流程的话,需要做很多的支撑,一方面是模拟推荐。在上线之前可以很直观看到结果,线上还可以跑很多的实验,你不可能用自己的手机每个看,只能通过模拟推荐随时看到每个实验的结果。第二种场景就是当我们在分析问题的时候,可以用到这样的系统,分析用户画像,以此找到问题然后提高系统的能力。

然后是AB测试系统,这是一个非常重要的系统。用户访问这个系统,AB测试根据环境信息、用户特征确定所属实验,召回排序算法生成推荐结果,推荐系统生成ID,用户反馈曝光,点击等交互信息,系统根据推荐ID统计策略、算法各项指标,根据指标调整算法。

这个是AB测试添加实验的页面,根据环境信息、用户画像添加实验,比如可以添加北京地区、男性用户,习惯晚高峰观看直播的实验,比如可以添加一线城市,高付费用户的实验。

添加完以后,就可以在系统里面查看它的推荐效果了,如果发现推荐效果不太理想,你就进行一些数据的分析,到模拟系统推荐里面查看一下,调整完以后再看效果。

以上内容是我今天要讲的所有内容,谢谢大家!

说明:本文为一直播冯丙见老师在 GOPS 2018 · 上海站演讲整理而成。


本文地址:https://www.6aiq.com/article/1553963227373
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出