1. 首页
  2. 开发者
  3. 机器学习

浅谈推荐系统基础

浅谈推荐系统基础

  这篇文章的技术难度会低一些,主要是对推荐系统所涉及到的各部分内容进行介绍,以及给出一些推荐系统的常用算法,比起技术,产品色彩会强不少。参考了《长尾理论》、《推荐系统实践》以及大量相关博客内容。

什么是推荐系统

  我之前写过一篇《长尾理论》精读,里面有这样的观点:

推动市场由热门经济学向长尾经济学转变有三种力量:第一种是生产普及的力量(生产者),第二种是传播普及的力量(集合器),第三种是供需相连的力量(过滤器)。

  生产普及的力量指,当下大众制作内容(图像、音视频、文字等)的门槛大大降低,人们有能力制作并有意愿分享自己产生的内容。使得可供展示的内容量大大增加。

  传播普及的力量指,相当一部分内容由原子存在变为比特存在,不再需要占据物理世界中的『货架』,而是存储在硬盘之中,存储成本的降低使得大量非热门的长尾内容可以被摆上虚拟世界中的『货架』,真的有了对外展示的机会。

  而供需相连的力量,就是指推荐系统。

  既然存在大量的长尾内容,那如何供需相连?推荐系统要做的,就是联系用户和内容,一方面帮助用户发现对自己有价值的内容;另一方面让内容能够展现在对它感兴趣的用户面前,从而实现内容消费者和内容生产者的双赢。

  为了联系用户和内容,其实过去也有很优秀的解决方案,有代表性的比如分类目录搜索引擎

  随着互联网规模的不断扩大,分类目录网站也只能覆盖少量的热门网站,越来越不能满足用户的需求,因此搜索引擎诞生了。搜索引擎可以让用户搜索关键词来找到自己所需要的信息,但是,搜索的前提就是用户要主动提供准确的关键词,但是如果用户无法准确的描述自己需求的关键词时,搜索引擎就无能为力了。

  而推荐系统不同,它不需要用户提供明确的需求,甚至连用户主动提出需求都不需要。推荐系统通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足它们兴趣和需求的内容。

什么是好的推荐系统?

  先总体来说,一个完整的推荐系统一般存在三个参与方:用户、内容提供者和提供推荐系统的网站。

  首先,推荐系统要满足用户的需求,给用户推荐那些让他们感兴趣的内容;其次,推荐系统要让内容提供者的内容都能被推荐给对其感兴趣的用户;最后,好的推荐系统设计,能够让推荐系统本身收集到高质量的用户反馈,不断提高推荐的质量,提高推荐系统的效益。

推荐系统实验方法

  评价推荐系统效果的实验方法主要有三种,分别是离线实验用户调查在线实验

  离线实验一般是:

  • 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集
  • 将数据集按一定规则分成训练集和测试集
  • 在训练集上训练用户兴趣模型,在测试集上进行预测
  • 通过事先定义的离线指标评测算法在测试集上的预测结果

  离线实验在数据集上完成,不需要真实用户参与,可以快速的计算出来。主要缺点是离线指标往往不包含很多商业上关注的指标,比如点击率、转化率。

  用户调查是理论上最有效的方法,因为高预测准确率不等于高用户满意度,还是要从用户中来,到用户中去。

  用户调查需要有一些真实的用户,让他们在需要测试的推荐系统上完成一些任务,同时我们观察和记录他们的行为,并让他们回答一些问题,最后通过分析他们的行为和答案了解测试系统的性能。

  但是用户调查成本很高,而且测试用户也需要精心挑选,太麻烦了。

  在线实验一般在离线实验和必要的用户调查之后,一般是将推荐系统上线做AB测试,将它和旧的算法进行比较。

  AB测试是一种很常用的在线评测算法的实验方法,不仅是算法,对产品设计的改动也可以采用这种方法。它通过一定的规则将用户随机分成几组,并对不同组的用户采用不同的算法,然后通过统计不同组的各种不同的评测指标比较不同的算法性能,比如点击率。

  AB测试的缺点是周期较长,影响较大,我们通常只用它测试那些在离线实验和用户调查中表现很好的算法。

  一般而言,我们需要证明新的推荐算法在很多离线指标上优于现有算法,而且用户满意度不低于现有的算法,最后在线上AB测试后,发现在我们关心的指标上也优于现有的算法。这样新的推荐系统才能最终上线发布。

