【阅读笔记】项亮前辈的《推荐系统实战》

推荐系统是个有意思的方向。项亮前辈的《推荐系统实战》来当作入门的第一本书还是很合适的,这段时间断断续续的抽空阅读了一遍。本书写的浅显易懂,很好的勾勒出了推荐引擎十年前的主流算法,以及工业推荐系统是如何打磨的。从这个角度讲,项亮前辈很好地完成了”让学生了解如何将自己了解的算法实现到一个工业系统中去“这一写作目标。

看书的过程中简单记录了一些内容,夹杂着自己突然产生的一些想法。用以过段时间后的来重新复习消化本书。


序&前言

随着互联网信息技术的快速发展,我们逐渐从信息匮乏的时代进入了信息过载(information overload)的时代。在这种情况下,不论是对于想要快速找到目标信息的消费者,还是想要让自己的信息脱颖而出的生产者,都是严峻的考验。推荐系统正是在这种环境下有了生长的土壤,它一方面可以提高用户获取有效信息的能力,另一方面可以提升高质量信息的曝光度,实现双赢。但不可避免地,也会产生信息蚕房这样的桎梏。我们该何如构建一个高效的信息推荐系统呢?我们该入何如避免信息蚕房的桎梏呢?

在写一本书前,应该思考这样几个问题。其实不论做什么事情都是一样的道理。

  • 为什么要写这本书?
  • 写给谁看?
  • 有几种角度去写这本书?

推荐系统的应用前景早在2010年的时候就已经被挖掘出来,并且开始被总结成书……虽然最早提出是在上世纪90年代。那么下一个重要领域是什么?强化学习吗?

评价推荐系统

什么是推荐系统

在互联网经济初兴之时,信息还没有那么的爆炸。一些公司可以人为地收集一些热门网站,对于信息分类组织,方便人们找到自己想要的信息。这个商机造就了第一代互联网巨头,美国有雅虎,中国有腾讯新浪搜狐网易四大门户。当技术发展,人们在明确知道自己的需求的时候,可以通过搜索功能寻找信息,这样的商机成就了Google、百度这样的第二代互联网巨头。而很多时候,人们并没有明确的需求,仅仅是想要从海量信息中找到一些自己感兴趣的信息来进行消遣。这个时候,能够通过历史数据准确捕捉用户兴趣的千人千面推荐系统就派上了用途,第三代巨头字节跳动崛起。

搜索系统什么时候比较有用呢?当信息过载,且用户有明确需求的的时候。但如果用户只是想消遣一下,并没有明确的需求该怎么办?你需要一个人或者一个工具来帮你对于过载的信息进行筛选,给出一些建议供你选择。然而人力总是昂贵且不是是实时可得的,这个时候个性化推荐系统就派上了用场。它就是一个能够自动联系物品和用户的工具。

推荐系统的应用

推荐系统严重依赖于用户的历史行为数据,因此并不能向搜索引擎那样独立存在,往往内嵌于各个领域之中,成为一个提高网站/APP用户存留,活跃度的利器。

推荐系统的应用包括不限于

  • 电子商务商品推荐(例如淘宝有好货)
    • 基于购物记录的推荐;基于好友信息的推荐;当前购买物品的相关推荐(打包销售策略)
  • 视频 / 电影推荐
    • 基于以往看过 / 喜欢的电影记录进行推荐
  • 音乐推荐
    • 标注歌曲计算歌曲之间的相似度推给用户;根据用户行为计算歌曲相似度的推荐
  • 社交网络好友推荐
    • 利用社交网络推荐物品;根据社交关系给用户推荐好友;信息流会话的排序推荐
  • 个性化阅读推荐
    • 手动关注特定人 / 领域的推荐(Google reader); 基于文章特征的推荐(Zite / 头条);基于协同过滤的推荐
  • LBS 基于位置的服务(各种网上预订服务)
  • 个性化邮件
    • 根据用户的使用历史,对每天处理的大量邮件进行整理分类推荐
  • 个性化广告推荐系统————计算广告学(互联网公司命根子)
    • 广告推荐系统是帮助广告找到对它感兴趣的用户,而普通的推荐是帮助用户找到感兴趣的信息,这是它们之间的根本差别。
    • 搜索广告:根据用户的搜索历史,判断用户的搜索目的,投放相关目的的广告。
    • 上下文广告:根据用户当前浏览的网页内容推荐相关内容的广告。

