【王树森推荐系统】重排05:DPP 多样性算法(下)
·
多样性问题回顾
- 精排给 nnn 个物品打分:reward1,⋅⋅⋅,rewardnreward_1,···,reward_nreward1,⋅⋅⋅,rewardn
- nnn 个物品的向量表征:v1,⋅⋅⋅,vn∈Rdv_1,···,v_n \in R^dv1,⋅⋅⋅,vn∈Rd,通常是基于图文内容计算出来的向量
- 在精排的后处理阶段(即重排),需要从 nnn 个物品中选出 kkk 个物品,组成集合 SSS
- 价值大:分数之和 ∑j∈Srewardj\sum_{j \in S} reward_j∑j∈Srewardj 越大越好
- 多样性好:SSS 中 kkk 个向量组成的超平行体 P(S)P(S)P(S) 的体积越大越好
- 集合 SSS 中的 kkk 个物品的向量作为列,组成矩阵 VS∈Rd×kV_S \in R^{d×k}VS∈Rd×k

- 以这 kkk 个向量作为边,组成超平行体 P(S)P(S)P(S)
- 体积 vol(P(S))vol(P(S))vol(P(S)) 可以衡量 SSS 中物品的多样性,多样性越好则体积越大
- 设 k≤dk\le dk≤d,行列式和体积满足:这个公式说明行列式和体积是等价的,因此可以用行列式衡量多样性,多样性越好,则行列式越大

行列式点过程(DPP)
- DPP 是一种传统的统计机器学习方法:DPP 要求从 nnn 个候选物品中选出 kkk 个组成集合 SSS,使得行列式的对数最大化
- 严格来说这个公式叫 K-DPP,在这里不做区分

- Hulu 的论文将 DPP 应用在推荐系统:现在工业界的推荐系统大多是用类似的方法,左边的项越大,表示越符合用户的兴趣,右边的项越大,表明多样性越好


- 设 AAA 为 n×nn×nn×n 的矩阵,它的元素 (i,j)(i,j)(i,j) 元素为 aij=viTvja_{ij}=v^T_iv_jaij=viTvj
- 给定向量 v1,⋅⋅⋅,vn∈Rdv_1,···,v_n \in R^dv1,⋅⋅⋅,vn∈Rd,需要 O(n2d)O(n^2d)O(n2d) 时间计算 AAA
- AS=VSTVSA_S=V^T_SV_SAS=VSTVS 为 AAA 的一个 k×kk×kk×k 子矩阵。如果 i,j∈Si,j \in Si,j∈S,则 aija_{ij}aij 是 ASA_SAS 的一个元素

-
DPP 是个组合优化问题,从集合 {1,⋅⋅⋅,n}\{1,···,n\}{1,⋅⋅⋅,n} 中选出一个大小为 kkk 的子集 SSS
-
精确求解 DPP 是不可能的,因为 DPP 是一个 NP-Hard 问题
-
用 SSS 表示已选中物品,用 RRR 表示未选中物品,贪心算法求解:我们希望添加的物品 iii 让行列式尽量大,物品 iii 不能和集合中的任何物品相似,不然会让行列式接近 0

-
总结贪心算法每轮选择一个物品 iii,这个物品不仅要有较高的价值,还不能和已经选中的物品相似
求解 DPP
暴力算法
- 贪心算法求解:

- 对于集合 RRR 中的所有物品 iii ,我们都得计算这样的行列式,算法的难点就在计算行列式,简单粗暴计算行列式计算量会非常大