推荐系统评测指标

用户满意度

  用户满意度是推荐系统最重要的指标,但是用户满意度没法离线计算,只能通过用户调查和在线实验获得。

  用户调查前面讲了,是找一些真实的用户去试用,然后统计行为以及询问一些问题。

  在线实验一般是对一些线上用户的行为进行统计来得到用户满意度,比如在电子商务网站中,用户如果购买了推荐的商品,就表示他们在一定程度上满意;或者也可以设计一些用户反馈页面收集用户满意度。更一般的,我们可以统计点击率、用户停留时间和转化率等指标。

预测准确度

  在过去,很多人将推荐准确度作为推荐系统唯一追求的指标,比如一个推荐系统预测一个用户将来会购买一本书,而最后用户买了,这样推荐的准确度很高。

  但是,如果用户本来就准备买这本书,无论推荐与否,都会购买,那这个推荐系统,实际上并没有让用户购买更多的书。

  没有帮助用户找到新的感兴趣的内容,没有帮内容生产者找到新用户,也没增加推荐系统的总成交量(姑且叫成交量)。

  所以,预测准确度当然很重要,但推荐系统也要能扩展用户的视野,帮助他们发现那些他们可能会感兴趣,但却不那么容易发现的东西。同时,推荐系统还要能够把那些埋没在长尾中的内容推荐给可能会对它们感兴趣的用户。

  预测准确度在不同研究方向中表现形式也不同,比如评分预测中,就是需要预测,该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。

  在评分预测中,预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算,如下式:

浅谈推荐系统基础

平均绝对误差

  式子都很好理解,主要思想就是误差累加,RMSE因为使用了平方项的惩罚,对系统的评测更加苛刻。

  除了评分预测,还有TopN推荐,TopN推荐就是给用户一个个性化的推荐列表。而TopN推荐的预测准确度一般通过准确率和召回率度量,如下式:

浅谈推荐系统基础

召回率

浅谈推荐系统基础

准确率

  至于准确率和召回率,我在《浅谈机器学习基础》中有特别详细的讲解,还专门画了个图。而且在《浅谈自然语言处理基础》中,我还讲了F1测度,F1测度等于(准确率+召回率)/(2*准确率*召回率),F1测度越高越好,这样就给出了判定两个在准确度和召回率各有优势算法优劣的简单方法。除了F1测度,《浅谈机器学习基础》还提到了ROC曲线,用于协助决策。

  其实TopN推荐要比评分预测更有价值,因为判断用户对内容是否感兴趣要比预测用户对内容的评价更有意义,而且现在新的产品,也已经很少用评分来收集用户反馈了。TopN更直接也更有效。

覆盖率

  覆盖率描述一个推荐系统对长尾内容的发掘能力,也就是着力于达成前面的『推荐系统要让内容提供者的内容都能被推荐给对其感兴趣的用户』

  先给一个最简单的覆盖率定义,就是对所有用户的推荐列表取并集,看看其是否覆盖率所有的内容,覆盖比例是多少。

  但是上面的定义过于粗糙,为了更细致的描述推荐系统对长尾内容的发掘能力,我们选择统计所有用户的推荐列表中,不同物品出现次数的分布。

  如果所有的物品都出现在推荐列表中,并且出现的次数差不多,那么推荐系统发掘长尾的能力就很好,那么如何度量这种定义下的覆盖率呢?

  前面的文章不止一次的讲过熵,熵指混乱程度,熵最大的分布,就是各种物品出现的概率均匀,熵越小,就代表分布越集中,混乱程度越小。所以我们可以计算物品分布的熵值,并希望熵越大越好,熵越大指分布越平均,推荐系统也就更接近全覆盖,而不是只集中在少数热门的物品。熵的计算公式这里不给了,到处都是。

 2/15   
