最近刚接手一个涉及个性化推荐的产品,由于在此之前我对个性化推荐完全不了解,因此上网搜寻入门书籍。各路大神纷纷推荐《推荐系统实践》这本书,读完之后顿感收获颇多。将书中精华整理成系列文章,本文是第一篇。
什么是推荐系统
如果想买一包花生米,你有多少种办法?假设附近有一个24小时便利店,你可以走进店里,看看所有的货架,转一圈找到花生米,然后比较几个牌子的口碑或者价格找到自己喜欢的牌子,掏钱付款。如果家附近有一家沃尔玛,你可以走进店里,按照分类指示牌走到食品所在的楼层,接着按照指示牌找到卖干果的货架,然后在货架上仔细寻找你需要的花生米,找到后付款。如果你很懒,不想出门,可以打开当当或者淘宝,在一个叫做搜索框的东西里输入花生米3个字,然后你会看到一堆花生米,找到喜欢的牌子,付费,然后等待送货上门。上面这几个例子描述了用户在有明确需求的情况下,面对信息过载所采用的措施。在24小时便利店,因为店面很小,用户可以凭自己的经验浏览所有货架找到自己需要的东西。在沃尔玛,商品已经被放在无数的货上,此时用户就需要借用分类信息找到自己需要的商品。而在淘宝或者当当,由于商品数目巨大,用户只能通过搜索引擎找到自己需要的商品。
但是,如果用户没有明确的需求呢?比如你今天很无聊,想下载一部电影看看。但当你打开某个下载网站,面对100年来发行的数不胜数的电影,你会手足无措,不知道该看哪一部。此时, 你遇到了信息过载的问题 ,需要一个人或者工具来帮助你做筛选,给出一些建议供你选择。如果这时候有个喜欢看电影的朋友在身边,你可能会请他推荐几部电影。不过,总不能时时刻刻都去麻烦“专家”给你推荐,你需要的是一个自动化的工具,它可以分析你的历史兴趣,从庞大的电影库中找到几部符合你兴趣的电影供你选择。这个工具就是个性化推荐系统。
随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载(information overload)的时代。在这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:作为信息消费者,如何从大量信息中找到自己感兴趣的信息是一件非常困难的事情;作为信息生产者,如何让自己生产的信息脱颖而出,受到广大用户的关注,也是一件非常困难的事情。推荐系统就是解决这一矛盾的重要工具。推荐系统的任务就是联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,从而实现信息消费者和信息生产者的双赢。

推荐系统是如何工作的
要了解推荐系统是如何工作的,可以先回顾一下现实社会中用户面对很多选择时做决定的过程。仍然以看电影为例,一般来说,我们可能用如下方式决定最终看什么电影。
- 向朋友咨询。我们也许会打开聊天工具,找几个经常看电影的好朋友,问问他们有没有什么电影可以推荐。甚至,我们可以打开微博,发表一句“我要看电影”,然后等待热心人推荐电影。这种方式在推荐系统中称为社会化推荐(social recommendation),即让好友给自己推荐物品。
- 我们一般都有喜欢的演员和导演,有些人可能会打开搜索引擎,输入自己喜欢的演员名,然后看看返回结果中还有什么电影是自己没有看过的。比如我非常喜欢周星驰的电影,于是就去豆瓣搜索周星驰,发现他早年的一部电影我还没看过,于是就会看一看。这种方式是寻找和自己之前看过的电影在内容上相似的电影。推荐系统可以将上述过程自动化,通过分析用户曾经看过的电影找到用户喜欢的演员和导演,然后给用户推荐这些演员或者导演的其他电影。这种推荐方式在推荐系统中称为基于内容的推荐(content-based filtering)。
- 我们还可能查看排行榜,比如著名的IMDB电影排行榜,看看别人都在看什么电影,别人都喜欢什么电影,然后找一部广受好评的电影观看。这种方式可以进一步扩展:如果能找到和自己历史兴趣相似的一群用户,看看他们最近在看什么电影,那么结果可能比宽泛的热门排行榜更能符合自己的兴趣。这种方式称为基于协同过滤(collaborative filtering)的推荐。
从上面3种方法可以看出,推荐算法的本质是通过一定的方式将用户和物品联系起来,而不同的推荐系统利用了不同的方式。

推荐系统
推荐系统是联系用户和物品的媒介,而推荐系统联系用户和物品的方式主要有3种。如果将这3种方式都抽象一下就可以发现,如果认为用户喜欢的物品也是一种用户特征,或者和用户兴趣相似的其他用户也是一种用户特征,那么用户就和物品通过特征相联系。

当用户到来之后,推荐系统需要为用户生成特征,然后对每个特征找到和特征相关的物品,从而最终生成用户的推荐列表。因而,推荐系统的核心任务就被拆解成两部分,一个是如何为给定用户生成特征,另一个是如何根据特征找到物品。