- 对于单个 iii,计算 AS∪{i}A_{S \cup \{i\}}AS∪{i} 的行列式需要 O(∣S∣3)O(|S|^3)O(∣S∣3) 时间。想要计算行列式,需要对矩阵 ASA_SAS 做特征分解,时间复杂度都是 O(∣S∣3)O(|S|^3)O(∣S∣3)
- 对于所有的 i∈Ri \in Ri∈R,计算行列式需要时间 O(∣S∣3⋅∣R∣)O(|S|^3·|R|)O(∣S∣3⋅∣R∣),做了那么多计算,只能从 RRR 中选出一个物品
- 需要求解上式 kkk 次才能选出 kkk 个物品。如果暴力计算行列式,那么总时间复杂度为:O(∣S∣3⋅∣R∣⋅k)=O(nk4)O(|S|^3·|R|·k)=O(nk^4)O(∣S∣3⋅∣R∣⋅k)=O(nk4),其中 SSS 的大小不超过 kkk,RRR 的大小不超过 nnn
- 暴力算法的总时间复杂度为:O(n2d+nk4)O(n^2d+nk^4)O(n2d+nk4),其中 O(n2d)O(n^2d)O(n2d) 是计算矩阵 AAA 的时间,nk4nk^4nk4 是计算行列式的时间,nnn 的量级是几百,kkk 和 ddd 的量级都是几十。这个时间复杂度看起来 ok,但是其实不可行,推荐系统留给多样性算法的时间也就十毫秒左右,这个算法太慢了
Hulu 的快速算法
- Hulu 的论文设计了一种数值算法,仅需 O(n2d+nk2)O(n^2d+nk^2)O(n2d+nk2) 的时间从 nnn 个物品中选出 kkk 个物品
- 给定向量 v1,⋅⋅⋅,vn∈Rdv_1,···,v_n \in R^dv1,⋅⋅⋅,vn∈Rd,需要 O(n2d)O(n^2d)O(n2d) 时间计算 AAA
- 用 O(nk2)O(nk^2)O(nk2) 时间计算所有行列式(有效利用 Cholesky 分解避免大部分计算)
- Cholesky 分解 AS=LLTA_S=LL^TAS=LLT(ASA_SAS 为对称半正定矩阵),其中 LLL 是下三角矩阵(对角线以上的元素全零)
- Cholesky 分解可供计算 ASA_SAS 的行列式
- 下三角矩阵 LLL 的行列式 det(L)det(L)det(L) 等于 LLL 对角线元素乘积
- ASA_SAS 的行列式为 det(AS)=det(L)2=∏ilii2det(A_S)=det(L)^2=\prod_i l_{ii}^2det(AS)=det(L)2=∏ilii2
- 已知 AS=LLTA_S=LL^TAS=LLT,则可以快速求出所有 AS∪{i}A_{S \cup \{ i \}}AS∪{i} 的 Cholesky 分解,因此可以快速算出所有 AS∪{i}A_{S \cup \{i \}}AS∪{i} 的行列式
- 思想在于:已知矩阵 ASA_SAS 的 Cholesky 分解,那么给 ASA_SAS 添加一行或一列,不需要重新算一遍 Cholesky 分解,否则代价很大。给矩阵添加一行或一列,Cholesky 的代价非常小,有办法快速算出变化的地方,这样就不用完整算一遍 Cholesky 分解,这样就可以快速算出行列式
Hulu算法总结
- 每一轮求解这个问题,选出物品 iii。求解的难点在蓝色框,需要算这个行列式,如果暴力计算行列式代价非常大,Hulu算法降低了计算行列式的代价,使得 DPP 可以被用在推荐系统中,哪怕只给十毫秒的时间

- 初始 SSS 中只有一个物品,ASA_SAS 是 1×11×11×1 的矩阵
- 每一轮循环,基于上一轮算出的 AS=LLTA_S=LL^TAS=LLT,快速求出 AS∪{i}A_{S \cup \{i\}}AS∪{i} 的 Cholesky 分解 (∀i∈R)(\forall i \in R)(∀i∈R),从而求出 logdet(AS∪{i})logdet(A_{S \cup \{i\}})logdet(AS∪{i})
DPP 的扩展
滑动窗口
- 用 SSS 表示已选中的物品,用 RRR 表示未选中的物品,DPP 的贪心算法求解:

- 随着集合 SSS 增大,其中相似物品越来越多,物品向量会趋于线性相关
- 行列式 det(AS)det(A_S)det(AS) 会坍缩到零,对数趋于负无穷,此时 DPP 失效
- 我们使用 WWW,即最近选中的物品代替 SSS,不考虑更前面的,新选中的物品只需要考虑与滑动窗口的相似性即可

规则约束
- 有很多规则约束,例如最多连续出 5 篇视频笔记(如果已经连续出了 5 篇视频笔记,下一篇必须是图文笔记)
- 有了这些规则便不能任意选择物品,而要选择符合规则约束的物品

- 用规则排除掉 RRR 中的部分物品,得到子集 R′R'R′,然后求解:区别在于只在 R′R'R′ 中选择

更多推荐


所有评论(0)