首页 
上一页 
1 
2 
3 
4 
5 
6 
下一页 
尾页

  第二个指标是基尼系数,先给出计算公式:

  p函数是流行度从小到大的排序,ij是按照流行度从大到小排序物品列表中的第j个物品。

  公式不好理解,这里给张图:

浅谈推荐系统基础

  这张图怎么解释呢,黑色曲线表示最不热门的x%物品的总流行度的流行度占系统的比例y%,为什么相交在(0, 0)和(1, 1)呢,(0, 0)是说,空物品的流行度之和占总物品流行度之和的0%,(1, 1)是说,所有物品的流行度之和占总物品流行度之和的100%,这个很好理解。

  然后为什么肯定在y=x之下,考虑这样一个情况,最均匀的情况,所有物品的流行度都相同,那么每增加固定百分比的物品,那增加的流行度在总流行度中占的比例也是固定的,而且也是相同的。看起来很绕,实际上很容易直观的感觉出来。

  实际上,所有物品的流行度不会是相同的,有热门物品也有冷门物品,因为是从最不热门的物品开始计算的,所以刚开始可能很高百分比的冷门物品的流行度也不多,所以这条线就会在y=x下面,增加的非常缓慢;后面到了热门物品,很少的热门物品就能增加很多的流行度,所以这条曲线增加的速度开始越来越快,最后到达(1, 1)。

  然后基尼系数就是SA/(SA+SB)了,基尼系数越小,就越接近y=x,最理想情况下,基尼系数为0,流行度完全均匀分布。

  社会学中有种现象叫做马太效应,强者愈强,弱者愈弱。这样,越热门的物品会越热门,越冷门的物品越会无人问津,推荐系统就希望尽量消除这种马太效应,让冷门物品也能找到对自己感兴趣的用户,让用户也不必只看排行榜,自己的兴趣和需求也能得到更好的满足。所以我们先根据初始用户行为(根据用户行为定义的热门/冷门)计算物品的基尼系数,然后再根据推荐系统行为(根据推荐系统的推荐次数定义的热门/冷门)计算物品的基尼系数,如果后者的基尼系数反而大了,那说明推荐算法加剧了马太效应。

  稍微解释一下,如果推荐系统只疯狂推荐某一种物品,其他物品都不推荐,这样的马太效应就反而更甚于初始的情况了,又会进一步加剧整个生态的马太效应。只有推荐系统对物品均匀的推荐,初始的热门/冷门物品的推荐次数都差不多,才能让初始的冷门产品热起来。

多样性

  多样性描述了推荐列表中物品两两之间的不相似性,推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值。

  相似性或者不相似性的度量方式有多种,比如用物品的内容相似度,我们就可以得到内容多样性函数;如果用协同过滤的相似度函数描述物品之间的相似度,就可以得到协同过滤的多样性函数。

  其实提高覆盖率也能在侧面对提高多样性起到积极作用。

新颖性

  新颖的推荐是指给用户推荐那些他们之前没听说过的物品,最简单的方式当然是,把那些用户之前在系统中有过行为的物品从推荐列表中过滤掉。

  还有种方式是让推荐结果中物品的平均热门程度较低,这样就更可能有较高的新颖性。牺牲精度提高新颖性是很容易的,困难的是不牺牲精度,同时提高新颖性。

惊喜度

  惊喜度是,如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意。提高推荐惊喜度需要提高用户满意度,同时降低推荐结果和用户历史兴趣的相似度。

  新颖度和惊喜度的区别在,新颖度说的是没听过的物品,没听过的物品是有可能与用户的历史兴趣相似的,就没有了惊喜度。惊喜度可以说是新颖度的升级,因为没听过的物品中包含与历史兴趣相似的和不相似的物品。也许惊喜度的核心在于让用户无法理解推荐原因。

 3/15   
首页 
上一页 
1 
2 
3 
4 
5 
6 
下一页 
尾页

