推荐系统并非新鲜的事物,在好久以前就存在,可是推荐系统真正进入人们的视野,而且做为一个重要的模块存在于各个互联网公司,仍是近几年的事情。html
随着互联网的深刻发展,愈来愈多的信息在互联网上传播,产生了严重的信息过载。若是不采用必定的手段,用户很难从如此多的信息流中找到对本身有价值的信息。node
解决信息过载有几种手段:一种是搜索,当用户有了明确的信息需求意图后,将意图转换为几个简短的词或者短语的组合(即query),而后将这些词或短语组合提交到相应的搜索引擎,再由搜索引擎在海量的信息库中检索出与query相关的信息返回给用户;另一种是推荐,不少时候用户的意图并非很明确,或者很难用清晰的语义表达,有时甚至连用户本身都不清楚本身的需求,这种状况下搜索就显得捉襟见肘了。尤为是近些年来,随着电子商务的兴起,用户并不是必定是带着明确的购买意图去浏览,不少时候是去“逛”的,这种情景下解决信息过载,理解用户意图,为用户推送个性化的结果,推荐系统即是一种比较好的选择。算法
美团做为国内发展较快的o2o网站,有着大量的用户和丰富的用户行为,这些为推荐系统的应用和优化提供了不可或缺的条件,接下来介绍咱们在推荐系统的构建和优化过程当中的一些作法,与你们共享。框架
从框架的角度看,推荐系统基本能够分为数据层、触发层、融合过滤层和排序层。数据层包括数据生成和数据存储,主要是利用各类数据处理工具对原始日志进行清洗,处理成格式化的数据,落地到不一样类型的存储系统中,供下游的算法和模型使用。候选集触发层主要是从用户的历史行为、实时行为、地理位置等角度利用各类触发策略产生推荐的候选集。候选集融合和过滤层有两个功能,一是对出发层产生的不一样候选集进行融合,提升推荐策略的覆盖度和精度;另外还要承担必定的过滤职责,从产品、运营的角度肯定一些人工规则,过滤掉不符合条件的item。排序层主要是利用机器学习的模型对触发层筛选出来的候选集进行重排序。机器学习
同时,对与候选集触发和重排序两层而言,为了效果迭代是须要频繁修改的两层,所以须要支持ABtest。为了支持高效率的迭代,咱们对候选集触发和重排序两层进行了解耦,这两层的结果是正交的,所以能够分别进行对比试验,不会相互影响。同时在每一层的内部,咱们会根据用户将流量划分为多份,支持多个策略同时在线对比。工具
数据乃算法、模型之本。美团做为一个交易平台,同时具备快速增加的用户量,所以产生了海量丰富的用户行为数据。固然,不一样类型的数据的价值和反映的用户意图的强弱也有所不一样。
学习
行为类别 | 行为详情 |
---|---|
主动行为数据 | 搜索、筛选、点击、收藏、下单、支付、评分 |
UGC | 文本评价、上传图片 |
负反馈数据 | 左滑删除、取消收藏、取消订单、退款、负评、低评 |
用户画像 | 用户人口属性、美团DNA、品类偏好、消费水平、工做地与居住地 |
上文中咱们提到了数据的重要性,可是数据的落脚点仍是算法和模型。单纯的数据只是一些字节的堆积,咱们必须经过对数据的清洗去除数据中的噪声,而后经过算法和模型学习其中的规律,才能将数据的价值最大化。在本节中,将介绍推荐候选集触发过程当中用到的相关算法。优化
提到推荐,就不得不说协同过滤,它几乎在每个推荐系统中都会用到。基本的算法很是简单,可是要得到更好的效果,每每须要根据具体的业务作一些差别化的处理。网站
清除做弊、刷单、代购等噪声数据。这些数据的存在会严重影响算法的效果,所以要在第一步的数据清洗中就将这些数据剔除。搜索引擎
合理选取训练数据。选取的训练数据的时间窗口不宜过长,固然也不能太短。具体的窗口期数值须要通过屡次的实验来肯定。同时能够考虑引入时间衰减,由于近期的用户行为更能反映用户接下来的行为动做。
user-based与item-based相结合。
群体/个体 | 计算代价 | 适用场景 | 冷启动 | 可解释性 | 实时性 | |
---|---|---|---|---|---|---|
user-based | 更依赖于当前用户相近的用户群体的社会化行为 | 适用于用户数较少的场合 | 时效性强,用户个性化兴趣不太显著的场合 | 新加入的物品能很快进入推荐列表 | 弱 | 用户新的行为不必定致使推荐结果的变化 |
item-based | 更侧重用户自身的个体行为 | 适用于物品数较少的场合 | 长尾物品丰富,用户个性化需求强烈的场合 | 新加入的用户能很快获得推荐 | 强 | 用户新的行为必定致使推荐结果的变化 |
Event A | Everything but A | |
---|---|---|
Event B | A and B together (k_11) | B, but not A (k_12) |
Everything but B | A without B (k_21) | Neither A nor B (k_22) |
则logLikelihoodRatio=2 * (matrixEntropy - rowEntropy - columnEntropy)
其中
rowEntropy = entropy(k11, k12) + entropy(k21, k22)
columnEntropy = entropy(k11, k21) + entropy(k12, k22)
matrixEntropy = entropy(k11, k12, k21, k22)
(entropy为几个元素组成的系统的香农熵)
对于移动设备而言,与PC端最大的区别之一是移动设备的位置是常常发生变化的。不一样的地理位置反映了不一样的用户场景,在具体的业务中能够充分利用用户所处的地理位置。在推荐的候选集触发中,咱们也会根据用户的实时地理位置、工做地、居住地等地理位置触发相应的策略。
区域消费热单
区域购买热单
当新的线上用户请求到达时,根据用户的几个地理位置对相应地理位置的区域消费热单和区域购买热单进行加权,最终获得一个推荐列表。
此外,还能够根据用户出现的地理位置,采用协同过滤的方式计算用户的类似度。
搜索是一种强用户意图,比较明确的反应了用户的意愿,可是在不少状况下,由于各类各样的缘由,没有造成最终的转换。尽管如此,咱们认为,这种情景仍是表明了必定的用户意愿,能够加以利用。具体作法以下:
对用户过去一段时间的搜索无转换行为进行挖掘,计算每个用户对不一样query的权重。
计算每一个query下不一样deal的权重。
当用户再次请求时,根据用户对不一样query的权重及query下不一样deal的权重进行加权,取出权重最大的TopN进行推荐。
对于协同过滤而言,user之间或者deal之间的图距离是两跳,对于更远距离的关系则不能考虑在内。而图算法能够打破这一限制,将user与deal的关系视做一个二部图,相互间的关系能够在图上传播。Simrank[2]是一种衡量对等实体类似度的图算法。它的基本思想是,若是两个实体与另外的类似实体有相关关系,那它们也是类似的,即类似性是能够传播的。
Let s(c,d) denote the similarity between items c and d, for c != d
O(A),O(B): the set of out-neighbors for node A or node B
I(c),I(d): the set of in-neighbors for node c or node d
simrank的计算(采用矩阵迭代的方式)
计算得出类似度矩阵后,能够相似协同过滤用于线上推荐。
目前咱们的业务会产生包括搜索、筛选、收藏、浏览、下单等丰富的用户行为,这些是咱们进行效果优化的重要基础。咱们固然但愿每个用户行为流都能到达转化的环节,可是事实上远非这样。
当用户产生了下单行为上游的某些行为时,会有至关一部分由于各类缘由使行为流没有造成转化。可是,用户的这些上游行为对咱们而言是很是重要的先验知识。不少状况下,用户当时没有转化并不表明用户对当前的item不感兴趣。当用户再次到达咱们的推荐展位时,咱们根据用户以前产生的先验行为理解并识别用户的真正意图,将符合用户意图的相关deal再次展示给用户,引导用户沿着行为流向下游行进,最终达到下单这个终极目标。
目前引入的实时用户行为包括:实时浏览、实时收藏。
虽然咱们有一系列基于用户历史行为的候选集触发算法,但对于部分新用户或者历史行为不太丰富的用户,上述算法触发的候选集过小,所以须要使用一些替补策略进行填充。
为告终合不一样触发算法的优势,同时提升候选集的多样性和覆盖率,须要将不一样的触发算法融合在一块儿。常见的融合的方法有如下几种[3]:
目前咱们使用的方法集成了调制和分级两种融合方法,不一样的算法根据历史效果表现给定不一样的候选集构成比例,同时优先采用效果好的算法触发,若是候选集不够大,再采用效果次之的算法触发,依此类推。
如上所述,对于不一样算法触发出来的候选集,只是根据算法的历史效果决定算法产生的item的位置显得有些简单粗暴,同时,在每一个算法的内部,不一样item的顺序也只是简单的由一个或者几个因素决定,这些排序的方法只能用于第一步的初选过程,最终的排序结果须要借助机器学习的方法,使用相关的排序模型,综合多方面的因素来肯定。
非线性模型能较好的捕捉特征中的非线性关系,但训练和预测的代价相对线性模型要高一些,这也致使了非线性模型的更新周期相对要长。反之,线性模型对特征的处理要求比较高,须要凭借领域知识和经验人工对特征作一些先期处理,但由于线性模型简单,在训练和预测时效率较高。所以在更新周期上也能够作的更短,还能够结合业务作一些在线学习的尝试。在咱们的实践中,非线性模型和线性模型都有应用。
主要的步骤以下:
在咱们目前的重排序模型中,大概分为如下几类特征:
对于非线性模型,上述特征能够直接使用;而对于线性模型,则须要对特征值作一些分桶、归一化等处理,使特征值成为0~1之间的连续值或01二值。
以数据为基础,用算法去雕琢,只有将两者有机结合,才会带来效果的提高。对咱们而言,如下两个节点是咱们优化过程当中的里程碑:
以上是咱们在实践中的一点总结,固然咱们还有还多事情要作。we are still on the way!
本文为美团推荐与个性化团队集体智慧的结晶,感谢为此辛苦付出的每个成员。同时,团队长期招聘算法工程师与平台研发工程师,感兴趣的同窗请联系hr.tech@meituan.com,邮件标题注明“应聘推荐系统工程师”。