《基于行列式点过程的推荐多样性提升算法》原理详解

本文将详细讲解Hulu在NIPS 2018 会议上发表的《Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity》中,提出的基于行列式点过程的推荐多样性提升算法。

《基于行列式点过程的推荐多样性提升算法》原理详解_第1张图片

引言

随着机器学习技术日益成熟,机器学习的应用领域也越来越广。其中,推荐领域是机器学习一个比较常见且成功的应用场景。推荐多样性和相关性是衡量推荐算法常用的标准,最近项目团队针对搜索多样性做了大量的研究工作。Hulu陈拉明的推荐算法研究团队在NIPS 2018会议上提出的基于DPP的推荐多样性算法,能较好地提高推荐的多样性和相关性,并且执行效率也十分可观。我们团队也复现了该算法,具有不错的上线效果。

DPP 的构造

行列式点过程(Determinantal Point Process, DPP)是一种性能较高的概率模型。DPP将复杂的概率计算转换成简单的行列式计算,并通过核矩阵的行列式计算每一个子集的概率。DPP不仅减少了计算量,而且提高了运行效率,在图片分割、文本摘要和商品推荐系统中均具有较成功的应用。

DPP通过最大后验概率估计,找到商品集中相关性和多样性最大的子集,从而作为推荐给用户的商品集。

行列式点过程\small P刻画的是一个离散集合\small Z=\begin{Bmatrix} 1 & 2 & ... & M \end{Bmatrix}中每一个子集出现的概率。当\small P给定空集合出现的概率时,存在一个由集合\small Z的元素构成的半正定矩阵\small L\subseteq \mathbb{R}^{M\times M},对于每一个集合\small Z的子集\small Y,使得子集\small Y出现的概率\small P(Y) \propto det(L_{Y}),其中,\small L_{Y}表示由行和列的下标属于\small Y构成的矩阵\small L的子矩阵。

为了更好地理解行列式点过程的定义,下面给出陈拉明在某次讲座中陈述的例子。

《基于行列式点过程的推荐多样性提升算法》原理详解_第2张图片     《基于行列式点过程的推荐多样性提升算法》原理详解_第3张图片

由于矩阵\small L是半正定的,因此存在矩阵B,使得L=B^{T}B,并且

                                    P(Y) \propto det(L_{Y})=Vol^{2}(B_{i}),i\in Y

这是因为行列式为方阵中的各个列向量张成的平行多面体体积的平方。

为了将DPP模型应用于推荐场景中,考虑将每个列向量\small B_{i}分解为\small B_{i}=r_{i}f_{i},其中:

  • \small r_{i}为item i与user之间的相关性,且\small r_{i}\geq 0
  • \small s_{ij}=<f_{i},f_{j}>为item i 与 item j之间的相似度度量,且\small \left \| f_{i} \right \|_{2}=1

那么,

                            \small L_{ij}=<B_{i},B_{j}>=<r_{i}f_{i},r_{j}f_{j}>=r_{i}r_{j}s_{ij}

                            \small P(Y) \propto det(L_{Y})=\prod_{i\in Y}r_{i}^{2}\cdot det(S_{Y})

从矩阵\small L的构造可知,商品与用户之间相关性越大,且商品之间多样性越丰富,则矩阵\small L的行列式越大。因此,我们可以建立如下最优化问题:

                              Y_{map}=\mathit{argmax}\begin{Bmatrix} det(L_{Y}) \end{Bmatrix}

但是,直接求解该优化问题是NP难的,陈拉明团队则利用贪婪算法,提出了一种能加速行列式点过程推理过程的方法。

首先,DPP取Log后的函数是满足次模函数的:

                              f(Y)=log det(L_{Y})

次模函数是一个集合函数,随着输入集合中元素的增加,增加单个元素到输入集合导致的函数增量的差异减小。

即,对于任意\small i\in Z\small X\subseteq Y\subseteq Z \setminus {i}

                           \small f(X\cup {i})-f(X)\geq f(Y\cup {i})-f(Y)

直观解释为,小集合和大集合增加同样一个元素,小集合带来的收益大于大集合的收益。

因此,可以将上述优化问题转化为贪婪的形式:

                   y=\mathit{argmax}\begin{Bmatrix} f(Y\cup {i})-f(Y) \end{Bmatrix}=\mathit{argmax}\begin{Bmatrix} log(detL_{Y\cup {i}})- log(detL_{Y})\end{Bmatrix},

即,每次选择收益最大的item,直到满足条件为止。

DPP模型求解