信任度

  信任度是指用户对于推荐系统的信任程度。我们可以通过提供给用户推荐理由以及利用用户的好友/信任的人的信息给用户做推荐来提高信任度。

  但是其实很多情况下,对于一些很容易直观感受到推荐结果好坏的物品,比如音乐,信任度就不那么重要了。

实时性

  在很多网站中,因为物品具有很强的实时性,比如新闻、微博等,所以推荐系统的实时性就显得至关重要。

  推荐系统的实时性包含两部分,一部分是推荐系统需要实时地更新推荐列表来满足用户新的需求;另一部分是推荐系统需要能够将新加入系统的物品推荐给用户。

  实时性对完成推荐系统的冷启动也有着重要作用。

健壮性

  健壮性指一个推荐系统防止作弊的能力。

  设计推荐系统时,应尽量使用代价比较高的用户行为。在使用数据前,可以进行攻击检测,从而对数据进行清理。

商业目标

  推荐系统也需要满足自身商业目标的需求。

总结

  在上面提到的指标里,预测准确度、覆盖率、多样性、新颖性是可以离线计算的。实际评测算法时,我们一般采用预测准确度的正确率和召回率,覆盖率,还有推荐商品的平均流行度。

  综合一下上面的指标,我们前面说了三个目标,分别是让用户满意、让物品提供者满意、让推荐系统满意。用户满意度对应第一个目标,覆盖率对应第二个目标,商业目标对应第三个目标。因为用户满意度不容易获得,所以实际上预测准确度替代用户满意度成为了最重要的指标。然后我们回到推荐列表上,将其与物品类型结合,物品种类多就是多样性;将其与用户认知结合,用户没听过就是新颖性惊喜度是新颖性的升级。然后是整个推荐系统,推荐系统需要实时性健壮性,来稳定保证好的推荐结果。而且有的场景的推荐系统还要考虑到用户对推荐系统的信任度的问题。

  这样就把这十个指标串起来了,也更方便记忆。

  当然我们在采用以上指标进行评测时,也要考虑到评测的用户维度、物品维度、时间维度,也就是涉及评测的用户群,物品的种类属性和评测的季节、时间等。这可以让我们发现不同算法在不同场景下的优缺点。

利用用户行为数据

  实现个性化推荐最理想的情况,是用户告诉我们他喜欢什么,但这种方法有三个缺点,第一个是,现在的自然语言处理技术还很难理解用户用来描述兴趣的自然语言;第二个是,用户的兴趣是不断变化的;第三个是,用户也不知道自己喜欢什么,或者说,用户也很难用语言描述自己喜欢什么。

  这里考虑代入HMM的思想,用户的需求会不断变化,就是状态序列。而且这个状态序列是隐藏的,也就是我们无法直接获知用户的兴趣,不管是因为用户自己没意识到还是无法表达。我们需要通过观察序列,也就是用户的行为数据去做推测,去根据EM算法估计这个HMM的参数,然后再用其来得到用户的需求序列,也就是隐状态序列。

  基于用户行为分析的算法是个性化推荐系统的重要算法,学术界一般将这种算法称为协同过滤算法。

  我们能拿到的用户行为一般分为两种,显性反馈行为和隐性反馈行为,显性反馈行为就是点击喜欢不喜欢,或者评5分1分。隐性反馈行为指的是那些不能明确反应用户喜好的行为。最具代表性的隐性反馈行为就是页面浏览行为,虽然不明确,但数据量更大。而且隐性反馈只有正反馈,没有负反馈。

  即便是反馈也分为有无上下文,实际上就是是否记录了用户反馈行为的时间以及前后行为,这里先只考虑无上下文的隐性反馈数据集。

用户行为分析

