推荐系统实践 总结

推荐系统三种常见算法

基于领域的协同过滤算法

基于用户的协同过滤 UserCF

给用户推荐和他兴趣相似的其他用户感兴趣的物品

  1. 首先整理用户到物品的兴趣度数据
  2. 根据不同用户对物品的感兴趣程度,计算用户之间的相似性
  3. 对于每个用户,取出最相似用户的 k 个用户,对每个物品,累计这些用户对每个物品的感兴趣程度

缺点是无法解释为什么推荐相关物品。

基于物品的协同过滤 ItemCF

给用户推荐和他之前喜欢物品相似的物品

  1. 整理用户到物品的兴趣度数据
  2. 根据对两个物品感兴趣的人的交集,计算物品之间的相似度
  3. 根据物品的相似度和用户的历史行为给用户生成推荐列表。对一个用户,要知道他对某位置物品的感兴趣程度,只要找到这个物品的 K 个最相近的物品,和其已经感兴趣的每个物品的相似性累加

可以提供推荐某个物品的解释,即解释用户之前看过、买过某个物品,所以推荐了这个新的物品。

活跃用户对物品相似度的贡献应该小于不活跃的用户。对异常活跃的用户,甚至需要忽略掉他的行为,以免造成无关的推荐。

ItemCF的相似度矩阵按最大值归一化

两种协同过滤的比较

UserCF 的推荐结果着重于反映和用户兴趣相似的小群体的热点,ItemCF 的推荐结果着重于维系用户的历史兴趣。

UserCF 更社会化,反映了用户所在的小型兴趣群体中物品的热门程度,ItemCF 更加个性化,反映了用户自己的兴趣传承。

用UserCF算法做推荐,相当于推荐用户所在的圈子最近在关注什么新东西。用ItemCF算法做推荐,相当于推荐我关注过的东西有什么相关新东西。

所以 UserCF 更加适合做新闻推荐,ItemCF 更加适合商品推荐。因为一个人不会说看新闻只看一种新闻,而是融入圈子,看大家看啥。而一个人一般对购买的东西有一个较为长期的偏好,经常买一类东西,说明他对这类东西有兴趣。

UserCF 偏向随大流,ItemCF 偏向个性化。

所以,如果一个人的兴趣是固定的,那么倾向使用ItemCF,一个人的关注是随大流的,那么倾向使用UserCF。UserCF 推荐出来的物品,流行度较高。

另外,从技术上说,UserCF 主要维护用户之间的相似度表,ItemCF 主要维护物品之间的相似度表。如果 Item 的更新非常快数量非常多,如每天有大量的新闻,那么用 ItemCF 会需要消耗大量的存储。


UserCFItemCF
性能适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大适用于物品数明显小于用户数的场合,如果物品很多(网页),计算物品相似度矩阵代价很大
领域时效性较强,用户个性化兴趣不太明显的领域长尾物品丰富,用户个性化需求强烈的领域
实时性用户有新行为,不一定造成推荐结果的立即变化用户有新行为,一定会导致推荐结果的实时变化
冷启动在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的。新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品。但没有办法在不离线更新物品相似度表的情况 下将新物品推荐给用户
推荐理由很难提供令用户信服的推荐解释利用用户的历史行为给用户做推荐解释,可以令用户比较信服

隐语义模型

LFM Latent Factor Model

重要的参数有4个:

  • 隐特征的个数F
  • 学习速率alpha
  • 正则化参数lambda
  • 负样本/正样本比例 ratio

ratio参数对LFM的性能影响最大。一般来说,负样本对比正样本倍数越多,准确率和召回率越高,但是覆盖率会降低,流行度会提升。

一般,LFM在所有 指标上都优于UserCF和ItemCF。但是当数据集非常稀疏时,LFM的性能会明显下降,甚至不如UserCF和ItemCF的性能。

LFM模型在实际使用中有一个困难,它很难实现实时的推荐。经典的LFM模型每次训练时都需要扫描所有的用户行为记录,这样才能计算出用户隐类向量和物品隐类向量。而且LFM的训练需要在用户行为记录上反复迭代才能获得比较好的性能。因此,LFM 的每次训练都很耗时,一般在实际应用中只能每天训练一次,并且计算出所有用户的推荐结果。从而LFM模型不能因为用户行为的变化实时地调整推荐结果来满足用户最近的行为。

