构建个性化推荐

​ 最近在疯狂学习推荐相关知识,才发现之前对于推荐的认识有多么的简陋o(╥﹏╥)o (也同时说明了我现在进步很大,哈哈) 目前为止,感觉对推荐的了解总算是入了门,所以再写一篇文章总结一下推荐的基本流程及概念和部分简单的算法模型


1 目前主流推荐流程概述

recommend-flow

开局一张图,剩下全靠编~

这个流程基本上就是现在的主流流程了,接下来我来讲述一下分成4层的目的

  1. 召回:召回层的出现是为了解决目前排序层的模型无法处理超大数据的问题,如果有一天排序层能够快速排序整个资源池的数据,那召回层也就没有存在的必要了。

    所以召回层的目的,就是先筛选出资源池的部分数据(几千或者几百),让接下来的排序层模型能够实时处理数据。目前大部分系统使用的依然以多路召回为主,当然实力强劲的企业也会使用模型去进行召回。

  2. 粗排:可以忽略,跟召回的目的差不多,也是为了进一步减小排序的工作量,比方说可以在粗排阶段,过滤掉用户最近看到过的作品,来减少输出量。(我也不知道为啥叫粗排不叫再召回。。。)

  3. 精排:可谓是推荐系统的重中之重,关于推荐排序的论文数不胜数,可见其重要性。排序的目的,就是根据当前用户的行为、标签等属性,来给收到的数据集进行排序(可以理解为用户对作品的感兴趣的程度)。排好序以后,返回topK,自然就是用户最可能感兴趣的作品了。

  4. 重排:重排的输入是精排返回的topK,重排的目的主要是出于业务需求,比方说,业务方需要额外在推荐列表插入广告等指定的配置等。最后输出的就是用户实际看到的推荐列表了。

之所以分成4层,主要是为了解决推荐的准确度和处理速度的冲突,通过召回的预处理减小排序的工作量,使得推荐的准确度和速度能得到均衡。

承接上文《推荐系统的设计》,我之前设计的推荐平台,其实也都包含了这些概念(麻雀虽小,五脏俱全),反过来也证明了,这个流程的设计还是有一定工程依据的。下面这张图,我用颜色区分与标准流程进行了对应。

system-map

2 召回

概述中有提到,召回的主要作用是为了降低排序的工作量,减小处理数据集的大小。

用容易理解的话来说,就是根据 用户的属性来给数据集进行采样。 只要能达到这个目的,都能称之为召回。

早期的召回主要以CB为主(content base–基于内容的召回),说白了就是标签匹配,比方说在ES(搜索引擎)中根据用户的喜爱标签搜索作品,由于ES本身是倒排索引,所以搜索速度很快,实现也简单,就是一条DSL。

至于像其他的协同过滤之类的,Emmmmm,可能有公司用到吧,主要是因为实现难度大,而且在召回阶段也不需要太高的准确度,所以不太常用。

当然随着人工智能和底层硬件的飞速发展,目前也有很多公司采用了机器学习模型和深度学习模型来进行召回,因为CB召回主要严重依赖于人工(靠行业专家的经验定义标签规则),成本很高。

由于本人并不是算法专家,所以这里就不做召回算法的介绍了,有兴趣可以搜索一下,相关的知识很多,这里只推荐一个入门级的机器学习模型FM,算是比较成熟的算法了。

也有继续硬刚CB的,为了解决CB的痛点(依赖经验),所以采用了多路召回来降低风险,这也是我目前使用的方案,所以举个例子

  1. 用户标签策略匹配200条
  2. 热门排行榜拿前100条
  3. 新品榜拿前100条
  4. 人工配置库(精品榜)拿前100条
  5. ….等等

将不同的策略召回的数据累加直接输出到排序层,来降低单一策略定义不好时带来的风险。

当然,如果实力足够,可以在多路召回的单个策略使用学习模型去跑。

3 排序

排序阶段,整个推荐系统的精华,直接影响了推荐系统的质量,所以一般来说都是这一阶段开始使用模型去跑,所以才需要前面的召回层减小处理量。

目前,排序最主流的方式都是CTR预估(间接或者直接使用)

在早期阶段,是使用的LR(线性回归)去进行CTR,因为点击事件比较符合线性回归算法的语义,并且处理速度快,算法解释性高。但是,实际场景中,用户特征与商品之间大多都是非线性关系,所以需要额外的进行大量的特征工程来改善算法质量,严重依赖于经验判断。

所以Facebook首先提出了GBRT + LR,用模型来训练特征工程,来降低人工成本和减小经验依赖。

GBRT(梯度提升树)用于训练特征树模型,由于特征树模型的枝干基本上就是特征的组合,所以就可以使用GBRT进行特征组合,并将特征输入到LR中进行CTR。

但是随着特征的离散值不断扩大,并且GBRT具有记忆性的问题(只能学习到训练数据中出现过的组合),随后提出了FM(因子分解机)+ LR用于进行CTR。

当然以上都是机器学习的范畴,近年来模型的发展早已进入了深度学习,不过本人毕竟不是算法工程师,对于深度学习认知有限,所以就不在详细介绍了。