用户活跃度和物品流行度的分布

  互联网上的很多数据其实都满足长尾分布,也叫PowerLaw分布,我在《浅谈自然语言处理基础》中还提到过,就是讲平滑方法,古德图灵估计法那里。里面提到了Zipf定律,也即,如果将英文单词出现的频率按照由高到低排列,则每个单词出现的频率和它在热门排行榜中排名的常数次幂成反比。也可以这么说,如果x1x2x3是三个热门排名相邻的三类单词,x1最靠前,那么出现的频率x2/x1 < x2/x3,也就是最开始下降的最快,然后下降速度越来越慢。

  我们发现,用户活跃度和物品流行度都满足长尾分布。

用户活跃度和物品流行度的关系

  我们认为,新用户倾向于浏览热门的物品,老用户会逐渐开始浏览冷门的物品。用户越活跃,越倾向于浏览冷门的物品。

  仅仅基于用户数据设计的推荐算法一般称为协同过滤算法,协同过滤算法也分为不同种类,比如基于邻域的方法隐语义模型基于图的随机游走算法等。其中应用的最广的是基于邻域的方法,而基于邻域的方法主要包括以下两种:

 

  • 基于用户的协同过滤算法:给用户推荐和他兴趣相似的用户喜欢的物品
  • 基于物品的协同过滤算法:给用户推荐和他之前喜欢的物品相似的物品

  简便起见,我们通常使用准确率、召回率、覆盖率和新颖度来对算法进行离线实验,覆盖率就用最简单的覆盖率定义,新颖度用推荐物品的平均流行度代替。

基于邻域的算法

基于用户的协同过滤算法

  基于用户的协同过滤算法主要包括两个步骤:

  • 找到和目标用户兴趣相似的用户集合
  • 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户

  第一步的关键就是找到和目标用户兴趣相似的用户,我们可以用两个用户兴趣的交集比上兴趣的并集来求得相似度(Jaccard相似度),或者利用余弦相似度计算。

  如果用余弦相似度:

  分子是两个用户兴趣交集的模,分母是两个用户兴趣的模的乘积的平方根。

  要注意的是,有很多用户之间根本就没有兴趣的交集,所以就不需要浪费时间在这种情况的计算上。

  得到用户之间的兴趣相似度之后,UserCF算法会推荐给用户和他兴趣最相似的K个用户最喜欢的若干个物品。

  判断该用户u对某一件物品i的感兴趣程度时的公式如下:

浅谈推荐系统基础

  也即用K个和他兴趣最相似用户的平均兴趣代表这个用户的兴趣。w代表两个用户兴趣之间的相似程度,r指感兴趣程度的大小,这里统一为1。Σ下面的意思是,K个和u兴趣最相似的用户,而且同时要对物品i有过行为。可以这么理解,如果这K个用户都没有对某个物品有过行为,那基本就可以认为他们对该物品都不感兴趣,就不应该加到式子中。

  换句话说,这K个用户,与用户u的相似度决定了他们的话语权,他们表决的方式就是自己是否对该物品有过正面行为。

  最后我们只需要取感兴趣程度TopN的物品出来推荐给用户就好了,当然还要去掉该用户已经有过行为的物品。

  K是UserCF算法的一个重要参数。K的选取会影响UserCF算法的结果。

  一般进行算法评测时,我们会有两个标准算法,分别是MostPopular和Random算法,一个是按最高流行度来,一个是完全随机,都只是简单的去掉用户有过行为的物品。

  UserCF算法的平均性能要远好于以上两个算法。

 5/15   
首页 
上一页 
3 
4 
5 
6 
7 
8 
下一页 
尾页

  当然UserCF算法也有改进的空间,比如在计算用户相似度的时候,大家同样购买了热门物品其实没有什么说服力,并不能以此说明两个用户就相似了,所以我们需要对热门物品进行降权,如下式:

  该公式与原公式相比,惩罚了用户u和用户v共同兴趣列表中热门物品对他们相似度的影响。这里先提一下TF-IDF,后面还要提,《浅谈机器学习基础》中讲K-means的时候就讲过TF-IDF,TF-IDF里的这个IDF,就是对出现在几乎所有文档中的热门词进行降权惩罚。

