一、背景
推荐系统主要解决用户和物品之间的相关性,以及推荐列表的多样性。相关性主要通过用户兴趣和物品之间的匹配程度来衡量,希望把用户感兴趣的物品推荐给用户,可以通过CTR预估模型来构建。多样性的衡量没有那么直观,一种方法是计算不同Item之间的cosin值,值越小表明多样性越好。
Hulu在NIPS 2018会议上发表的论文《Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity》是基于行列式点过程来提升推荐系统多样性,在实验上取得了不错的效果.
二、行列式点过程基本原理
在介绍行列式点过程之前,先给出一些符号的约定:
集合使用大写字母表示,比如: Z
向量和矩阵分别通过粗体小写字母和粗体大写字母表示
(⋅)⊤表示向量或矩阵的转置
⟨x,y⟩是向量x和y的内积
给定子集 X和Y ,LX,Y是L 的sub-matrix,通过行中的X 和列中的Y 索引。
LX,X=LX,+LX,{i}=LX,i,
L{i},X=Li,X。
det(L) 是矩阵L 的行列式,惯例上令 det(L∅)=1
DPP(Determinantal Point Process)行列式点过程,是一种性能较高的概率模型。其将复杂的概率计算转换成简单的行列式计算,通过核矩阵(kernel matrix)的行列式计算每一个子集的概率。该概率可以理解为用户对推荐列表满意的概率,受到相关性与多样性两个因素的影响。具体地,对于给定的集合Z={1,2,...,M},一个DPP P 是定义在该集合的所有子集 2Z 上的一个概率度量。当P 会为空集给出非零概率时,存在一个矩阵L∈RM×M ,对于所有子集 Y⊆Z, Y出现的概率满足:
P(Y)∝det(LY)
其中,L是一个实数型(real)、半正定(PSD)的核矩阵,它通过Z的元素进行索引。这里简单介绍一下半正定矩阵的定义:
给定一个大小为n×n的实对称矩阵 A,若对于任意长度为 n的非零向量x,有xTAx≥0成立,则矩阵 A是一个半正定矩阵。
推荐列表就是从候选商品集合中选择能够最大化后验概率的商品子集,这一筛选过程就是行列式点过程的最大后验概率推断MAP(maximum a posteriori inference)。
Ymap=arg maxY⊆Z +det(LY)
三、如何通过DPP优化推荐系统多样性
DPP中的核矩阵 L) 是一个半正定矩阵,可以被分解为 L=BTB,其中B的每一列为候选集中商品的表示向量。
为了将DPP模型应用于推荐场景中,考虑将每个列向量 Bi分解为 Bi=rifi,其中:
-
ri为item i 与user之间的相关性,并且ri≥0
-
fi 为itemi的embedding,并且 ∣∣fi∣∣2=1
核矩阵中的元素可以被写成:
Lij=⟨Bi,Bj⟩=⟨rifi,rjfj⟩=rirj⟨fi,fj⟩
其中, ⟨fi,fj⟩=Sij是商品i与商品j之间的相似度。所以,核矩阵可以被进一步写为:
L=Diag(ru)⋅S⋅Diag(ru)
其中, Diag(ru)是对角阵(diagonal matrix),它的对角向量(diagonal vector)是相关性度量向量 ru 。则核矩阵的行列式可以表示为:
∣L∣=∣Diag(ru)∣⋅∣S∣⋅∣Diag(ru)∣=i∈Ru∏ru,i2⋅∣S∣
取其对数,则可以表示为:
logdet(L)=i∈Ru∑log(ru,i2)logdet(S))
其中, det(⋅)表示矩阵的行列式。上式中的 i∈Ru∑log(ru,i2)可以表示为用户和商品的相关性, det(S)可以表示商品之间的多样性,这里简单解释一下为什么可以表示多样性。
假设$ S= \begin {bmatrix}S_{ii} +S_{ij} S_{ij}++S_{jj}\end{bmatrix},则 det\left(S \right)=S_{ii}S_{jj}-S_{ij}{2}=1-S_{ij}{2}$,则 det(S) 越大,对应的 S_{ij}^{2})$越小,也即多样性越好。
因此最大化det(L)可以优化推荐集的多样性。假设系统筛选出的推荐给用户的商品子集为Cu⊆Ru, LCu 表示被商品子集Cu 索引的核矩阵的子矩阵,则商品子集Cu 的相关性和多样性可以用下式度量:
logdet(LCu)=i+∈+Cu∑log(ru,i2)−logdet(SCu)
多样性问题便可以转化为前面的MAP问题。
四、行列式点过程的MAP求解
行列式点过程的MAP求解是一个复杂的过程,Hulu的论文中提出了一种改进的贪心算法能够快速求解,该算法的时间复杂度为 O(N2M), N为返回的商品列表中商品的个数。
这一求解过程简单来说就是每次从候选集中贪心地选择一个能使边际收益最大的商品加入到最终的结果子集中,直到满足停止条件为止,即每次选择商品j 添加到结果集中Yg中,Yg初始化为空集,商品 j需要满足下面的等式:
j=i∈Z\Ygargmaxlogdet(Yg∪{i})−logdet(Yg)(1)
其中行列式 det(LYg) 直接求解复杂度较高,需要有巧妙的方法简化计算过程。假设 det(LYg)>0, LYgCholesky 分解如下:
LYg=VV⊤
其中 V) 是一个可逆下三角矩阵。对于任意i∈Z\Yg ,LYg∪{i}的Cholesky 分解可以定为:
其中,等式右边右上角的子矩阵为0向量,是因为 V) 是一个下三角矩阵。根据矩阵乘法公式,行向量 ci 和标量 di≥0 满足:
Vci⊤=LYg(3)
di2=Lii−∥ci∥22(4)
另外,根据等式(2), 可以得到:
det(LYg∪{i})=det(VV⊤)⋅di2det(LYg)⋅di2(5)
因此,等式(1)可以简化为:
j=i∈Z\Ygargmaxlog(di2)(6)
一旦等式(6)被求解,根据等式(2),LYg∪{i} 的Cholesky 分解变成是:
LYg∪{j}=[Vcj0dj][Vcj0dj]⊤(7)
其中,cj 和 dj是已经计算出来了的。当一个新item被添加到Yg 之后,LYg 的Cholesky因子可以被有效更新。
对于每个itemi , ci 和 di 可以被增量更新。在等式(6)被求解后,将ci′和 di′ 定义为新的需求求解的向量和标量,其中 i∈Z\(Yg∪{j}) 。
根据等式(3)和等式(7),我们有:
[Vci0di]ciT=LYg∪{j},i=[LYg,iLji](8)
通过将等式(3)和等式(8)组合,我们可以对 ci 和 di2进行更新,有:
ci′=[ci(Lji−⟨cj,ci⟩)/dj]≐[ciei]
等式(4)意味着:
di′2=Lii−∥ci′∥22=Lii∥ci∥22−ei2=di2−ei2(9)
最初, Yg=∅ , 等式(5)意味着: di2=det(Lii)=Lii。
完整算法描述如下:

图1 Fast Greedy MAP求解