尽管推荐系统用于不同的领域,但是他们的内在构造逻辑却基本一致。都是由前台的展示页面(要设计用户的反馈机制,以不断迭代调整后台的算法),后台算法,以及日志系统这三部分组成。

为什么淘宝不建造会员之间添加好友的功能,这样小白用户就可以跟着购物达人去消费。可能是考虑隐私问题?因为淘宝的评论也都是默认匿名。

为什么音乐电台的个性化推荐这个商机早就存在,网易云音乐(2013)能用推荐系统将它做火?我觉得是因为它构造了一个音乐社区,让大家抒发出获得新奇的音乐推荐的感受,引起用户之间的共鸣,增强产品的使用粘性(听歌之前先看评论已经变成了病……)。推荐引擎也可以通过用户的这些评论反馈用NLU技术作为提取强特征去优化推荐算法,不知道猪场有没有做……应该做了吧……

未来社交网络的广告的发展空间大概率会超过搜索广告,微信QQ他们沉淀了太多有用的用户数据了!鹅厂的部门墙导致数据的利用率太低了!不知道架构调整之后有没有点起色……微信朋友圈现在全面开放第三条广告商业化不知道是不是为时已晚?现在用户的朋友圈使用时间是不是都快被抖音快手吸干了……

据说淘宝系现在的推荐、搜索流量比是六比四?

推荐系统评测

推荐系统本质上是想要消除搜素引擎带来的信息马太效应。但其实基于协同过滤算法的也会在一定程度上造成马太效应。

评测方法

一个完整的推荐系统有三个参与方:用户,信息生产者,推荐平台

推荐系统是帮助用户挖掘那些他们可能感兴趣却又不那么容易发现的内容(那些埋没在长尾中的信息内容),而不是去一昧的追求高的预测准确率,去预测很多没有新意的东西。(比如:明天太阳一定从东方升起)因为高预测准确率并不等于高的用户满意度。

通常来说,一个新的推荐系统上线需要走过以下的三个流程:

  • 离线测试,通过日志系统存留的用户数据对新模型进行离线指标的评测,与现有算法的离线指标比较。
  • 用户调查,选取一部分用户(注意要与真实用户的分布一致)进行双盲测评(实验人员和用户都不知道测试目标),尽量保证用户和实验人员在评测中不参杂主观性。
  • 在线AB test,用控制变量的方法,将新系统和原有系统分别给用户成分相似的两个用户组使用,观察两个用户组不同的表现情况,需要长时间的实验才能得到关于新旧系统对比的可靠实验结果。

评测指标

用户满意度

这是推荐系统最重要的指标。但是这个指标只能在用户调查和在线实验中获得。最常用的离线实验中无法使用。

预测准确度

推荐系统离线测评中最重要的指标。

评分预测

作为一个回归问题,常用以下两种评测指标,均方根误差 $RMSE = \sqrt{ \sum{(r_i - \hat{r} )^2}/|T|} $,以及平均绝对值误差 $MAE= \sum{| r_i - \hat{r}|}/|T|$。相比较之下,RMSE对于预测不准确的评分惩罚更大,是一个更加苛刻的评测指标。

Top N推荐

推荐的真实应用场景是给用户一个推荐列表,我们对这个列表中的结果进行准确率和召回率的计算。有些时候会选取不同的推荐列表长度N,计算一组评测结果,画出准确率 / 召回率曲线。因为我们更加关心的是用户会不会选取我们推荐列表中的内容,而没有那么关心用户对于选取内容的评价。因此TopN推荐是我们更加关注的一个指标。

覆盖率