所以 LFM 会面临冷启动的问题。一个内容刚刚出来时,因为还没有物品隐类向量,所以无法将物品推荐给用户。这时,可以基于物品固有信息通过人工抽取获取的特征向量训练用户到特征的线性模型。使用线性模型加LFM叠加获取推荐结果。

与 UserCF 和 ItemCF 相比,LFM 的优点是通过定义


LFMUserCF、ItemCF结论
理论基础定义损失函数,并且通过数据学习最优的参数,具有较强的理论基础基于领域统计信息,没有学习的过程LFM好
空间复杂度隐含维数 *(物品数+用户数),因为隐含维数一般较小,所以空间较小需要用户数平方或者物品数平方的空间,当用户和物品数交大时,需要巨大的空间LFM好
时间复杂度 O(K * F * S)  O(N * (K/N)^2) 、O(M*(K/M)^2) LFM略差
实时推荐给一个用户推荐最相关的 N 个物品,需要计算这个用户对所有物品的感兴趣度,无法实时推荐ItemCF可以在用户关注新的物品的即时获得新的推荐物品LFM差
推荐解释  因为获取的用户和物品的分类信息是隐含的,所以无法解释ItemCF可以很好地解释LFM差

基于图的模型

给用户 u 推荐物品的任务可以转化为度量用户顶点 v 和与 v 没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就越高。

基于领域的模型,一定程度也属于基于图的模型。

图中顶点的相关性主要取决于:

  • 两个顶点之间的路径数
  • 两个顶点之间路径的长度
  • 两个顶点之间的路径经过的顶点

而相关性高的一对顶点一般具有如下特征:

  • 两个顶点之间有很多路径相连
  • 连接两个顶点之间的路径长度都比较短
  • 连接两个顶点之间的路径不会经过出度比较大的顶点

Random-Walk Computation of Similarities between Nodes of a Graph with Application to Collaborative Recommendation

基于随机游走的PersonalRank算法

假设要给用户u进行个性化推荐,可以从用户u对应的节点vu开始在用户物品二分图上进行随 机游走。游走到任何一个节点时,首先按照概率α决定是继续游走,还是停止这次游走并从vu节 点开始重新游走。如果决定继续游走,那么就从当前节点指向的节点中按照均匀分布随机选择一 个节点作为游走下次经过的节点。这样,经过很多次随机游走后,每个物品节点被访问到的概率 会收敛到一个数。最终的推荐列表中物品的权重就是物品节点的访问概率。

收敛到一个数会需要大量的尝试计算,计算复杂度比较高。可以转化为矩阵运算问题来减小计算复杂度。

度量和测试

推荐系统通过如下的指标判断性能:

  • 用户满意度,主要通过用户调查
  • 准确度,最重要的指标,可以通过离线实验计算。推荐出来的东西,用户是否会产生实际的兴趣行为
  • 召回率,重要的指标,计算推荐的物品中,用户实际会感兴趣的占所有感兴趣物品的比例
  • 覆盖率,对长尾物品的发掘能力,不一直只推荐热门的几个话题。
  • 多样性,推荐出来的东西不在一棵树上吊死,避免给一个用户一直推荐同样几个咨询话题。
  • 信任度,提供为什么推荐的解释,利用用户好友的背书
  • 新颖性,对我们系统意义不大
  • 惊喜度,对我们系统意义不大
  • 实时性,暂时把更多的权重给刚出来的话题
  • 健壮性, 避免被攻击
  • 商业目标,是否实现商业目标是最终的度量

测试方法

离线实验

通过当前数据生成推荐算法,根据以往的用户数据推荐后,用户产生实际浏览、购买、收藏行为的情况

用户调查

成本较高。加入用户点击不喜欢,来间接判断用户满意度

在线实验

AB测试,看更新算法后,对指标有什么影响。

AB测试的系统搭建可能比较麻烦,流量划分要保证有统计意义、能应对多变量AB测试

冷启动问题

冷启动问题有三类:

  • 用户冷启动:如何给新用户做个性化推荐。当新用户到来时,没有他的行为数据,所以也无法根据他的历史行为预测其兴趣,从而无法借此给他做个性化推荐
  • 物品冷启动:如何将新的物品推荐给可能对它感兴趣的用户
  • 系统冷启动:如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统,从而在网站刚发布时就让用户体验到个性化推荐服务这一问题。

