一、推荐系统概述
1.1 概述
推荐系统目前几乎无处不在,主流的app都基本应用到了推荐系统。例如,旅游出行,携程、去哪儿等都会给你推荐机票、酒店等等;点外卖,饿了么、美团等会给你推荐饭店;购物的时候,京东、淘宝、亚马逊等会给你推荐“可能喜欢”的物品;看新闻,今日头条、腾讯新闻等都会给你推送你感兴趣的新闻....几乎所有的app应用或网站都存在推荐系统。
究其根本的原因,推荐系统的流行是因为要去解决一个问题:物品越来越多,信息越来越多,而人的精力和时间是有限的,需要一个方式去更有效率地获取信息,链接人与信息。
推荐系统就是为了解决这一问题而诞生的,在海量的物品和人之间,架起来一条桥梁。它就像一个私人的专属导购,根据你的历史行为、个人信息等等,为每个人diy进行推荐,千人前面,帮助人们更好、更快地选择自己感兴趣的、自己需要的东西。今日头条系的feed流在推荐算法的加持下,短短几年的用户增长速度和使用时长数据令人咂舌,受到了市场的追捧和高估值。一夜之间,几乎所有的app都开始上feed流、上各种推荐,重要性可见一斑。
1.2 基本架构
我们先把推荐系统简单来看,那么它可以简化为如下的架构。
图1 推荐系统一般流程
不管是复杂还是简单的推荐系统,基本都包含流程:
- 1)结果展示部分。不管是app还是网页上,会有ui界面用于展示推荐列表。
- 2)行为日志部分。用户的各种行为会被时刻记录并被上传到后台的日志系统,例如点击行为、购买行为、地理位置等等。这些数据后续一般会被进行ETL(extract抽取、transform转换、load加载),供迭代生成新模型进行预测。
- 3)特征工程部分。得到用户的行为数据、物品的特征、场景数据等等,需要人工或自动地去从原始数据中抽取出特征。这些特征作为输入,为后面各类推荐算法提供数据。特征选取很重要,错的特征必定带来错误的结果。
- 4)召回部分。 有了用户的画像,然后利用数据工程和算法的方式,从千万级的产品中锁定特定的候选集合,完成对推荐列表的初步筛选,其在一定程度上决定了排序阶段的效率和推荐结果的优劣。
- 5)排序部分。针对上一步的候选集合,会进行更精细化地打分、排序,同时考虑新颖性、惊喜度、商业利益等的一系列指标,获得一份最终的推荐列表并进行展示。
完整的推荐系统还会包括很多辅助模块,例如线下训练模块,让算法研究人员利用真实的历史数据,测试各类不同算法,初步验证算法优劣。线下测试效果不错的算法就会被放到线上测试,即常用的A/B test系统。它利用流量分发系统筛选特定的用户展示待测试算法生成的推荐列表,然后收集这批特定用户行为数据进行线上评测。
图2 蘑菇街推荐系统架构
推荐系统每个部分可大可小,从图2可知,各部分涉及的技术栈也较多。终端app每时每刻都在不断上报各类日志,点击、展示、时间、地理位置等等信息,这些海量信息需要依赖大数据相关软件栈支持,例如Kafka、spark、HDFS、Hive等,其中Kafka常被用于处理海量日志上报的消费问题。将数据进行ETL后存入Hive数据仓库,就可进行各类线上、线下测试使用。线下的算法会上线到线上环境进行ABtest,ABtest涉及完整的测试回路打通,不然拿不到结果,也无法快速开发迭代算法。线上推荐系统还要关注实时特征、离线特征,在性能和各类指标、商业目标间取均衡。
1.3 评测指标
一个东西做得好还是不好,能不能优化,首要前提是确定评测指标。只有确定了评测指标,才能有优化的方向。评测推荐系统的指标可以考虑以下几个方面:
1.3.1 用户满意度
用户作为推进系统的主要参与者,其满意度是评测系统的最重要指标。满意度可以通过做用户调查或线上实验获得。在在线系统中,一般通过对用户行为的统计得到,例如点击率、用户停留时间和转化率等指标度量用户的满意度。
1.3.2 预测精确度precision
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的离线评测指标。由于离线数据可计算,绝大部分科研人员都在讨论这个指标。
评分预测问题一般使用RMSE、MAE等,TopN预测问题一般使用Recall、Precision等。
图3 常见的指标准确率(Precision)、召回率(Recall)、误检率
其实目前国内很多地方和资料混淆了两个指标的叫法,把准确度对应英文precision指标。不过尽量还是用英文比较好。
准确度Accuracy = (TP + TN) / (TP + FP + TN + FN)
精确度Precision=TP/(TP+FP)
1.3.3 覆盖率coverage
覆盖率描述一个推荐系统对物品长尾的发掘能力。覆盖率有很多定义方法,最简单的计算就是推荐列表中的物品数量,除以所有的物品数量。
在信息论和经济学中有两个著名的指标用来定义覆盖率,一个是信息熵,一个是基尼系数。具体公式和介绍可以google。
ps:长尾在推荐系统中是个常见的名词。举个例子帮助大家理解,在商店里,由于货架和场地有限,摆在最显眼的地方的物品通常是出名的、热门的,从而销量也是最好的。很多不出名或者小知名度的商品由于在货架角落或者根本上不了货架,这些商品销量很差。在互联网时代,这一现象会被打破。电子商城拥有几乎无限长的“货架”,它可以为用户展现很多满足他小众需求的商品,这样总的销量加起来将远远超过之前的模式。
Google是一个最典型的“长尾”公司,其成长历程就是把广告商和出版商的“长尾”商业化的过程。数以百万计的小企业和个人,此前他们从未打过广告,或从没大规模地打过广告。他们小得让广告商不屑一顾,甚至连他们自己都不曾想过可以打广告。但Google的AdSense把广告这一门槛降下来了:广告不再高不可攀,它是自助的,价廉的,谁都可以做的;另一方面,对成千上万的Blog站点和小规模的商业网站来说,在自己的站点放上广告已成举手之劳。Google目前有一半的生意来自这些小网站而不是搜索结果中放置的广告。数以百万计的中小企业代表了一个巨大的长尾广告市场。这条长尾能有多长,恐怕谁也无法预知。无数的小数积累在一起就是一个不可估量的大数,无数的小生意集合在一起就是一个不可限量的大市场。
图4 长尾曲线
1.3.4多样性
用户的兴趣是多样的,推荐系统需要能覆盖用户各种方面的喜好。这里有个假设,如果推荐列表比较多样,覆盖了用户各种各样的兴趣,那么真实命中用户的兴趣概率也会越大,那么就会增加用户找到自己感兴趣的物品的概率。
1.3.5 新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。要准确地统计新颖性需要做用户调查。
1.3.6 惊喜度
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
1.3.7 信任度
用户对推荐系统的信任程度。如果用户信任推荐系统,那就会增加用户和推荐系统的交互。特别是在电子商务推荐系统中,让用户对推荐结果产生信任是非常重要的。同样的推荐结果,以让用户信任的方式推荐给用户就更能让用户产生购买欲,而以类似广告形式的方法推荐给用户就可能很难让用户产生购买的意愿。提高推荐系统的信任度主要有两种方法。首先需要增加推荐系统的透明度(transparency),而增加推荐系统透明度的主要办法是提供推荐解释。其次是考虑用户的社交网络信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。
1.3.8 实时性
在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。因此,在这些网站中,推荐系统的实时性就显得至关重要。
推荐系统的实时性包括两个方面。首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。
1.3.9 健壮性
衡量了一个推荐系统抗击作弊的能力。算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
1.3.10 商业目标
很多时候,评测推荐系统更加注重商业目标是否达成,而商业目标和盈利模式是息息相关的。一般来说,最本质的商业目标就是平均一个用户给公司带来的盈利。不过这种指标不是很难计算,只是计算一次需要比较大的代价。因此,很多公司会根据自己的盈利模式设计不同的商业目标。
1.3.11 参考资料
推荐系统的评测问题有很多的相关研究和资料,预详细研究可阅读参考:
- 《推荐系统实战》
- 《Evaluating Recommendation Systems》
- What metrics are used for evaluating recommender systems?
二、常用算法
推荐算法的演化可以简单分为3个阶段,也是推荐系统由简单到复杂的迭代。
2.1 推荐算法演化
2.1.1 人工运营
这个阶段是随机的,人工根据运营目的,手工给特定类别的用户推送特定的内容。
优点是:
- 方便推广特定的内容;
- 推荐的内容易解释;
缺点是:
- 千人一面,推送的内容一样;
- 人工筛选,推送,耗费人力巨大;
- 运营根据自己的知识,主观性比较大;
2.1.2 基于统计的推荐
会基于一些简单的统计学知识做推荐,例如某个内别卖得最好的热门榜;再细致一些,将用户按个人特质划分,再求各种热度榜等。
优点是:
- 热门就是大部分用户喜好的拟合,效果好;
- 推荐的内容易解释;
缺点是:
- 千人一面,推送的内容一样;
- 马太效应,热门的会越来越热门,冷门的越来越冷门;
- 效果很容易达到天花板;
2.1.3 个性化推荐
当前阶段的推荐,会基于协同过滤算法、基于模型的算法、基于社交关系等,机器学习、深度学习逐渐引入,提高了推荐效果。
优点是:
- 效果要相对于之前,要好很多;
- 千人前面,每个人都有自己独特的推荐列表;
缺点是:
- 门槛较高,推荐系统搭建、算法设计、调优等等,都对开发者有较高的要求;
- 成本较高,而且是个长期迭代优化的过程,人力物力投入很高;
2.2 推荐算法汇总
内部一个分享这样分类常用的推荐算法:
图5 推荐算法分类
这里提到的Memory-based算法和Model-based算法的差别是什么?这也是我之前关注的问题,找到个资料,讲解得比较透彻。
Memory-based techniques use the data (likes, votes, clicks, etc) that you have to establish correlations (similarities?) between either users (Collaborative Filtering) or items (Content-Based Recommendation) to recommend an item i to a user u who’s never seen it before. In the case of collaborative filtering, we get the recommendations from items seen by the user’s who are closest to u, hence the term collaborative. In contrast, content-based recommendation tries to compare items using their characteristics (movie genre, actors, book’s publisher or author… etc) to recommend similar new items.
In a nutshell, memory-based techniques rely heavily on simple similarity measures (Cosine similarity, Pearson correlation, Jaccard coefficient&h