基于物品的协同过滤算法

  基于物品的协同过滤算法是目前业界应用最多的算法。

  如果网站的用户数目增加较快,计算用户兴趣的相似度矩阵就越来越难。而ItemCF算法不计算用户兴趣的相似度矩阵,而是计算物品之间的相似度。还有,我们前面说过基于邻域的这两个算法都是协同过滤算法,协同过滤算法的定义就是只使用用户行为数据,所以这里所定义的物品的相似度,不利用物品本身的内容信息去计算,而是主要通过分析用户的行为记录计算物品之间的相似度。

  如果喜欢A的用户大多都喜欢B,那么A和B可以讲拥有一定的相似性。或者说,就算不相似,那我们把B推荐给喜欢A的用户也是没错的。

  基于物品的协同过滤算法主要分为两步:

 

  • 计算物品之间的相似度
  • 根据物品的相似度和用户的历史行为给用户生成推荐列表

  我们可以用下面的公式定义物品之间的相似度:

浅谈推荐系统基础

  意思就是,买了i的用户有多少也买了j。如果两者的用户群重合比例越大,那么认为ij就更相似。

  但是还有个问题,就是如果按照上面的公式算,所有的物品都和热门商品相似,如果j是大热门商品的话,基本上喜欢i的全都喜欢j,这样就有问题,为了提高覆盖率,我们要对热门物品进行惩罚:

浅谈推荐系统基础

  上面的式子就对热门物品的权重进行了惩罚。

  得到物品的相似度之后,ItemCF通过如下公式计算用户u对物品i的兴趣:

浅谈推荐系统基础

  与UserCF对比着来说,UserCF是用K个和用户u兴趣最相似用户的平均兴趣代表这个用户u的兴趣;ItemCF就是用K个和物品j最相似的物品来代表这个物品j。UserCF是,这K个用户,与用户u的相似度决定了他们的话语权,他们表决的方式就是自己是否对该物品有过正面行为;ItemCF是,这K个物品,与物品j的相似度决定了他们的话语权,他们表决的方式就是自己是否被该用户有过正面行为。

 6/15   
首页 
上一页 
4 
5 
6 
7 
8 
9 
下一页 
尾页

  说完了新颖性,这里提一下多样性,如果仅按相似度去计算,很可能推荐出的物品都属于同一个类别。我们可以将原始推荐结果按某种内容属性分为几类,然后推荐每类前几名的物品。就像星际争霸比赛,虽然说是要看实力,但是也总是要分赛区的,每个赛区多少个名额,要是纯按实力,可能所有的名额都是韩国人的了。尽量让推荐结果来自不同的特征。

 

  还有时间多样性,前面也提过了,即便是用户不操作,也尽量不让用户每天看到相同的推荐内容。可以引入随机、记录用户看过的推荐结果进行降权或者直接每天用不同的推荐算法。

 

  排名模块最重要的部分就是用户反馈模块,用户反馈模块主要是通过分析用户之前和推荐结果的交互日志,预测用户会对什么样的推荐结果比较感兴趣,然后根据用户的兴趣进一步优化推荐结果。

 

  比如推荐系统的目标是提高用户对于推荐结果的点击率,那么可以利用点击模型预测用户是否会点击推荐结果。比如搜索结果的点击预测、搜索广告的点击预测、上下文广告的点击预测。

 

  构建这个预测模型首先需要提取特征,比如:

  • 用户相关的特征:年龄、性别、活跃度
  • 物品相关的特征:流行度、内容属性、评分
  • 物品在推荐列表中的位置
  • 用户之前是否点击过和推荐物品有同样推荐解释的其他推荐结果
  • 用户之前是否点击过和推荐物品来自同样推荐引擎的其他推荐结果

 

  本篇文章的推荐算法基本以推荐物品的推荐算法为主,上面的架构也更倾向于去解决物品推荐问题,不太适合解决社会化推荐问题。

发布者: aihot,转转请注明出处:http://www.aiwuyun.net/archives/3954.html

发表评论

登录后才能评论

联系我们

在线咨询:点击这里给我发消息

邮件:admin@aiwuyun.net

工作时间:周一至周五,9:30-18:30,节假日休息