解决方案:

  • 提供非个性化的推荐,等到用户数据收集到一定的时候,再切换为个性化推荐
  • 利用用户基本信息,做粗粒度的个性化
  • 利用社交账号,推荐用户好友的喜欢的物品
  • 在用户刚开始使用时,对几个物品做基本的标注反馈
  • 利用新加入物品的基本信息,推荐给喜欢过基本信息相似的物品的用户
  • 引入专家的知识,通过一定的高效方式迅速建立起物品的相关度表

允许用户进行标注

推荐系统设计

界面

根据在阿里做广告的经验,广告的展示可以很大程度影响用户点击率。商品广告的展示相当于推荐系统的列表界面。

推荐系统的列表界面,需要包含几个大的部分:

  • 列表的标题,让用户知道这个是根据用户的习惯自动推荐的。在亚马逊上,有多个推荐区域“看过这个商品的人还看过”、“买了这个的还买过”等等,增强用户的信任度
  • 列表的内容,展示推荐物品的列表
  • 查看更多推荐,点击可以看到更多推荐内容。因为推荐列表的展示空间一般有限,无法把所有推荐都展示出来

推荐列表包含了多个推荐物品,每个物品要展示的内容有:

  • 标题
  • 缩略图,一图胜万言,帮助用户快速了解物品
  • 介绍,较短的介绍,对标题进行辅助说明,帮助用户在进入物品之前有更多了解,一定程度提升点击率
  • 推荐说明,说明为什么会推荐这个物品,提升用户信任

数据收集和存储

行为用户类型(匿名包含注册)数据规模实时存取
用户信息填写匿名
收藏注册
加入购物车注册
购买注册
评价注册
搜索展示匿名
搜索点击匿名
推荐展示匿名
推荐点击匿名
浏览页面匿名
点击不喜欢匿名
分享商品匿名

需要实时存取的数据存储在数据库和缓存中,而大规模的非实时地存取数据存储在分布式文件系统(如HDFS)中。

推荐系统设计

推荐系统的核心任务就被拆解成两部分:

  • 如何为给定用户生成特征
  • 如何根据特征找到推荐的物品

用户的特征主要包括如下几类:

  • 人口统计学特征,包括用户的年龄、性别、国籍和民族等用户在注册时提供的信息。
  • 用户的行为特征,包括用户浏览过什么物品、收藏过什么物品、给什么物品打过什么样 的分数等用户行为相关的特征。同时,用户行为从时间上也可以分为用户近期的行为和长期的行为。
  • 用户的话题特征,利用话题模型将用户行为特征处理为高层的用户特征,将电视剧和电影聚合成不同的话题,并且计算出每个用户对什么话题感兴趣。

推荐系统的推荐任务也有很多种:

  • 将最新加入的物品推荐给用户
  • 将商业上需要宣传的物品推荐给用户
  • 给用户推荐不同种类的物品
  • 给用户混合推荐,有时需要将图书和音像制品放到一个推荐列表中展示给用户
  • 在不同的产品推荐不同新颖度的物品
  • 考虑到用户访问推荐系统的上下文

如果要在一个系统中把上面提到的各种特征和任务都统筹考虑,那么系统将会非常复杂,而且很难通过配置文件方便地配置不同特征和任务的权重。因此,推荐系统需要由多个推荐引擎组 成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定权重或者优先级合并、排序然后返回。这样做的好处:

  • 降低推荐引擎设计复杂度,同时实现所有需求的一个推荐引擎很难做,调整起来牵一发动全身。
  • 多人分工合作,逐个优化各个推荐引擎
  • 可以方便地增加/删除引擎,控制不同引擎对推荐结果的影响。对于绝大多数需求,只需要通过不同的引擎组合实现。
  • 可以实现推荐引擎级别的用户反馈。每一个推荐引擎其实代表了一种推荐策略,而不同的用户可能喜欢不同的推荐策略。有些用户可能喜欢利用他的年龄性别作出的推荐,有 些用户可能比较喜欢看到新加入的和他兴趣相关的视频,有些用户喜欢比较新颖的推荐,有些用户喜欢专注于一个邻域的推荐,有些用户喜欢多样的推荐。我们可以将每一种策 略都设计成一个推荐引擎,然后通过分析用户对推荐结果的反馈了解用户比较喜欢哪些 引擎推荐出来的结果,从而对不同的用户给出不同的引擎组合权重

推荐引擎架构主要部分

  1. 生成用户特征向量
  2. 通过特征-物品相关矩阵,基于用户特征向量转化为初始推荐物品列表
  3. 对初始的推荐列表进行过滤、排名等处理,从而生成最终的推荐结果