描述推荐系统对于物品长尾的挖掘能力,这是一个内容生产者极为关心的目标。简单的想,每个内容至少被推荐给用户一下,证明了推荐系统挖掘长尾的能力。但实际情况下,不同物品的流行度极为不同,因为通过研究所有物品的流行度分布可以证明推荐系统长尾信息挖掘能力的差异。物品流行度分布越是平整,这种能力越强,覆盖率也就越高。

信息论中的信息熵的概念可以评价覆盖率,$H = - \sum p(i)logp(i)$,分布越均匀的时候,信息熵越大,覆盖率越大。

经济学中的基尼系数也可以评价覆盖率,$i_j$ 是按照物品流行度从小到大排列。 $ G = 1/(n-1) \sum_{j = 1}^{n} (2j - n -1) P(i_j)​$, 分布越平均,基尼系数越小(趋近于零),覆盖率越大。

多样性

用户的兴趣不是单一的,而是多样的。尽管用户的兴趣在较长的跨度中是不一样的,但是具体到用户访问系统的某一个时刻,这个时刻的兴趣点是确定的。理想化的推荐列表中的内容应该是和用户的兴趣同分布的。

相似性和多样性是一个相对应的概念。假设$s(i , j)​$定义了物品i,j之间的相似性,那么 用户u 的推荐列表R(u)的多样性定义如下:

$Diversity(R(u)) = 1 - 2*\sum s(i,j) / |R(u)|(|R(u) - 1|)​$

新颖性

推荐系统提高推荐内容新颖性方法很简单,直接过滤掉用户已经关注过的内容就好。但是这种方法不能排除掉用户通过其他途径获得过的信息。另一个想法是,如果推荐物品中的平均流行度更低,那么其对于用户的新颖性是更大的。这很容易做到,其难点在于如何在不牺牲推荐精度的情况下提升推荐内容的多样性和新颖度。

惊喜度

惊喜度这个指标乍一看和新颖性关联性很强。但这只是英文翻译成中文后词语之间的相似性对于我们带来的困扰。

当推荐的一个内容与用户以往的使用记录相关性很低,却又使用户很满意的时候,用户是惊喜的。这就是惊喜度的定性定义。换个角度思考,为了提高用户的惊喜度,需要首先降低推荐内容与用户以往使用记录的相关性,另一方面需要提升用户的满意度。由于第一方面因素的限制,是的惊喜度成为了一个推荐系统比较难以提高的指标。并且,提高这个指标还会冒着相对较大的风险,因为一个与用户以往使用记录不类似的内容不可控因素也会更大。但是这个点倒是可以和强化学习的“探索”结合起来,进一步优化系统。

信任度

在电商的推荐场景下,这是一个很重要的指标。当用户信任推荐系统的推荐和不信任时做出的选择是完全不同的。一般来说有以下两种方式:

  • 提供推荐内容的解释信息;
  • 根据用户的好友信息进行推荐,博得用户的信任感。
实时性

在某些场景下,信息的时效性是非常重要的。比如:新闻的推荐。推荐系统的实效性一般来说分为两个方面。

  • 实时的更新推荐列表需用户有新的变化行为。这可以通过推荐列表的变化速率来进行测评。如果推荐列表在用户有行为后变化不大或者没有变化,说明其实时性不够高。
  • 实时的将新加入系统的内容推荐给感兴趣的用户,这主要考验了系统的冷启动能力。可以通过记录用户的推荐列表中有多大比例的物品是当天新加入的来判断这个方面的实时性。
健壮性

任何一个能带来利益的算法都会被人攻击,反作弊能力这个时候就至关重要了,也就是系统的鲁棒性。算法健壮性的检测主要依靠模拟攻击。用常用的攻击方法是向推荐系统中注入噪声,比较攻击前后两次系统生成的推荐列表的内容差异,如果没有太大变化,证明系统比较鲁棒。

另外,在算法设计的时候,尽量主要考虑使用代价比较高的用户行为特征。这样的数据由于攻击代价较高,因此更不容易受到攻击;另一方面,由于攻击代价较高,这样的数据中本身的混有的噪声也更少。

商业目标

