推荐系统目前几乎无处不在,主流的app都基本应用到了推荐系统。例如,旅游出行,携程、去哪儿等都会给你推荐机票、酒店等等;点外卖,饿了么、美团等会给你推荐饭店;购物的时候,京东、淘宝、亚马逊等会给你推荐“可能喜欢”的物品;看新闻,今日头条、腾讯新闻等都会给你推送你感兴趣的新闻....几乎所有的app应用或网站都存在推荐系统。
推荐系统就是为了解决这一问题而诞生的,在海量的物品和人之间,架起来一条桥梁。它就像一个私人的专属导购,根据你的历史行为、个人信息等等,为每个人diy进行推荐,千人前面,帮助人们更好、更快地选择自己感兴趣的、自己需要的东西。今日头条系的feed流在推荐算法的加持下,短短几年的用户增长速度和使用时长数据令人咂舌,受到了市场的追捧和高估值。一夜之间,几乎所有的app都开始上feed流、上各种推荐,重要性可见一斑。
我们先把推荐系统简单来看,那么它可以简化为如下的架构。
图1推荐系统一般流程
不管是复杂还是简单的推荐系统,基本都包含流程:
完整的推荐系统还会包括很多辅助模块,例如线下训练模块,让算法研究人员利用真实的历史数据,测试各类不同算法,初步验证算法优劣。线下测试效果不错的算法就会被放到线上测试,即常用的A/Btest系统。它利用流量分发系统筛选特定的用户展示待测试算法生成的推荐列表,然后收集这批特定用户行为数据进行线上评测。
图2蘑菇街推荐系统架构
一个东西做得好还是不好,能不能优化,首要前提是确定评测指标。只有确定了评测指标,才能有优化的方向。评测推荐系统的指标可以考虑以下几个方面:
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。
图4长尾曲线
1.3.4多样性
用户的兴趣是多样的,推荐系统需要能覆盖用户各种方面的喜好。这里有个假设,如果推荐列表比较多样,覆盖了用户各种各样的兴趣,那么真实命中用户的兴趣概率也会越大,那么就会增加用户找到自己感兴趣的物品的概率。
1.3.5新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。要准确地统计新颖性需要做用户调查。
1.3.6惊喜度
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
1.3.7信任度
1.3.8实时性
在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。因此,在这些网站中,推荐系统的实时性就显得至关重要。
推荐系统的实时性包括两个方面。首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。
1.3.9健壮性
衡量了一个推荐系统抗击作弊的能力。算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
1.3.10商业目标
1.3.11参考资料
推荐算法的演化可以简单分为3个阶段,也是推荐系统由简单到复杂的迭代。
2.1.1人工运营
这个阶段是随机的,人工根据运营目的,手工给特定类别的用户推送特定的内容。
优点是:
缺点是:
2.1.2基于统计的推荐
2.1.3个性化推荐
当前阶段的推荐,会基于协同过滤算法、基于模型的算法、基于社交关系等,机器学习、深度学习逐渐引入,提高了推荐效果。
图5推荐算法分类
Memory-basedtechniquesusethedata(likes,votes,clicks,etc)thatyouhavetoestablishcorrelations(similarities)betweeneitherusers(CollaborativeFiltering)oritems(Content-BasedRecommendation)torecommendanitemitoauseruwho’sneverseenitbefore.Inthecaseofcollaborativefiltering,wegettherecommendationsfromitemsseenbytheuser’swhoareclosesttou,hencethetermcollaborative.Incontrast,content-basedrecommendationtriestocompareitemsusingtheircharacteristics(moviegenre,actors,book’spublisherorauthor…etc)torecommendsimilarnewitems.
Inanutshell,memory-basedtechniquesrelyheavilyonsimplesimilaritymeasures(Cosinesimilarity,Pearsoncorrelation,Jaccardcoefficient…etc)tomatchsimilarpeopleoritemstogether.Ifwehaveahugematrixwithusersononedimensionanditemsontheother,withthecellscontainingvotesorlikes,thenmemory-basedtechniquesusesimilaritymeasuresontwovectors(rowsorcolumns)ofsuchamatrixtogenerateanumberrepresentingsimilarity.
Model-basedtechniquesontheotherhandtrytofurtherfilloutthismatrix.Theytacklethetaskof“guessing”howmuchauserwilllikeanitemthattheydidnotencounterbefore.Forthattheyutilizeseveralmachinelearningalgorithmstotrainonthevectorofitemsforaspecificuser,thentheycanbuildamodelthatcanpredicttheuser’sratingforanewitemthathasjustbeenaddedtothesystem.
SinceI’llbeworkingonnewsrecommendations,thelattertechniquesoundsmuchmoreinteresting.Particularlysincenewsitemsemergeveryquickly(anddisappearalsoveryquickly),itmakessensethatthesystemdevelopssomesmartwayofdetectingwhenanewpieceofnewswillbeinterestingtotheuserevenbeforeotheruserssee/rateit.
Popularmodel-basedtechniquesareBayesianNetworks,SingularValueDecomposition,andProbabilisticLatentSemanticAnalysis(orProbabilisticLatentSemanticIndexing).Forsomereason,allmodel-basedtechniquesdonotenjoyparticularlyhappy-soundingnames.
《携程个性化推荐算法实践》一文中梳理了工业界应用的排序模型,大致经历三个阶段:
图6排序模型演进
本文不对上面的这些算法进行详细的原理探讨,会比较复杂,有兴趣可以再自行学习。
为了学习这块的技术知识,跟着参加了下内部举办的srtc推荐比赛。重在参与,主要是学习整个基本流程,体会下推荐场景,了解腾讯内部做得好的团队和产品是什么样子。
2.3.1(内部敏感资料,删除)
2.3.2CF算法
在web平台上点一点,可能失去了学习的意义。所以本着学习的态度,我在线下自己的机器上实现了一些常用的算法,例如CF等。
推荐算法里CF算是比较常见的,核心还是很简单的。
A.找到和目标用户兴趣相似的的用户集合;B.找到这个集合中的用户喜欢的,且目标用户没听过的物品推荐给目标用户。
A.计算物品之间的相似度;B.根据物品的相似度和用户的历史行为给用户生成推荐列表。
2.3.3收获
以下只是一些重要内容,有兴趣可以阅读原文:
今日头条算法架构师曹欢欢博士,做过一次《今日头条算法原理》的报告。主要涉及4部分:系统概览、内容分析、用户标签、评估分析。
但因为头条目前的内容量非常大,加上小视频内容有千万级别,推荐系统不可能所有内容全部由模型预估。所以需要设计一些召回策略,每次推荐时从海量内容中筛选出千级别的内容库。召回策略最重要的要求是性能要极致,一般超时不能超过50毫秒。
A/Btest系统原理
这是头条A/BTest实验系统的基本原理。首先我们会做在离线状态下做好用户分桶,然后线上分配实验流量,将桶里用户打上标签,分给实验组。举个例子,开一个10%流量的实验,两个实验组各5%,一个5%是基线,策略和线上大盘一样,另外一个是新的策略。
商品个性化推荐算法主要包含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和规则作为搜索条件,利用搜索引擎完成商品的召回。搜索引擎的天然实时性解决了小商品池推荐强实时性的问题。
对于任何一个外部请求,系统都会构建一个QueryInfo(查询请求),同时从各种数据源提取UserInfo(用户信息)、ShopInfo(商户信息)、FoodInfo(食物信息)以及ABTest配置信息等,然后调用Ranker排序。以下是排序的基本流程(如下图所示):
#调取RankerManager,初始化排序器Ranker:
#调取InstanceBuilder,汇总所有打分器Scorer的特征,计算对应排序项EntityInfo(餐厅/食物)排序所需特征Features;
#对EntityInfo进行打分,并按需对Records进行排序。
这里需要说明的是:任何一个模型Model都必须以打分器Scorer形式展示或者被调用。主要是基于以下几点考虑:
我们的推荐系统主要分为两个阶段,召回阶段和排序阶段。
召回阶段根据用户的兴趣和历史行为,同千万级的视频库中挑选出一个小的候选集(几百到几千个视频)。这些候选都是用户感兴趣的内容,排序阶段在此基础上进行更精准的计算,能够给每一个视频进行精确打分,进而从成千上万的候选中选出用户最感兴趣的少量高质量内容(十几个视频)。
推荐系统的整体结构如图所示,各个模块的作用如下:
用户画像:包含用户的人群属性、历史行为、兴趣内容和偏好倾向等多维度的分析,是个性化的基石
特征工程:包含了了视频的类别属性,内容分析,人群偏好和统计特征等全方位的描绘和度量,是视频内容和质量分析的基础
召回算法:包含了多个通道的召回模型,比如协同过滤,主题模型,内容召回和SNS等通道,能够从视频库中选出多样性的偏好内容
排序模型:对多个召回通道的内容进行同一个打分排序,选出最优的少量结果。
除了这些之外推荐系统还兼顾了推荐结果的多样性,新鲜度,逼格和惊喜度等多个维度,更能够满足用户多样性的需求。
然后,介绍了推荐排序系统架构、推荐机器学习排序算法演进。
推荐流程大体上可以分为3个部分,召回、排序、推荐结果生成,整体的架构如下图所示。
召回阶段,主要是利用数据工程和算法的方式,从千万级的产品中锁定特定的候选集合,完成对产品的初步筛选,其在一定程度上决定了排序阶段的效率和推荐结果的优劣。
业内比较传统的算法,主要是CF1、基于统计的Contextual推荐和LBS,但近期来深度学习被广泛引入,算法性取得较大的提升,如:2015年Netflix和GravityR&DInc提出的利用RNN的Session-based推荐[5],2016年Recsys上提出的结合CNN和PMF应用于Context-aware推荐[10],2016年Google提出的将DNN作为MF的推广,可以很容易地将任意连续和分类特征添加到模型中[9],2017年IJCAI会议中提出的利用LSTM进行序列推荐[6]。2017年携程个性化团队在AAAI会议上提出的深度模型aSDAE,通过将附加的sideinformation集成到输入中,可以改善数据稀疏和冷启动问题[4]。
Google在2013年提出基于L1正则化的LR优化算法FTRL-Proximal[15]。2010年提出的FactorizationMachine算法[17]和进一步2014年提出的Filed-awareFactorizationMachine[18]旨在解决稀疏数据下的特征组合问题,从而避免采用LR时需要的大量人工特征组合工作。
阿里于2011年提出MixtureofLogisticRegression直接在原始空间学习特征之间的非线性关系[19]。Facebook于2014年提出采用GBDT做自动特征组合,同时融合LogisticRegression[20]。
近年来,深度学习也被成功应用于推荐排序领域。Google在2016年提出wideanddeeplearning方法[21],综合模型的记忆和泛化能力。进一步华为提出DeepFM[15]模型用于替换wdl中的人工特征组合部分。阿里在2017年将attention机制引入,提出DeepInterestNetwork[23]。
携程在实践相应的模型中积累了一定的经验,无论是最常用的逻辑回归模型(LogisticRegression),树模型(GBDT,RandomForest)[16],因子分解机(FactorizationMachine),以及近期提出的wdl模型。同时,我们认为即使在深度学习大行其道的今下,精细化的特征工程仍然是不可或缺的。
基于排序后的列表,在综合考虑多样性、新颖性、Exploit&Explore等因素后,生成最终的推荐结果。
推荐系统是能在几乎所有产品中存在的载体,它几乎可以无延时地以用户需求为导向,来满足用户。其代表的意义和效率,远远超过传统模式。毋庸置疑,牛逼的推荐系统就是未来。但这里有个难点就在于,推荐系统是否做得足够的好。而从目前来看,推荐算法和推荐系统并没有达到人们的预期。因为人的需求是极难猜测的。
回到推荐系统上,从现实中客观的原因就可以看到,真正能拟合出用户的需求和爱好确实是很困难的事情。甚至有时候用户都不知道自己想要的是啥,作为中国人,没有主见和想法是正常的,太有主见是违背标准答案的。但推荐系统背后代表的意义是:你的产品知道用户的兴趣,能满足用户的兴趣,那么必定用户就会离不开你。用户离不开的产品,肯定会占领市场,肯定就有极高的估值和想象空间。这也就是大家都在做推荐系统,虽然用起来傻傻的,效果也差强人意,依然愿意大力投入的根本原因。
几句胡诌,前期学习过后的简单总结,自己还有很多东西和细节需要继续学习和研究。能力有限,文中不妥之处还请指正~