生成用户特征向量

特征向量由特征以及特征的权重组成,在利用用户行为计算特征向量时需要考虑以下因素:

  • 用户行为的种类,用户付出代价越大的行为权重越高
  • 用户行为产生的时间,用户近期的行为比较重要
  • 用户行为的次数,行为次数多的物品对应的特征权重越高
  • 物品的热门程度,生成用户特征时会加重不热门物品对应的特征的权重

特征—物品相关推荐

使用多种推荐算法,生成多个模型,将多个模型的输出相加,得到最终的推荐物品列表。

过滤模块

过滤掉不符合要求的物品:

  • 用户已经产生过行为物品
  • 候选物品以外的物品
  • 某些质量很差的物品,过滤掉绝大多数用户评论都很差的物品

排名模块

一般排名模块需要包括很多不同的子模块,用来提高用户满意度:

  • 新颖性,给用户尽量推荐他们不知道的、长尾中的物品
    • 对热门物品降权,用户有很多渠道知道热门物品
  • 多样性,让推荐结果覆盖尽可能多的用户兴趣,但也并不是时时刻刻都需要提升多样性,有时候用户在一定时间内就是希望集中在他的一个兴趣点上
  • 时间多样性,保证用户不要每天来推荐系统都看到同样的推荐结果。
    • 用户有新行为时,尽快计算新的用户特征
    • 用户没有新的行为时,也要保证推荐结果每天都有变化
      • 记录用户每次登陆推荐系统看到的推荐结果
      • 将这些结果发回日志系统。这种数据不需要实时存储,只要能保证小于一天的延时就足够了
      • 在用户登录时拿到用户昨天及之前看过的推荐结果列表,从当前推荐结果中将用户已经看到的推荐结果降权
  • 用户反馈,通过分析用户之前和推荐结果的交互日志,预测用户会对什么样的推荐结果比较感兴趣。可以利用点击模型预测用户是否会点击推荐结果。

基于用户反馈数据的点击模型特征:

  • 用户u相关的特征,比如年龄、性别、活跃程度、之前有没有点击行为
  • 物品i相关的特征,比如流行度,平均分,内容属性
  • 物品i在推荐列表中的位置。用户的点击和用户界面的设计有很高的相关性,因此物品i在推荐列表中的位置对预测用户是否点击很重要
  • 用户之前是否点击过和推荐物品i具有同样推荐解释的其他推荐结果
  • 用户之前是否点击过和推荐物品i来自同样推荐引擎的其他推荐结果

设计推荐系统的10条经验教训

  1. 确定你真的需要推荐系统。推荐系统只有在用户遇到信息过载时才必要。如果你的网站物品不太多,或者用户兴趣都比较单一,那么也许并不需要推荐系统。所以不要纠结于推荐系统 这个词,不要为了做推荐系统而做推荐系统,而是应该从用户的角度出发,设计出能够真正帮助用户发现内容的系统,无论这个系统算法是否复杂,只要能够真正帮助用户,就是一个好的系统。
  2. 确定商业目标和用户满意度之间的关系。对用户好的推荐系统不代表商业上有用的推荐系统,因此要首先确定用户满意的推荐系统和商业上需求的差距。一般来说,有些时候用户满意和商业需求并不吻合。但是一般情况下,用户满意度总是符合企业的长期利益,因此这一条的主要观点是要平衡企业的长期利益和短期利益之间的关系。
  3. 选择合适的开发人员。一般来说,如果是一家大公司,应该雇用自己的开发人员来专门进行推荐系统的开发。
  4. 忘记冷启动的问题。不断地创新,互联网上有任何你想要的数据。只要用户喜欢你的产 品,他们就会不断贡献新的数据。
  5. 平衡数据和算法之间的关系。使用正确的用户数据对推荐系统至关重要。对用户行为数据的深刻理解是设计好推荐系统的必要条件,因此分析数据是设计系统中最重要的部分。数据分 析决定了如何设计模型,而算法只是决定了最终如何优化模型。
  6. 找到相关的物品很容易,但是何时以何种方式将它们展现给用户是很困难的。不要为了推荐而推荐。
  7. 不要浪费时间计算相似兴趣的用户,可以直接利用社会网络数据。 
  8. 需要不断地提升算法的扩展性。
  9. 选择合适的用户反馈方式。
  10. 设计合理的评测系统,时刻关注推荐系统各方面的性能。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

狼先生的烦恼
Previous post
Purity 2019团建
Next post