为用户生成特征
用户的特征种类非常多,主要包括如下几类。
- 人口统计学特征 包括用户的年龄、性别、国籍和民族等用户在注册时提供的信息。
- 用户的行为特征 包括用户浏览过什么物品、收藏过什么物品、给什么物品打过什么样的分数等用户行为相关的特征。同时,用户行为从时间上也可以分为用户近期的行为和长期的行为。
- 用户的话题特征 可以根据用户的历史行为利用话题模型(topic model)将电视剧和电影聚合成不同的话题,并且计算出每个用户对什么话题感兴趣。比如用户如果看了《叶问》、《新龙门客栈》和《醉拳》,那么可以认为用户对“香港武侠电影”这个话题感兴趣。
推荐系统的其他任务
1.将最新上映的视频推荐给用户;
2.将商业上需要宣传的视频推荐给用户;
3.将多种类型的视频混合推荐给用户;
小结
如果要在一个系统中把上面提到的各种特征和任务都统筹考虑,那么系统将会非常复杂,而且很难通过配置文件方便地配置不同特征和任务的权重。因此,推荐系统需要由多个推荐引擎组成,每个推荐引擎负责一类特征和一种任务,而推荐系统的任务只是将推荐引擎的结果按照一定权重或者优先级合并、排序然后返回。

这样做还有两个好处:
- 可以方便地增加\删除引擎,控制不同引擎对推荐结果的影响。对于绝大多数需求,只需要通过不同的引擎组合实现。
- 可以实现推荐引擎级别的用户反馈。每一个推荐引擎其实代表了一种推荐策略,而不同的用户可能喜欢不同的推荐策略。有些用户可能喜欢利用他的年龄性别作出的推荐,有些用户可能比较喜欢看到新加入的和他兴趣相关的视频,有些用户喜欢比较新颖的推荐,有些用户喜欢专注于一个邻域的推荐,有些用户喜欢多样的推荐。我们可以将每一种策略都设计成一个推荐引擎,然后通过分析用户对推荐结果的反馈了解用户比较喜欢哪些引擎推荐出来的结果,从而对不同的用户给出不同的引擎组合权重。将推荐系统拆分成不同推荐引擎后,如何设计一个推荐引擎变成了推荐系统设计的核心部分。
推荐系统引擎架构
上一节提到,推荐引擎使用一种或几种用户特征,按照一种推荐策略生成一种类型物品的推荐列表。

如上图所示,推荐引擎架构主要包括3部分。
A. 该部分负责从数据库或者缓存中拿到用户行为数据,通过分析不同行为,生成当前用户的特征向量。不过如果是使用非行为特征,就不需要使用行为提取和分析模块了。该模块的输出是用户特征向量。
B. 该部分负责将用户的特征向量通过特征-物品相关矩阵转化为初始推荐物品列表。
C. 该部分负责对初始的推荐列表进行过滤、排名等处理,从而生成最终的推荐结果。
用户特征向量
一般来说,用户的特征包括两种,一种是用户的注册信息中可以提取出来的,主要包括用户的人口统计学特征。对于使用这种特征的推荐引擎,如果内存够,可以将存储这些特征的信息直接缓存在内存中,在推荐时直接拿到用户的特征数据并生成特征向量。除了这种特征,另一种特征主要是从用户的行为中计算出来的。一个特征向量由特征以及特征的权重组成。
特征-物品相关推荐
在得到用户的特征向量后,我们可以根据离线的相关表得到初始的物品推荐列表。
过滤模块
在得到初步的推荐列表后,还不能把这个列表展现给用户,首先需要按照产品需求对结果进行过滤,过滤掉那些不符合要求的物品。一般来说,过滤模块会过滤掉以下物品。
- 用户已经产生过行为物品 因为推荐系统的目的是帮助用户发现物品,因此没必要给用户推荐他已经知道的物品,这样可以保证推荐结果的新颖性。
- 候选物品以外的物品 候选物品集合一般有两个来源,一个是产品需求。比如在首页可能要求将新加入的物品推荐给用户,因此需要在过滤模块中过滤掉不满足这一条件的物品。另一个来源是用户自己的选择,比如用户选择了某一个价格区间,只希望看到这个价格区间内的物品,那么过滤模块需要过滤掉不满足用户需求的物品。
- 某些质量很差的物品 为了提高用户的体验,推荐系统需要给用户推荐质量好的物品,那么对于一些绝大多数用户评论都很差的物品,推荐系统需要过滤掉。这种过滤一般以用户的历史评分为依据,比如过滤掉平均分在2分以下的物品。
排名模块
经过过滤后的推荐结果直接展示给用户一般也没有问题,但如果对它们进行一些排名,则可以更好地提升用户满意度,一般排名模块需要包括很多不同的子模块,下面将对不同的模块分别加以介绍。
- 新颖性排名
新颖性排名模块的目的是给用户尽量推荐他们不知道的、长尾中的物品。
- 时间多样性
在用户有新行为时实时调整推荐结果以满足用户最近的需求;
要在用户没有新的行为时,也要保证推荐结果每天都有变化。
- 记录用户每次登陆推荐系统看到的推荐结果。
- 将这些结果发回日志系统。这种数据不需要实时存储,只要能保证小于一天的延时就足够了。
- 在用户登录时拿到用户昨天及之前看过的推荐结果列表,从当前推荐结果中将用户已经看到的推荐结果降权。
- 用户反馈
排名模块最重要的部分就是用户反馈模块。用户反馈模块主要通过分析用户之前和推荐结果
的交互日志,预测用户会对什么样的推荐结果比较感兴趣。如果推荐系统的目标是提高用户对推荐结果的点击率,那么可以利用点击模型(click model)预测用户是否会点击推荐结果。