本篇博客主要内容是对推荐系统进行详细的概述及讲解,对新手来说是非常适合的。

本篇文章主要内容包括推荐系统的相关概念推荐系统的架构和流程、常见的推荐算法挖掘召回排序评估总结这几部分。

推荐系统本质上是解决 用户、信息和环境的匹配,即,推荐系统级联架构 推荐系统的架构_机器学习

推荐系统

推荐系统包括整体技术架构推荐系统架构推荐引擎架构

整体技术架构

推荐系统级联架构 推荐系统的架构_推荐系统_02


从下往上依次为数据的生产、存储、候选集触发,融合过滤重排序。重排序之后就是输出的推荐结果,然后再供各业务调用,比如猜你喜欢等等。

推荐系统架构

整个推荐系统可以看作是一个加工厂,输入用户和物品数据,输出用户可能会感兴趣的物品清单,然后从物品清单中取前若干个作为推荐结果给到用户。

在这个过程中还需要做一些过滤,排序工作,输出结果的时候最好能让用户知道为什么推荐这个东西,这样用户的接受度会高一些。

推荐系统级联架构 推荐系统的架构_推荐系统级联架构_03


比如已经产生了一个用户可能感兴趣物品的Top100,之后需要把用户已经买过的东西过滤掉。

然后再基于用户的一些历史行为进行排序,比如经常看的东西权重高一些,很久之前看的东西权重低一些,最终排一个名次,再按照排序名次取前10个展示给用户。

这个过程就需要依赖于很多推荐引擎,简单理解就是会很多个推荐人,各自负责推荐一些候选结果。

推荐引擎架构

推荐引擎整体可以分为四部分,分别是

  • 用户特征
  • 物品候选集
  • 用户-物品匹配
  • 过滤、融合和排序

用户特征部分做的事情主要是将用户的行为数据(点击、浏览、购买等)和属性数据(人口属性、用户关系、兴趣爱好等)转化为对应的特征,供用户-物品匹配部分利用。

物品候选集就是需要给用户匹配的物品,通常也需要转化为对应的物品特征。

有了物品特征和用户特征之后,需要做的就是生成用户-物品的初始化推荐列表。

再之后就是基于初始推荐列表的一些处理,过滤掉一些东西,按照用户的行为反馈、物品属性和一些产品策略再进行列表顺序的调整,生成最终的推荐结果。

通用推荐流程

理论上推荐流程可以分为挖掘 -> 召回 -> 排序这几部分。

挖掘就是用户特征和物品特征的生成部分,这部分做好了,后面的推荐结果才会有好的效果。

召回就是从原始数据集中基于种种策略先挑选一部分物品,这部分需要尽可能全的覆盖用户需求,通常会把十万甚至百万级的候选集过滤到数百量级。

排序就是针对召回的数百个物品进行更深层次的加工,优先选择若干个结果推荐给用户,通常数量在数十级。

以上是理论上的流程,然而实际上每个部分都比较复杂,而且也不仅仅只有一个模型,通常情况下都会有N多模型,不同的模型用到的可能是不同的算法和策略。

常见推荐算法

基于流行度的推荐
基于内容的推荐
近邻推荐
基于用户的协同推荐
基于物品的协同过滤
矩阵分解
基于关联规则的推荐
基于图模型的推荐
深度学习
混合推荐

挖掘

挖掘也就是通常说的特征工程,有效的特征和特征组合直接决定着后续推荐结果的好坏。

特征工程整体流程大致可以分为特征清洗、特征预处理、特征处理和特征监控这几部分。

特征清洗主要是将一些异常样本进行清洗,对一些样本进行采样。

特征预处理主要是对单个特征类型的一些转换,同时对异常值、缺失值进行处理,此外还有对多个特征的降维、选择。

特征处理主要是对特征进行离散、平滑、组合、聚合等处理,以达到更好的效果。

特征监控一方面是对特征的有效性进行分析,看特征是否真的有效,另一方面是监控特征的重要性是否有变化,避免影响模型效果。

召回

通常情况下候选集的数量可能有十万,百万甚至千万的量级,这种情况下如果直接计算用户相似度或者物品相似度的话,复杂度会非常高,成本也会非常大。

召回这个环节的主要任务就是从大规模的候选集中初步筛选出来一部分内容,供后续的排序环节使用,所以这个环节需要覆盖很广很全的范围。

召回的触发机制主要是基于用户特征和环境特征,比如用户画像相关、兴趣相关、行为相关、上下文相关等,此外还有一些运营规则和产品策略,比如热门、特定类型提权、降权等。

常见的召回策略包括上文算法部分的那些算法,以及一些其他策略,比如基于热门、内容、协同过滤、关联规则、图模型、地理位置、时间、用户关系等的召回策略…

有了初步的召回集之后,就可以考虑一些过滤规则了,比如过滤掉用户曾经购买过、明确表示过不喜欢的物品或者已经失去了时效性的物品等。

如果候选集较小,可以考虑在生成候选集之后就进行过滤,如果候选集较大,可以考虑在初始推荐列表中再过滤掉不该在候选集中的物品。

排序

按照排序类型来划分的话,排序可以分为粗排和精排,按照目标来划分的话,排序可以分为单目标排序和多目标排序。

单目标和多目标倒还好理解一些,毕竟不同的目标需要的模型和策略可能是不同的,那为什么类型又区分成粗排和精排。

主要可以分为两方面的原因,一方面大多数用户其实消费不了那么多内容,我们精心为用户准备了Top100的内容,大多数情况下用户可能只消费10条内容,那90条内容的工作量可能就浪费了。

另一方面排序的核心任务是对召回集给出的结果进行精准的排序,需要兼顾很多模型和特征,这就需要在效率、成本和性能之间做平衡了。

基于这两点原因,将排序又分为了粗排和精排两个阶段。

粗排阶段处理的物品数量在数百级,主要负责对召回的物品进行打分,也可以理解为用户的感兴趣程度。

精排阶段处理的物品在数十级,同时还会有一些产品规则方面的考虑,比如对于多样性、新颖性、兴趣探索方面的考虑,以及对于特定内容的加权、过滤或者强制隔离等。

单目标排序比较常见的是CTR(点击率)预估,当然这个C并不一定只能是Click,也可以是其他任何行为。

比如视频是不是会看完,看完后是不是会收藏,是不是会分享到第三方平台,查看的商品是不是会购买等,这些都可以看成那个可以被预估发生概率的CTR。

多目标顾名思义就是在排序阶段希望能够满足多个目标,比如视频的点击率+停留时长+完播率,电商的点击率+购买率+客单价。

知乎的排序模型就是一个多目标模型,有基于点击率的模型,基于收藏率的模型,基于点赞率,基于评论率等一共8个目标。

排序模型一般用目标值和AUC来进行衡量,目标值就是排序模型最开始的目标,点击率、停留时长、购买率等。

AUC全称是Area Under Curve,意思是曲线下的面积,这里的曲线就是ROC曲线,这个值在数学上等价于模型把关心的那一类样本排在其他样本前面的概率。

AUC最大是1,完美结果,0.5就是随机排列,0就是完美地全部排错,当然0也可以变成1,效果最差的其实是0.5左右的。