问题背景

矩阵分解是推荐系统中的一种重要算法,具有协同过滤的 “集体智慧”,隐语义的 “深层关系”,以及机器学习的 “以目标为导向的有监督学习”。

我们以电影评分预测这个任务为例,预测过程可以简化为用户/电影评分矩阵(User-Item评分矩阵)补全的过程。在矩阵分解中,通过获得两个最优的小矩阵,我们可以计算这两个小矩阵的乘积来表示缺失的评分。因为大矩阵有一部分是有评分的,那么只要保证大矩阵有评分的位置(实际值)与两个小矩阵相乘得到的相应位置的评分(预测值)之间的误差最小即可,其实就是一个均方误差损失,这便是模型的目标函数。

奇异值分解

理论依据

矩阵分解的思想来源于奇异值分解(singular value decomposition, SVD)。其理论如下:

假设MM是一个m×nm\times n阶矩阵,其中的元素全部属于域KK,也就是实数域或复数域。如此则存在一个分解使得

M=UΣVM=U\Sigma V^*

其中UUm×mm\times m阶酉矩阵;Σ\Sigmam×nm\times n阶非负实数对角矩阵;而VV^*,即VV的共轭转置,是n×nn\times n阶酉矩阵。这样的分解就称作MM的奇异值分解。Σ\Sigma对角线上的元素Σi,i\Sigma_{i,i}即为MM的奇异值。

常见的做法是将奇异值由大而小排列。如此Σ\Sigma便能由MM唯一确定了。(虽然UUVV仍然不能确定。)

在矩阵MM的奇异值分解中:

  • VV​的列组成一套对M的正交“输入”或“分析”的基向量。这些向量是MMM^*M的特征向量。
  • UU的列组成一套对M的正交“输出”的基向量。这些向量是MMMM^*的特征向量。
  • Σ\Sigma对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的“膨胀控制”。这些是MMMM^*MMM^*M的特征值的非负平方根,并与UUVV的行向量相对应。

应用

奇异值分解本身也可以直接用来进行评分预测,我们可以把User-Item矩阵A分解为:

Am×nUm×kΣk×kVk×nTA_{m\times n}\approx U_{m\times k}\Sigma_{k\times k}V^T_{k\times n}

其中k是矩阵A中较大的部分奇异值的个数,一般会远远的小于用户数m和物品数n。这个近似的理论依据是前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。因此近似操作可以极大地减少计算量,但却可以保留大部分信息。

奇异值分解后,如果要预测第ii个用户对于第jj个电影的评分ai,ja_{i,j},就只需要计算uiΣvjTu_i\Sigma v_j^T

问题

奇异值分解固然解决减少了预测计算量,但同时也存在着一些问题:

  1. SVD分解要求矩阵是稠密的,而事实上我们在做评分预测时,矩阵往往是稀疏的,存在着大量的空白。因此,为了使用SVD,必须对矩阵中缺失的部分进行插值补全。但插值操作会增大数据量,增加了算法的复杂度;同时简单粗暴的数据填充也会导致数据的失真。
  2. SVD分解的算法复杂度非常高,对于m×nm\times n大小的矩阵,分解算法的时间复杂度为O(n2×m+n×m2)O(n^2\times m+n\times m^2)O(n3)O(n^3)。对于较大的数据集,这样的时间复杂度是不可接受的。

基于上述的一些问题,传统的 SVD 无法直接应用于推荐系统,因此需要进行简化。

FunkSVD

理论依据

Simon Funk在博客上公开发表了一个只考虑已有评分记录的矩阵分解方法,称为FunkSVD,也就是被Yehuda Koren称为隐语义模型的矩阵分解方法。不同于SVD分解将User-Item评分矩阵分解为3个矩阵,FunkSVD只将矩阵分解为两个矩阵:

Rm×n=Pm×k×Qk×nR_{m\times n}=P_{m\times k}\times Q_{k\times n}

这样,矩阵被分解为了两个低秩的用户和物品矩阵,其实就是把用户和物品都映射到一个 k 维空间中,这个 k 维空间对应着 k 个隐因子。我们认为用户对物品的评分主要是由这些隐因子影响的,所以这些隐因子代表了用户和物品一部分共有的特征,在物品身上表现为属性特征,在用户身上表现为偏好特征。然而这些隐因子并不具有实际意义,也不一定具有非常好的可解释性,每一个维度也没有确定的标签名字,所以称这些特征为 “隐因子”。

为了将稀疏矩阵RR分解为PPQQ,需要使用机器学习算法。通过最小化用户已有评分和用矩阵乘积得到的评分残差,获得最佳的PPQQ

计算过程

不妨设用户uu对物品ii的评分为ruir_{ui},经过矩阵分解投射到kk维空间的对应的用户uu的隐含特征向量为pup_u,对应的物品ii的隐含特征向量为qiq_i。那么预测评分r^ui=qiTpu\hat r_{ui}=q_i^Tp_u

此时目标函数可以表示为:

J=minq, p12(u,i)K(ruiqiTpu)2+λ(pu2+qi2)J=\min _{q^*,~p^*}\frac{1}{2}\sum _{(u,i)\in K}(r_{ui}-q_i^Tp_u)^2+\lambda(||p_u||^2+||q_i||^2)

其中,kk是已有评分的用户和物品对的样本集,λ\lambda是正则化系数,是超参数。

有了目标函数,我们可以通过梯度下降法来进行优化得到最终结果。

沿着随机梯度下降算法继续计算,现在对JJ求偏导:

Jpu=(ruiqiTpu)qi+λpuJqi=(ruiqiTpu)pu+λqi\frac{\partial J}{\partial p_u}=-(r_{ui}-q_i^Tp_u)q_i+\lambda p_u\\\frac{\partial J}{\partial q_i}=-(r_{ui}-q_i^Tp_u)p_u+\lambda q_i

此时,pup_uqiq_i的迭代公式为:

pu=pu+α[(ruiqiTpu)qiλpu]qi=qi+α[(ruiqiTpu)puλqi]p_u=p_u+\alpha[(r_{ui}-q_i^Tp_u)q_i-\lambda p_u]\\ q_i=q_i+\alpha[(r_{ui}-q_i^Tp_u)p_u-\lambda q_i]

其中,α\alpha为训练步长。

Reference