对于公司而言,推荐系统是为了提高公司的营收额,本质上是想要提高每个用户为公司带来的营收额。而这种计算指标计算一次的代价过于高昂,不同的公司根据其具体情况设计了不同的商业目标。有的是商品消费额,有的是广告点击总数,有的是广告展示总数等等。

评测维度

推荐系统不存在银弹,我们需要根据我们的数据状况,以及实际的应用背景选择合适的推荐系统。这就需要我们从多个维度全面的考虑算法的优劣。一般来说,分为如下三个方面:

  • 用户维度:新旧用户,活跃度,用户的人口统计学信息。
  • 物品维度:物品属性、流行度、新旧程度
  • 时间维度:季节,白天 / 晚上,工作日 / 周末

利用用户行为数据

用户的行为数据分为两大类,一类是通过设计的用户反馈模块返回的显性反馈,通常这类数据数量较小,产生代价更高,对于用户画像的描述贡献更大;另一类是用户在网站上的一般性操作(例如浏览)返回的隐性反馈。这类数据并不会十分明确地表达出用户的喜好,但数据量比较大,对于推荐系统的构造也起到了不可忽视的作用。

隐形数据中的大量噪音如何消除?(例如用户被虚假标题诱导的错误点击,或者交互不合理导致的错误点击)

基于邻域的算法

基于用户的协同过滤算法

基于邻域的用户协同过滤算法是最古老的推荐算法之一。这个算法有两个关键任务。

  • 如何找到与目标用户兴趣相似的用户集合?
    • 两个用户有过正反馈的物品集合越大说明两个用户的相似性越大,但很明显,所有物品在这个方法下的权重不应该是相同的,需要对热门的物品的权重进行一个惩罚。
  • 何如找到这个集合中用户喜欢的,且目标用户没有听说过的物品推荐给用户(新奇)。
    • 是否推荐一个物品有两方面因素决定,一方面这个集合中的用户有多少个对这个物品有过正反馈操作?另一方面,这些有正反馈操作的用户与目标用户的兴趣相似度有多大?

基于物品的协同过滤算法

这是2010年左右业界最常用的算法。用以解决基于用户的协同过滤算法的两个弊端。第一,基于用户的协同过滤算法要探究所有用用户之间的相似性,那么随着用户的增加,用户相似度矩阵将越来越大。时间复杂度和空间复杂度也以平方的级别增加,矩阵难以维护。其次,基于用户的协同过滤算法做出推荐的时候没有办法做出推荐解释,用户的信任度比较低。

基于物品的协同过滤算法有两个关键任务。

  • 何如获取物品之间的相似度?
    • 物品的相似性用后验概率来表示,喜欢物品A的用户中有多少人同时喜欢B,人数越多,说明两个物品的相似度越高。(这里需要对特别活跃的用户降权重)
  • 何如根据物品相似度和用户的历史行为给用户生成推荐列表。
    • 某物品与目标用户历史上正反馈的的物品的相似度越高越容易被推荐。相似度归一化可以提高性能。

UserCF 与 ItemCF之间的比较

UserCF的推荐结果更加着重于反应和用户兴趣相似的小群体的热点,也就是说大家都关心的东西就推荐给新用户,新用户也大概率会关心;ItemCF 的推荐结果更着重于维系用户的历史兴趣,不同用户也有自己所关心的领域。

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

没有“银弹”,在不同的业务场景下,在不同的数据背景下。算法的表现不尽相同,真实的推荐结果往往是扬长避短,多种推荐算法的集成。

一个推荐系统可不可以用户连续的使用时长为标准切换不同的算法。例如抖音,用户刚登陆可以用UserCF推荐一波热点视频,随着用户连续使用的时常增加,可以逐步平滑的切换到ItemCF实时变化,推荐更多兴趣化的内容。

隐语义算法

就是文本挖掘领域中的主题模型(LSI、pLSA、LDA等)。一方面提取待推荐物品的主题向量,另一方面提取目标用户的兴趣主题向量。当两个向量相似度越高说明越合适被推荐。

这里有个构造负样本的点需要注意。应该选取那些比较热门但是用户却没有行为的样本作为负样本。

