这是一个我们在产品形式上比较熟悉的推荐系统,它的核心是一套大规模矩阵分解算法,利用已有的协同矩阵为你推荐可能想建立联系的新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所示。模型产生的流程分为三个阶段:准备训练数据、训练模型、上线使用。