共计 14049 个字符,预计需要花费 36 分钟才能阅读完成。
欢迎大家前往腾讯云 + 社区,获取更多腾讯海量技术实践干货哦~
本文由 jj 发表于云 + 社区专栏
一、推荐系统概述
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… etc) to match similar people or items together. If we have a huge matrix with users on one dimension and items on the other, with the cells containing votes or likes, then memory-based techniques use similarity measures on two vectors (rows or columns) of such a matrix to generate a number representing similarity.
Model-based techniques on the other hand try to further fill out this matrix. They tackle the task of“guessing”how much a user will like an item that they did not encounter before. For that they utilize several machine learning algorithms to train on the vector of items for a specific user, then they can build a model that can predict the user’s rating for a new item that has just been added to the system.
Since I’ll be working on news recommendations, the latter technique sounds much more interesting. Particularly since news items emerge very quickly (and disappear also very quickly), it makes sense that the system develops some smart way of detecting when a new piece of news will be interesting to the user even before other users see/rate it.
Popular model-based techniques are Bayesian Networks, Singular Value Decomposition, and Probabilistic Latent Semantic Analysis (or Probabilistic Latent Semantic Indexing). For some reason, all model-based techniques do not enjoy particularly happy-sounding names.
《携程个性化推荐算法实践》一文中梳理了工业界应用的排序模型,大致经历三个阶段:
图 6 排序模型演进
本文不对上面的这些算法进行详细的原理探讨,会比较复杂,有兴趣可以再自行学习。
2.3 CF 算法示例
为了学习这块的技术知识,跟着参加了下内部举办的 srtc 推荐比赛。重在参与,主要是学习整个基本流程,体会下推荐场景,了解腾讯内部做得好的团队和产品是什么样子。
2.3.1(内部敏感资料,删除)
2.3.2 CF 算法
在 web 平台上点一点,可能失去了学习的意义。所以本着学习的态度,我在线下自己的机器上实现了一些常用的算法,例如 CF 等。
推荐算法里 CF 算是比较常见的,核心还是很简单的。
user-cf 基本原理
A. 找到和目标用户兴趣相似的的用户集合;B. 找到这个集合中的用户喜欢的,且目标用户没听过的物品推荐给目标用户。
item-cf 基本原理
A. 计算物品之间的相似度;B. 根据物品的相似度和用户的历史行为给用户生成推荐列表。
结合前面总结的,cf 属于 memory-base 的算法,很大一个特征就是会用到相似度的函数。这个 user-cf 需要计算用户兴趣的相似度,item-cf 需要计算物品间的相似度。基于相似度函数的选择、编程语言的选择、实现方式的选择、优化的不同,结果和整个运行时间会很大不同。当时就简单用 python 实现的,8 个 process 跑满 cpu 同时处理,需要近 10 个小时跑完。后面了解到有底层进行过优化的 pandas、numpy 等,基于这些工具来实现速度会快很多。
2.3.3 收获
哈哈,第一次参加这种比赛,虽然成绩很差,但自己觉得很是学到很多东西,基本达到了参赛的目的。在真实的场景和数据下去思考各种影响因素,体会各种算法从设计、实现、训练、评价等各阶段,很多东西确实比看资料和书来得更深入。果然实践才是学习的最好手段。如果想更深入去搞推荐算法这块,感觉需要继续学习目前各种热门算法的原理、潜规则,kaggle 上多练手,以及锻炼相关的平台及工程化能力。
三、业界推荐系统调研
收集、研究了下网上一些推荐系统落地总结的文章,可以开拓视野,加深整体理解。
以下只是一些重要内容,有兴趣可以阅读原文:
《今日头条算法原理》,原文链接
《推荐算法在闲鱼小商品池的探索与实践》,原文链接
《饿了么推荐系统:从 0 到 1》,原文链接
《爱奇艺个性化推荐排序实践》,原文链接
《携程个性化推荐算法实践》,原文链接
《蘑菇街推荐工程实践》,原文链接
3.1 今日头条推荐系统
今日头条算法架构师曹欢欢博士,做过一次《今日头条算法原理》的报告。主要涉及 4 部分:系统概览、内容分析、用户标签、评估分析。
四类典型推荐特征
第一类是相关性特征,就是评估内容的属性和与用户是否匹配。第二类是环境特征,包括地理位置、时间。这些既是 bias 特征,也能以此构建一些匹配特征。第三类是热度特征。包括全局热度、分类热度,主题热度,以及关键词热度等。第四类是协同特征,它可以在部分程度上帮助解决所谓算法越推越窄的问题。
模型的训练上,头条系大部分推荐产品采用实时训练
模型的训练上,头条系大部分推荐产品采用实时训练。实时训练省资源并且反馈快,这对信息流产品非常重要。用户需要行为信息可以被模型快速捕捉并反馈至下一刷的推荐效果。我们线上目前基于 storm 集群实时处理样本数据,包括点击、展现、收藏、分享等动作类型。模型参数服务器是内部开发的一套高性能的系统,因为头条数据规模增长太快,类似的开源系统稳定性和性能无法满足,而我们自研的系统底层做了很多针对性的优化,提供了完善运维工具,更适配现有的业务场景。
目前,头条的推荐算法模型在世界范围内也是比较大的,包含几百亿原始特征和数十亿向量特征。整体的训练过程是线上服务器记录实时特征,导入到 Kafka 文件队列中,然后进一步导入 Storm 集群消费 Kafka 数据,客户端回传推荐的 label 构造训练样本,随后根据最新样本进行在线训练更新模型参数,最终线上模型得到更新。这个过程中主要的延迟在用户的动作反馈延时,因为文章推荐后用户不一定马上看,不考虑这部分时间,整个系统是几乎实时的。
但因为头条目前的内容量非常大,加上小视频内容有千万级别,推荐系统不可能所有内容全部由模型预估。所以需要设计一些召回策略,每次推荐时从海量内容中筛选出千级别的内容库。召回策略最重要的要求是性能要极致,一般超时不能超过 50 毫秒。
用户标签工程挑战更大
内容分析和用户标签是推荐系统的两大基石。内容分析涉及到机器学习的内容多一些,相比而言,用户标签工程挑战更大。今日头条常用的用户标签包括用户感兴趣的类别和主题、关键词、来源、基于兴趣的用户聚类以及各种垂直兴趣特征(车型,体育球队,股票等)。还有性别、年龄、地点等信息。性别信息通过用户第三方社交账号登录得到。年龄信息通常由模型预测,通过机型、阅读时间分布等预估。常驻地点来自用户授权访问位置信息,在位置信息的基础上通过传统聚类的方法拿到常驻点。常驻点结合其他信息,可以推测用户的工作地点、出差地点、旅游地点。这些用户标签非常有助于推荐。
当然最简单的用户标签是浏览过的内容标签。但这里涉及到一些数据处理策略。主要包括:一、过滤噪声。通过停留时间短的点击,过滤标题党。二、热点惩罚。对用户在一些热门文章(如前段时间 PG One 的新闻)上的动作做降权处理。理论上,传播范围较大的内容,置信度会下降。三、时间衰减。用户兴趣会发生偏移,因此策略更偏向新的用户行为。因此,随着用户动作的增加,老的特征权重会随时间衰减,新动作贡献的特征权重会更大。四、惩罚展现。如果一篇推荐给用户的文章没有被点击,相关特征(类别,关键词,来源)权重会被惩罚。当然同时,也要考虑全局背景,是不是相关内容推送比较多,以及相关的关闭和 dislike 信号等。
Hadoop 集群压力过大,上线 Storm 集群流式计算系统
面对这些挑战。2014 年底今日头条上线了用户标签 Storm 集群流式计算系统。改成流式之后,只要有用户动作更新就更新标签,CPU 代价比较小,可以节省 80% 的 CPU 时间,大大降低了计算资源开销。同时,只需几十台机器就可以支撑每天数千万用户的兴趣模型更新,并且特征更新速度非常快,基本可以做到准实时。这套系统从上线一直使用至今。
很多公司算法做的不好,并非是工程师能力不够,而是需要一个强大的实验平台,还有便捷的实验分析工具
A/B test 系统原理
这是头条 A /B Test 实验系统的基本原理。首先我们会做在离线状态下做好用户分桶,然后线上分配实验流量,将桶里用户打上标签,分给实验组。举个例子,开一个 10% 流量的实验,两个实验组各 5%,一个 5% 是基线,策略和线上大盘一样,另外一个是新的策略。
实验过程中用户动作会被搜集,基本上是准实时,每小时都可以看到。但因为小时数据有波动,通常是以天为时间节点来看。动作搜集后会有日志处理、分布式统计、写入数据库,非常便捷。
3.2 推荐算法在闲鱼小商品池的探索与实践
闲鱼中个性化推荐流程
商品个性化推荐算法主要包含 Match 和 Rank 两个阶段:Match 阶段也称为商品召回阶段,在推荐系统中用户对商品的行为称为用户 Trigger,通过长期收集用户作用在商品上的行为,建立用户行为和商品的矩阵称为 X2I,最后通过用户的 Trigger 和关系矩阵 X2I 进行商品召回。Rank 阶段利用不同指标的目标函数对商品进行打分,根据推荐系统的规则对商品的多个维度进行综合排序。下面以闲鱼的首页 feeds 为例,简单介绍闲鱼的个性化推荐流程。
所示步骤 1.1,利用用户的信息获取用户 Trigger,用户信息包括用户的唯一标识 userId,用户的设备信息唯一标识 uttid。
所示步骤 1.2,返回用户 Trigger 其中包括用户的点击、购买过的商品、喜欢的类目、用户的标签、常逛的店铺、购物车中的商品、喜欢的品牌等。
所示步骤 1.3,进行商品召回,利用 Trigger 和 X2I 矩阵进行 join 完成对商品的召回。
所示步骤 1.4,返回召回的商品列表,在商品召回中一般以 I2I 关系矩阵召回的商品为主,其他 X2I 关系矩阵召回为辅助。
步骤 2.1,进行商品过滤,对召回商品进行去重,过滤购买过的商品,剔除过度曝光的商品。
所示步骤 2.2,进行商品打分,打分阶段利用 itemInfo 和不同算法指标对商品多个维度打分。
步骤 2.3,进行商品排序,根据规则对商品多个维度的分数进行综合排序。
步骤 2.4,进行返回列表截断,截断 TopN 商品返回给用户。
闲鱼通过以上 Match 和 Rank 两个阶段八个步骤完成商品的推荐,同时从图中可以看出为了支持商品的个性化推荐,需要对 X2I、itemInfo、userTrigger 数据回流到搜索引擎,这些数据包含天级别回流数据和小时级别回流数据。
小商品的特点
小商品池存在以下几个特点。
实时性:在闲鱼搭建的小商品池中要求商品可以实时的流入到该规则下的商品池,为用户提供最新的优质商品。
周期性:在小商品池中,很多商品拥有周期属性,例如免费送的拍卖场景,拍卖周期为 6 小时,超过 6 小时后将被下架。
目前频道导购页面大多还是利用搜索引擎把商品呈现给用户,为了保证商品的曝光,一般利用搜索的时间窗口在商品池中对商品进一步筛选,但是仍存在商品曝光的问题,如果时间窗口过大,那么将会造成商品过度曝光,如果商品窗口过小那么就会造成商品曝光不足,同时还存在一个搜索无法解决的问题,同一时刻每个用户看到的商品都是相同的,无法针对用户进行个性化推荐,为了进一步提升对用户的服务,小商品池亟需引入个性化推荐。
推荐在小商品池的解决方案
在上文中利用全站 X2I 数据对小商品池的商品进行推荐过程中,发现在 Match 阶段,当小商品池过小时会造成商品召回不足的问题,为了提升小商品池推荐过程中有效召回数量,提出了如下三种解决方案。
提前过滤法:数据回流到搜索引擎前,小商品池对数据进行过滤,产生小商品池的回流数据,在商品进行召回阶段,利用小商品池的 X2I 进行商品召回,以此提升商品的召回率。
商品向量化法:在 Match 阶段利用向量相似性进行商品召回,商品向量化是利用向量搜索的能力,把商品的特性和规则通过函数映射成商品向量,同时把用户的 Trigger 和规则映射成用户向量,文本转换向量常用词袋模型和机器学习方法,词袋模型在文本长度较短时可以很好的把文本用词向量标识,但是文本长度过长时受限于词袋大小,如果词袋过小效果将会很差,机器学习的方法是利用 Word2Vector 把文本训练成向量,根据经验值向量维度一般为 200 维时效果较好。然后利用向量搜索引擎,根据用户向量搜索出相似商品向量,以此作为召回的商品。如图 5 所示商品的向量分两部分,前 20 位代表该商品的规则,后 200 位代表商品的基本特征信息。
商品搜索引擎法:在 Match 阶段利用商品搜索引擎对商品进行召回,如图 6 所示在商品进入搜索引擎时,对商品结构进行理解,在商品引擎中加入 Tag 和规则,然后根据用户的 Trigger 和规则作为搜索条件,利用搜索引擎完成商品的召回。搜索引擎的天然实时性解决了小商品池推荐强实时性的问题。
3.3 饿了么推荐系统:从 0 到 1
对于任何一个外部请求, 系统都会构建一个 QueryInfo(查询请求), 同时从各种数据源提取 UserInfo(用户信息)、ShopInfo(商户信息)、FoodInfo(食物信息)以及 ABTest 配置信息等, 然后调用 Ranker 排序。以下是排序的基本流程(如下图所示):
#调取 RankerManager, 初始化排序器 Ranker:
根据 ABTest 配置信息, 构建排序器 Ranker;
调取 ScorerManger, 指定所需打分器 Scorer(可以多个); 同时, Scorer 会从 ModelManager 获取对应 Model, 并校验;
调取 FeatureManager, 指定及校验 Scorer 所需特征 Features。
# 调取 InstanceBuilder, 汇总所有打分器 Scorer 的特征, 计算对应排序项 EntityInfo(餐厅 / 食物)排序所需特征 Features;
#对 EntityInfo 进行打分, 并按需对 Records 进行排序。
这里需要说明的是:任何一个模型 Model 都必须以打分器 Scorer 形式展示或者被调用。主要是基于以下几点考虑:
模型迭代:比如同一个 Model,根据时间、地点、数据抽样等衍生出多个版本 Version;
模型参数:比如组合模式 (见下一小节) 时的权重与轮次设定,模型是否支持并行化等;
特征参数:特征 Feature 计算参数,比如距离在不同城市具有不同的分段参数。
3.4 爱奇艺个性化推荐排序实践
我们的推荐系统主要分为两个阶段,召回阶段和排序阶段。
召回阶段根据用户的兴趣和历史行为,同千万级的视频库中挑选出一个小的候选集(几百到几千个视频)。这些候选都是用户感兴趣的内容,排序阶段在此基础上进行更精准的计算,能够给每一个视频进行精确打分,进而从成千上万的候选中选出用户最感兴趣的少量高质量内容(十几个视频)。
推荐系统的整体结构如图所示,各个模块的作用如下:
用户画像:包含用户的人群属性、历史行为、兴趣内容和偏好倾向等多维度的分析,是个性化的基石
特征工程:包含了了视频的类别属性,内容分析,人群偏好和统计特征等全方位的描绘和度量,是视频内容和质量分析的基础
召回算法:包含了多个通道的召回模型,比如协同过滤,主题模型,内容召回和 SNS 等通道,能够从视频库中选出多样性的偏好内容
排序模型:对多个召回通道的内容进行同一个打分排序,选出最优的少量结果。
除了这些之外推荐系统还兼顾了推荐结果的多样性,新鲜度,逼格和惊喜度等多个维度,更能够满足用户多样性的需求。
然后,介绍了推荐排序系统架构、推荐机器学习排序算法演进。
3.5 携程个性化推荐算法实践
推荐流程大体上可以分为 3 个部分,召回、排序、推荐结果生成,整体的架构如下图所示。
召回阶段,主要是利用数据工程和算法的方式,从千万级的产品中锁定特定的候选集合,完成对产品的初步筛选,其在一定程度上决定了排序阶段的效率和推荐结果的优劣。
业内比较传统的算法,主要是 CF1、基于统计的 Contextual 推荐和 LBS,但近期来深度学习被广泛引入,算法性取得较大的提升,如:2015 年 Netflix 和 Gravity R&D Inc 提出的利用 RNN 的 Session-based 推荐[5],2016 年 Recsys 上提出的结合 CNN 和 PMF 应用于 Context-aware 推荐[10],2016 年 Google 提出的将 DNN 作为 MF 的推广,可以很容易地将任意连续和分类特征添加到模型中[9],2017 年 IJCAI 会议中提出的利用 LSTM 进行序列推荐[6]。2017 年携程个性化团队在 AAAI 会议上提出的深度模型 aSDAE,通过将附加的 side information 集成到输入中,可以改善数据稀疏和冷启动问题[4]。
对于召回阶段得到的候选集,会对其进行更加复杂和精确的打分与重排序,进而得到一个更小的用户可能感兴趣的产品列表。携程的推荐排序并不单纯追求点击率或者转化率,还需要考虑距离控制,产品质量控制等因素。相比适用于搜索排序,文本相关性检索等领域的 pairwise 和 listwise 方法,pointwise 方法可以通过叠加其他控制项进行干预,适用于多目标优化问题。
工业界的推荐方法经历从线性模型+大量人工特征工程[11] -> 复杂非线性模型 -> 深度学习的发展。Microsoft 首先于 2007 年提出采用 Logistic Regression 来预估搜索广告的点击率[12],并于同年提出 OWLQN 优化算法用于求解带 L1 正则的 LR 问题[13],之后于 2010 年提出基于 L2 正则的在线学习版本 Ad Predictor[14]。
Google 在 2013 年提出基于 L1 正则化的 LR 优化算法 FTRL-Proximal[15]。2010 年提出的 Factorization Machine 算法 [17] 和进一步 2014 年提出的 Filed-aware Factorization Machine[18]旨在解决稀疏数据下的特征组合问题,从而避免采用 LR 时需要的大量人工特征组合工作。
阿里于 2011 年提出 Mixture of Logistic Regression 直接在原始空间学习特征之间的非线性关系[19]。Facebook 于 2014 年提出采用 GBDT 做自动特征组合,同时融合 Logistic Regression[20]。
近年来,深度学习也被成功应用于推荐排序领域。Google 在 2016 年提出 wide and deep learning 方法 [21],综合模型的记忆和泛化能力。进一步华为提出 DeepFM[15] 模型用于替换 wdl 中的人工特征组合部分。阿里在 2017 年将 attention 机制引入,提出 Deep Interest Network[23]。
携程在实践相应的模型中积累了一定的经验,无论是最常用的逻辑回归模型(Logistic Regression),树模型(GBDT,Random Forest)[16],因子分解机(FactorizationMachine),以及近期提出的 wdl 模型。同时,我们认为即使在深度学习大行其道的今下,精细化的特征工程仍然是不可或缺的。
基于排序后的列表,在综合考虑多样性、新颖性、Exploit & Explore 等因素后,生成最终的推荐结果。
四、总结
之前没有接触过推荐系统,现在由于工作需要开始接触这块内容。很多概念和技术不懂,需要补很多东西。近期也去参加了内部推荐大赛真实地操作了一轮,同时开始学习推荐系统的基础知识,相关架构等,为下一步工作打下必要的基础。
推荐系统是能在几乎所有产品中存在的载体,它几乎可以无延时地以用户需求为导向,来满足用户。其代表的意义和效率,远远超过传统模式。毋庸置疑,牛逼的推荐系统就是未来。但这里有个难点就在于,推荐系统是否做得足够的好。而从目前来看,推荐算法和推荐系统并没有达到人们的预期。因为人的需求是极难猜测的。
又想到之前知乎看到一篇文章,说的是国内很多互联网公司都有的运营岗位,在国外是没有专设这个岗位的。还记得作者分析的较突出原因就是:外国人比较规矩,生活和饮食较单调,例如高兴了都点披萨。而中国不一样,从千千万万的菜品就能管中窥豹,国人的爱好极其广泛,众口难调。加上国外人工时很贵,那么利用算法去拟合用户的爱好和需求,自动地去挖掘用户需求,进行下一步的深耕和推荐就是一个替代方案。这也是国外很推崇推荐系统的侧面原因。而在中国,人相对来说是便宜的,加上国人的口味更多更刁钻,算法表现不好,所以会设很多专门的运营岗位。但慢慢也开始意识到这将是一个趋势,加上最近 ai 大热,各家大厂都在这块不断深耕。
回到推荐系统上,从现实中客观的原因就可以看到,真正能拟合出用户的需求和爱好确实是很困难的事情。甚至有时候用户都不知道自己想要的是啥,作为中国人,没有主见和想法是正常的,太有主见是违背标准答案的。但推荐系统背后代表的意义是:你的产品知道用户的兴趣,能满足用户的兴趣,那么必定用户就会离不开你。用户离不开的产品,肯定会占领市场,肯定就有极高的估值和想象空间。这也就是大家都在做推荐系统,虽然用起来傻傻的,效果也差强人意,依然愿意大力投入的根本原因。
几句胡诌,前期学习过后的简单总结,自己还有很多东西和细节需要继续学习和研究。能力有限,文中不妥之处还请指正~
(ps:文中一些截图和文字的版权归属原作者,且均已标注引用资料来源地址,本文只是学习总结之用,如有侵权,联系我删除)
问答推荐系统如何实现精准推荐?相关阅读推荐系统基础知识储备量化评估推荐系统效果基于用户画像的实时异步化视频推荐系统【每日课程推荐】机器学习实战!快速入门在线广告业务及 CTR 相应知识