下图是一个典型的web推荐系统的架构:
主要包含4个组块:
1. Recommendation service –推荐服务;从web服务器获得推荐请求,然后返回推荐物品;
2.Storage systems–存储系统;主要存储用户特征(以及潜在因子)、物品特征(和因子)、模型的参数。并且能够通过有效的索引检索到物品。
3.Offline learner–离线学习器。从用户的反馈行为数据中学习模型的参数(和潜在因子),并将参数周期性的push给线上的存储系统。这个过程通常是挺耗时的,所以和实时的线上系统分开。
4.Online learner–在线学习器。该组块会使用用户最近的行为数据,连续不断地、实时地更新一些模型的参数来调整整个模型。
示例
应用设定:针对时间敏感的物品,创建一个推荐系统。用户和物品的特征可获取。目标是要最大化物品的点击数。
模型:假设xi 代表用户i的特征向量;xj表示物品j的特征向量。ui表示用户i的潜在因子向量;vj表示物品j的潜在因子向量。这两个潜在因子向量都是要通过学习才能得到的。当用户和物品交互时,我们采用:1/(1 + exp(-sij )) 作为逻辑反馈模型来预测CTR。其中sij是分值。通过以下公式求得:
其中A是回归系数矩阵(表示用户-物品的每对特征的一个相关性)是从数据中学习到的。通常来说,回归系数和用户的兴趣都不会随短时间快速变化,因此对回归系数矩阵A和用户潜在因子向量天更新是可以接受的。但是,因为物品是时间敏感的,所以每次有新用户对物品执行了动作,就应该快速的更新vj。
存储系统:候选物品集,特征以及模型都存储在存储系统中。
- 物品索引。在这个示例中,一个称之为“物品注入器”(item injector service) 的服务会监测很多物品源。当一个新的物品J到来的时候,“物品注入器” 会抽取物品特征xj,并且把物品和它的特征xj放入物品索引中,以支持通过特征快速的检索到物品。关于这样的一个物品索引。大家可以参考:Fontoura, Marcus, Josifovski, Vanja, Liu, Jinhui, Venkatesan, Srihari, Zhu, Xiangfei,and Zien, Jason. 2011. Evaluation strategies for top-k queries over memory-resident inverted indexes. Proceedings of the VLDB Endowment, 4(12), 1213–1224.
- 用户数据存储。用户特征xi会存储在用户数据库中,这是一个键值对库(比如,一个Voldemort),支持通过给定的一个键(比如用户id),快速的检索到它的值。用户的潜在因子ui也是通过用户id索引的。所以也存储在这个键值对库中。
- 模型存储。回归系数矩阵A存储在一个模型库中,然后离线学习器每日更新它。物品的潜在因子vj,也存在模型库中。因为它们是在线模型的模型参数,通常通过在线学习器持续更新它们。模型库也是一个键值对库。物品潜在因子通过物品id为key存储。保留特殊的键来存储回归系数矩阵。
离线学习器:
在给定用户和物品的特征(xi和xj),从用户的反馈数据数据的前提下,离线学习器会使用从服务日子中收集的数据来估计模型的参数和潜在因子(A,ui和vj)。离线学习通常都会执行很久。在该示例中,离线执行完后,会把学习到的模型参数和因子push到相应的线上存储系统。当用户的响应数据很大的时候,通常就需要一个并行计算的基础服务架构。比如MapReduce。
在线学习器:
给定用户和物品的特征(xi和xj),回归系数矩阵A以及从web服务日志实时获取的用户响应数据流,在线学习器会持续更新物品的潜在因子vj,以跟踪到发生在每个物品的最近的行为。
在xi,xj,A和ui给定的情况下,这个学习问题变成去估计针对大量独立的回归问题,其中每个物品j对应其中的一个回归问题。通过把ui当作特征向量,xi Axj当做一个偏移(一个针对回归模型的偏差或者截距项),每个回归会估计系数向量vj。更多的细节参考本书的7,8章(博主后面会补充到博客上来)。我们可以看到,物品特定的回归模型相互之间是独立的,并且单个物品的用户行为数据相对小,相比离线计算,物品的因子学习的就更快。
离线学习器和在线学习器之间的同步:
当离线学习器完成每天的工作,并把新学习到的A,ui和vj存储到存储系统时,因为开始离线计算后的这段时间收集到的数据并没有用来估计vj,因此离线学习到的vj并不是最新的。为了确保在push离线模型的这段时间,模型能够顺利转换,我们通常存储两个版本的模型参数(A,ui和vj)。当完成push,我们还是使用旧版的模型参数来服务用户,并且持续更新旧版参数,直到新版参数准备好。一旦新版参数(离线学习到的)存储到存储系统,我们就开始使用离线计算时没有使用的数据在线更新新版的vj。一旦使用完所有的数据更新新版vj,我们就立即切换到新版的vj来服务用户,并且停止在线更新老版vj。
推荐服务:
一旦特征,因子以及模型都存储完毕,推荐服务就按如下开始执行:
- 检索物品;
每一次请求,物品检索器会使用用户的ID:i 去查询用户数据库,获得用户的特征向量xi以及潜在因子向量ui. 基于用户特征,物品检索器查询用户索引以获得用户的候选物品集。有时候如果需要减少计算量,可以通过使用一些简单的指标或者模型来限制只返回top-k个候选物品。然后,候选物品物品集、用户特征及因子一起发送给排序器(ranker) - 排序(Ranking):接收到用户i的候选集后,排序器就会计算每个物品j的预测反应率(点击率)的均值和方差。均值是
的某种单调函数。方差的计算在第7章介绍。最后,会使用一种基于所有候选物品反应率的均值和(或)方差的EE机制来避免“物品饥饿”(item starvation),并且能够确保快速的收敛到用户最喜欢的物品集。