这类方法有个弊端就是很难做到较高的实时性。因为计算用户隐向量的时候需要扫描用户之前的所有的操作记录,很耗时。在实时性要求比较高的新闻推荐领域不适合使用这种方法。

基于图的模型

基于图的推荐算法算法是构造基于用户和物品的二分图,用基于大数据量统计的随机游走算法(PersonalRank)来衡量顶点之间的相似性,进而选择推荐的物品。顶点之间的相似性需要从以下三个方面衡量

  • 两个顶点之间的路径数(相关性高的两个节点之间的路径数多)
  • 两个顶点之间的路径长度(相关性高的两个节点之间的路径长度短)
  • 两个顶点之间的路径经过的顶点(相关性高的两个节点之间的路径不会经过出度比较大的节点)

随机游走算法就是每次从目标点出发,按照特定的概率$ \alpha $决定是继续走下去还是返回起始点。如果继续走下去,就按照均匀分布的方式随机选择下一个节点作为下次需要经过的结点。循环往复这个过程。但是随机游走算法需要多次迭代才能收敛,只能用早停或者构造转移概率矩阵的方式求解。

推荐系统冷启动

推荐系统冷启动就是如何淘来第一桶金的问题。根据对象的不同分为三个方面。

  • 用户的冷启动
  • 物品的冷启动
  • 系统的冷启动

用户的冷启动

用户的冷启动指的是一个新用户刚加入网站后没有对应的历史行为数据,如何为他推荐物品。

首先可以考虑从用户的注册信息破局。其实从引入额外信息的角度考虑,用户的冷启动越来越是个伪问题。随着每个用户再互联网上留下的蛛丝马迹越来越多,冷启动问题也就越来越不是个问题了。

用户的注册信息分为以下三种:

  • 人口统计学特征:年龄,性别、职业、民族、学历、居住地等等一系列。
  • 用户兴趣描述:新用户注册界面可以给之以少许的标签(或者典型物品)选择来让用户表述自己的兴趣。
  • 建立账号体系:从其它网站导流(社交网站为最佳,可以借助社交推荐的力量)。

可以根据已有的信息,选择用树状结构对用户进行分组,对新用户进行粗粒度的个性化推荐。或者辅以最热门物品的加权推荐。

物品冷启动

UserCF算法对于物品的冷启动是不敏感的。要知道,目标用户获取新推荐物品的方式是根据相似人群喜欢的物品,知道将新物品加入到系统中,只要被一个用户有正反馈就必然会逐步扩散开来。

对于ItemCF算法来说,新物品的冷启动显然更加的困难。我们想要将一个物品推荐给用户需要先找到与其相似的物品,但是在没有物品使用记录的时候就无法更新物品的相关性表。这时候可以根据物品不同类型的特征构造特征向量,运用向量的相似性度量方法去寻找相似物品(内容过滤算法)。但是这样的方法却没有考虑到用户行为,也忽略了物品流行度,精确性就相对差一些。

系统冷启动

在一个新系统一穷二白的时候可以先用热门排行榜(这也是一种推荐方法)的方式积累原始数据。或者用大的代价请专家迅速建立起现有物品的相关性表,就可以初始时候就采用ItemCF的推荐方式。

利用用户标签数据

推荐系统中的用户标签数据是重要的用户反馈。相比于用户的行为数据,这样的显性反馈对于捕捉用户的兴趣准确性会更高。但是再或者标签数据的时候,也要关注如何获得更高质量的数据,显然给用户推荐他可能选择的标签可以显著降低用户反馈的成本,同时也能提高反馈标签的质量(用户自己写新标签可能写错,或者新构造出了与现有某标签的同义标签)。因此,关于这个点主要有以下两个问题需要解决。

  • 如何利用标签数据为用户更好的推荐物品?
  • 如何为用户推荐标签,以提高标签数据的质量?

