流动的推荐系统——兴趣Feed技术架构与实现



这是一个我们在产品形式上比较熟悉的推荐系统,它的核心是一套大规模矩阵分解算法,利用已有的协同矩阵为你推荐可能想建立联系的新Item,包括用户、App、公共主页等。

Facebook的广告形态非常多样,包括:

  • Suggested Page(你可能喜欢的公众页)
  • Page Post(公众号帖子推广)
  • Suggested App(你可能喜欢的应用)
  • Video Ads(视频广告)


所有的数据都显示,重排序后的NewsFeed可以让用户阅读积极性提高很多。因此,虽然外界一直有质疑和争吵,但是NewsFeed重排序并没有停止过。显然“大家一起穷,各自拼人品”的时间线不符合商业社会的基本哲学,提高效率的兴趣Feed才是一种必然。

并不复杂的兴趣Feed实现
兴趣Feed如何实现?这里先介绍创意内容收集工具Pinterest的Smart Feed,然后总结一些通用技术点。

Smart Feed技术实现
整个Smart Feed后端主要模块逻辑如图2,由三个部分构成:

  • 后台任务(Worker)
  • 内容生成器(Content Generator)
  • 前端服务(Service)

 


 

图2 Smart Feed后端架构后台任务(worker)


后台任务(worker)

Worker的职责有两个:

  • 接收数据源产生的新Pin,决定这个Pin该推送给哪些用户,并针对每一个它该推送的用户,给出这个Pin对这个用户的吸引程度,俗称“打分”。
  • 存储这些经过打分的Pin,备用。

 


 

图3 Smart Feed后台任务模块


打了分的Pin就会根据其不同来源分开存储(Pool)。存储结构是一个优先队列,按照打分排序,新的Pin进来和原来(但用户还未看)的Pin一起排序。

这个存储的Pool可以直接用KV数据库顶上,HBase、Redis都可以,每次送入数据库的数据是一个三元组:(user, pin, score)。Pinterest选用的是HBase。一共有两个HBase集群,一个存还没看过的Pin,一个存已经看过的Pin。

当数据源产生了新的Pin之后,需要由一个叫PinLater的模块经过Zen(封装了HBase基本操作的图数据存储模块)推送给粉丝。这里推送是异步的,有几秒到几分钟的延迟。

内容生成器(Content Generator)

如图4,内容生成器要做的是:

  • 决定返回多少个Pin,数量不是固定的,会根据用户访问频繁程度以及上次看到的新内容多少来决定。
  • 分配来源的比例构成,这块Pinterest没有透露分配比例,我们可以猜一下,也许是固定比例,也许是有一些启发式算法。
  • 将Pin排成一定的顺序,按照分数排序就好了。
  • 待推送内容要从Pool中删除,以保证每次请求的都是没看过的。

 


 

图4 Smart Feed内容生成器模块


每一次产生的待推送内容合在一起叫做一个“块”(chunk)。

前端服务(Feed service)

如图5,Feed service提供前端的服务。为了提供高可用服务,Feed service的任务有二个:

  • 接收从内容生成器返回的“新”内容。
  • 新内容合并上一次的“旧”内容。

 


 

图5 Smart Feed前端服务模块


Pinterest排序算法

排序算法名字叫做Pinnability。我们可以将其翻译成“可Pin度”,可Pin度是一组机器学习模型,用于衡量一个用户对一条Pin产生互动的可能性。


 

图6 Pinnability排序算法的任务


Pinnability模型用到的机器学习算法都是比较常用的模型,包括逻辑回归(LR)、支持向量机(SVM)、GBDT和卷积神经网络(CNN)。整个Pinnability的模型流程如图7所示。模型产生的流程分为三个阶段:准备训练数据、训练模型、上线使用。