Index partitioning through a bipartite graph model for faster similarity search in recommendation systems
Cevahir A. Index partitioning through a bipartite graph model for faster similarity search in recommendation systems[J]. Information Systems Frontiers, 2017, 19(5): 1161-1176.
scalability:可扩展性。即系统的计算能力可以通过增加计算机而提升,是模型性能的一个特性。
inverted index:倒排索引用于有效地检索类似文档。它是列表的集合,其中每个列表都是从元素到包含该元素的集合的映射。已经广泛应用于搜索引擎中,推荐系统中由于数据的稀疏和高维,也适合使用倒排索引。
基于二部图划分的模型
utility matrix:两个实体间关系权重的矩阵:
将该utility matrix转换为倒排索引:
其中b为倒排索引2-way划分,即utility矩阵的前三行分配给L1、后三行分配给L2。
这里分区的目标是最小化utility矩阵行和列代表的实体之间的分区间类同度(affinity)。类同度定义为:
其中R是行集,L(cj)是invert后的列集。后面这个log是为了防止一些频繁的列的类同度过度大。
1、建构utility矩阵
本文一共选取了三个推荐系统情景,分别构建。
1、基于内容的产品推荐(CB-PR):
因为要按行分区,所以行表示产品,列表示term(产品名称中的一些关键词),对于产品i,Mij表示term j在i的名称中出现的次数。
2、基于协同过滤的下一次点击预测(CF-NC):
行是用户,列是网站,访问过为1,否则为0。
3、基于协同过滤的电影评分预测(CF-MR):
行是用户,列是电影,矩阵值为评分。
2、建构用于分区的图
目标:每个分区尽量平衡,以保证每个分区计算成本相近。
节点权重设置:假设每个index的访问率相同,则搜索时命中行代表实体的概率应该与其所包含的列实体数目成正比,因而行实体的权重设为其包含的列实体数量。存疑,为什么成正比?(该权重可以根据在线实时的各实体访问率进行调整)列节点的权重都为0,因为他们不影响分区成本。边的权重则设定为边和列的类同度分数。
边的权重在计算时引入了idf(倒排文档频数,文档指的是保存行实体店文档)。计算为:
log里分子是行实体个数,分母是第j列的非零元素个数,也就是L(cj)列表中元素个数。所以,边的权重为
建构好图后,分区就依据已有的图分区工具,让分区间的类同度尽可能小。
3、在分区索引上进行搜索
Q是要搜索的用户画像
Q
=
Q=
Q= {
Q
I
,
Q
S
Q^I,Q^S
QI,QS},
Q
I
Q^I
QI为列实体集合,
Q
S
Q^S
QS为列实体各自的分数。则
p
a
r
t
P
k
part P_k
partPk对于Q的相似度similarity为
也就是Q中在
P
k
P_k
Pk里的所有列实体的类同度之和。
整个过程,是给定一个用以搜索的Q,可以把这个Q中每一个列实体的类同度分数计算出来,然后把这些实体属于同一个分区的类同度进行加和,得到的结果就是Q和该分区的相似度。
找到最相近的分区后,就从该分区的倒排索引中找到相近的行实体。
4、动态更新
本文主要指行实体的更新。
删除:直接删。
添加:找到该行实体最相近的分区,放在这个分区里(相近计算即上文提到的
S
(
Q
,
P
k
)
S(Q,P_k)
S(Q,Pk))。
变更:删除+添加。
因为每次update并不会重新分区,所以需要每过一段时间进行重新分区。重新分区既可以重新构建模型,也可以使用更新的节点和边的二部图等并行图重新分区工具来更新。
实验
以产品推荐系统为例,使用的矩阵大小为11,5M × 860K,即一千万个产品,八十多万的item,但每个产品平均有六个多item,所以矩阵非常稀疏。
选取过去三个月有在相关商店购买四个商品以上的用户,每个用户选取一个产品作为active product。
首选用recall分数来体现分区的效果:
其中Tn是未分区索引下的topn,TnmK是分K个区里离得最近的m个区里的topn。
其他推荐系统的试验大同小异,都是从recall、推荐准确度和处理时间三个角度评估。