以用户反馈标签构造推荐算法,最简单的想法。首先可以找到用户最喜欢用的若干标签,然后找到拥有这些标签最多的对应物品,将这些物品推荐给用户。这个算法会非常倾向于热门标签对应的热门物品,为了提高推荐系统的新颖性,可以通过TF-IDF的方法去降低热门标签的权重,甚至同时惩罚热门物品。

复杂一点的算法,可以将用户,标签,物品三部分分别分开,构造成图结构的三部分顶点,然后同样用随机游走算法去推荐物品。基于标签的系统还有一个优点就是可以很好的根据标签生成推荐理由,增加用户的信任度,从而提高点击通过率。

为用户推荐标签的算法可以简单到只有一行代码,因为仅是一个排序算法。第一种,可以推荐系统中最常出现的标签;第二种方法,可以推荐给用户其本身最喜欢用的标签;第三种,推荐给用户的标签是待打标签物品最经常被打的标签。然后,还可以进一步地将它们线性加权起来使用。当然还可以用图结构下的随机游走算法确定所推荐的标签。

利用上下文信息

一个好的推荐系统往往要考虑多方面的信息。前面所述的所有推荐算法都可以增加关于用户时间信息,地理信息,用户心情信息等等上下文信息来辅助进行推荐。

以时间效应为例,我们在周中搜索的内容往往是工作相关的内容,周末搜索的往往是个人兴趣,呈现出强周期性;我们在冬天想要买的鞋子显然和夏天想要买的鞋子不是一样的种类;一个体育新闻只有刚发生时才是用户想要的,时间越久用户对于他的兴趣是越低的。如果能够基于此能够特定调整推荐系统的推荐内容,相信会提高用户的满意度。加上时间信息之后,推荐系统就相当于多了一个时间的维度,成为一个时变系统。

推荐系统的时效性分为近期和远期两种。这需要算法平衡用户近期行为和远期行为。既要让推荐列表反映出用户近期行为所体现出的兴趣变化,又不能让推荐列表完全受用户近期行为的影响,保证推荐列表对用户兴趣的预测延续性。

另一方面,推荐系统应该在时间维度上体现出多样性这一特点。这要求加入用户有一段时间没有操作,推荐列表也能表现出一些变化。要做到这一点比较容易,大体有以下三种方法:

  • 推荐算法生成的时候本身就加入一些随机性。比如最后展示的是个结果是从排名前二十的结果中随机采样获取的。
  • 对之前看到过的内容进行降权。减小再次生成的概率。
  • 推荐系统集成若干种算法,可以根据时间信息,采取不同的算法推荐。

如果从地理信息的位置信息考虑个性化推荐系统,有一种金字塔模型的集成算法思路。根据用户的地理位置信息进行树结构的划分,可以划分若干层。基于每一层的位置信息进行推荐内容的生成,最后展示的推荐信息是每一层信息的加权结合。心情信息也可以参照此思路采取类似的算法。

利用社交网络信息

根据社交网络的推荐给推荐系统带来最大的好处就是可以增加用户的信任度,其实是可以辅助解决新用户的冷启动问题。推荐系统的根本目的是提高用户点击率(满意度),而提升推荐物品的被信任程度和提升被推荐物品的准确度(惊喜度)是同时存在的两种实现方式。这种社会化推荐对于提升用户的广告接受度有着非常强烈的作用。

基于社交网络的推荐

最主要的社交网络信息从用户的注册邮件 / 手机通信录来获得,当然了,如果用户愿意绑定 自己的社交帐号到新网站。新网站有可能会获取用户的在社交网络中的关系以及兴趣点,以实现根据社交网络关系的推荐。

社交网络的数据一般分为三种,基于社区(小组)的弱关联社交关系;基于单向关注的社交关系(例如微博);基于双向确认的强社交关系(例如微信)。

社交推荐同样可以采用基于邻域的推荐方法,以及基于图的推荐方法。值得注意的是,同热门物品权重过大的问题一样。社交网络关系中也存在”大V“这样的热门人物,需要有特殊的权重处理。另外,在实际应用中,UserCF的实用价值不高,因为在给一个用户作推荐的时候,需要他所有好友的历史行为数据,计算起来会比较缓慢。现有的社交网络推荐主要以信息流的方式存在,当某用户产生一条内容后,这条内容会出现在所有关注他的人的消息队列当中。如果这个消息是一条广告推荐,非常有利于提升其他用户对于广告品牌的好感以及对广告内容的接受程度。