求解该优化问题时,每次迭代的计算复杂度来源于行列式的计算,而求行列式的计算复杂度与该行列式长度的三次方成正比,即\small O(M{#y}^{3}),这一结果显然不适用于实际线上实时性较高的场景。下面,叙述论文中所做的改进:

首先对子矩阵\small L_{Y_{g}}Cholesky分解,使得

                            \small L_{Y_{g}}=VV^{T}

其中,\small V是一个下三角矩阵。对于任意\small i\in Z\setminus Y_{g},对子集\small Y添加一个元素i之后的子矩阵做Cholesky分解,使得

                           \small L_{Y_{g}\cup {i}}=\begin{bmatrix} L_{Y_{g}}& L_{Y_{g},i} \\ L_{i,Y_{g}}& L_{ii}\end{bmatrix}=\begin{bmatrix} V & 0 \\ c_{i} & d_{i} \end{bmatrix}\begin{bmatrix} V & 0 \\ c_{i} & d_{i} \end{bmatrix}^{T}=\begin{bmatrix} VV^{T} & Vc_{i}^{T}\\ c_{i}V^{T} & d_{i}^{2}+c_{i}^{2} \end{bmatrix} 

其中,有以下等式成立

                              \small Vc_{i}^{T}=L_{Y,i}, \small d_{i}^{2}=L_{i,i}-\left \| c_{i} \right \|_{2}^{2}

两边取行列式后再取log,可得:

                            \small log(detL_{Y_{g}\cup {i}})=log(det(L_{Y_{g}}))+log(d_{i}^{2})

应用Cholesky分解后,每次迭代只需要计算\small d_{i}即可。而为了得到\small d_{i},先需要求解线性方程组:

                                     \small Vc_{i}^{T}=L_{Y,i}

求解得到\small c_{i}后,再带入\small d_{i}^{2}=L_{i,i}-\left \| c_{i} \right \|_{2}^{2}得到\small d_{i}。此过程的计算复杂度来源于求解线性方程组,虽然求解线性方程组的计算复杂度也是三次方,但是系数矩阵\small V是下三角矩阵,因此,每次迭代的计算复杂度可降到二次方

即使计算复杂度降到了二次方,但是相比于目前主流的算法,可能依然没有优势。因此,作者又考虑每次迭代也用增量的方式更新\small c_{i}\small d_{i},从而避免了求解线性方程组带来的计算复杂度。具体过程如下:

对于任意\small i\in Z\setminus (Y_{g}\cup {j})

                              \small \left\{\begin{matrix} Vc_{i}^{T}=L_{Y_g,i} \\ d_{i}^{2}=L_{i,i}-\left \| c_{i} \right \|_{2}^{2} \end{matrix}\right. \Rightarrow \left\{\begin{matrix}\begin{bmatrix} V& 0\\c_{j} & d_{j} \end{bmatrix}c_{i}^{'}^{T}=L_{Y_{g}\cup {j},i}=\begin{bmatrix} L_{Y_{g},{i}}\\ L_{ji}} \end{bmatrix} \\ \end{matrix}\right., \small d_{i}^{'}^{2}=L_{i,i}-\left \| c_{i}^{'} \right \|_{2}^{2}

\small Vc_{i}^{T}=L_{Y_g,i}带入上式中,推导可得:

                              \small c_{i}^{'}=\begin{bmatrix} c_{i} & (L_{ji}-<c_{j},c_{i}>/d_{j}) \end{bmatrix}=\begin{bmatrix} c_{i}&e_{i} \end{bmatrix}

                              \small d_{i}^{'}^{2}=L_{i,i}-\left \| c_{i}^{'} \right \|_{2}^{2}=L_{i,i}-\left \| c_{i} \right \|_{2}^{2}-e_{i}^{2}=d_{i}^{2}-e_{i}^{2}

因此,每次迭代的计算复杂度进一步降低至一次方

《基于行列式点过程的推荐多样性提升算法》原理详解_第4张图片

滑动窗口式多样性

在一些场景中,商品集是以一个长序列的形式展示的,每次仅展示其中一部分。其实,这和搜索展示十分类似。此时,多样性仅需要在当前的滑动窗口满足即可。定义\small w是窗口的大小,对应的优化模型为:

                         j=\mathit{argmax}\begin{Bmatrix} log(detL_{Y_{g}^{w}\cup {i}})- log(detL_{Y_{g}^{w}})\end{Bmatrix}

其中,\small Y_{g}^{w}\subseteqq Y_{g}包含最近添加的\small w-1个商品。

《基于行列式点过程的推荐多样性提升算法》原理详解_第5张图片

总结

基于行列式点过程的推荐多样性提升算法使用贪婪算法推理最优的行列式点过程,并利用Cholesky加速行列式点过程的推理。该算法在推荐领域具有较好的应用,在丰富推荐多样性和相关性的同时,大大提升了计算速度。

 

 

你可能感兴趣的:(算法,机器学习,机器学习论文解读与实战)