给用户推荐好友

好友推荐系统的目的是根据用户的现有好友、以及用户的行为记录,给用户推荐信的朋友,从而提升整个社区的社交网络稠密性,提升用户粘性以及活跃度。

具体的推荐思路有以下几种。

  • 基于用户基本信息:例如用户的地点,年龄,性别,学校,职业等等信息推荐潜在的好友。
  • 基于共同兴趣:UGC社区中一定会设计若干机制让用户对内容反馈。可以利用这些反馈数据构造用户的兴趣向量,通过计算向量相似度的方式找到潜在的好友。
  • 基于社交网络图:根据用户的社交关系链进行推荐,就是著名的六度人脉网络理论。

推荐系统的架构

推荐系统一般有UI设计,日志系统,后台存储系统,推荐算法等几个部分。

推荐系统往往有多个推荐引擎组成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定权重或者优先级合并、排序然后返回。所以Ranking组是一个比较核心的组?

这样组合一方面方便增加或者删除不同推荐引擎;另一方面在使用不同的推荐引擎的时候,可以获得到推荐引擎级别的用户反馈。

  • A模块:负责从用户的基本统计信息,或者隐性、显性的用户行为数据中提取特征向量。
  • B模块:维护着若干项物品相关性表(从不同的角度分析)。
  • 过滤功能:去掉用户已经见过的物品;去掉质量很差的物品;去掉不符合推荐候选(商业因素)的物品
  • 排名模块:将推荐引擎得到的结果进一步排序(内容展现顺序很影响用户点击率),以期提高用户的满意度。
    • 新颖性:将匹配度较高,且流行度较低的长尾物品推荐给过滤模块。
    • 多样性:精心选择内容属性(影响很大),尽量防止同一个推荐原因出现多次。已经被用过的推荐理由下次采样得到的权重减半就是一个常见的处理方式。
    • 时间多样性:也就是所谓的实时性。可以记录用户上次的推荐内容,即使上次用户没有操作,用户下次登陆也不会再次推荐重复的内容(对已经看过的内容进行降权)。
    • 用户反馈:排名模块最重要的部分就是用户反馈模块。用户反馈模块主要通过分析用户之前和推荐结果的交互日志,预测用户会对什么样的推荐结果比较感兴趣。如果推荐系统的目标是提高用户对推荐结果的点击率,那么可以利用点击模型(click model)预测用户是否会点击推荐结果。点击模型需要离线计算好,在线将模型加载到内存中。

设计推荐系统的十个建议

  1. 确定你真的需要推荐系统:只有信息过载时候才需要,不要为了推荐而推荐。无论算法是否复杂,能过达到目的的系统就是好的系统。
  2. 确定商业目标和用户满意度之间的关系:用户满意度和商业目标并不一定是完全吻合的。商业目标更多关注短期,用户满意度则是长期收益。
  3. 选择合适的开发人员。
  4. 忘记冷启动:互联网大潮席卷每一个人,每个用户都不断的在互联网都吓自己的蛛丝马迹。我们有越来越多的初始数据来了解一个人,冷启动问题将慢慢消逝。
  5. 数据与算法:深刻理解数据是设计一个好的算法的必要前提。数据分析决定了如何设计模型,算法只是去优化这个模型。
  6. 呈现方式:找到相关值得推荐的物品不难,难的是以何种方式展现给用户,以提高用户的点击率。
  7. 社交网络的力量:社交推荐势必会慢慢替代陈旧的基于邻域的协同过滤算法,这是推荐系统的高地。
  8. 不断提高系统的、模型的可拓展性。
  9. 选择恰当的用户反馈方式。
  10. 设计合理的测评系统,关注推荐系统各个方面的性能。

十年Recsys 总结

2018 推荐系统总结

-------------本文结束 感谢您的时间-------------
0%