问题背景
矩阵分解是推荐系统中的一种重要算法,具有协同过滤的 “集体智慧”,隐语义的 “深层关系”,以及机器学习的 “以目标为导向的有监督学习”。
我们以电影评分预测这个任务为例,预测过程可以简化为用户/电影评分矩阵(User-Item评分矩阵)补全的过程。在矩阵分解中,通过获得两个最优的小矩阵,我们可以计算这两个小矩阵的乘积来表示缺失的评分。因为大矩阵有一部分是有评分的,那么只要保证大矩阵有评分的位置(实际值)与两个小矩阵相乘得到的相应位置的评分(预测值)之间的误差最小即可,其实就是一个均方误差损失,这便是模型的目标函数。
奇异值分解
理论依据
矩阵分解的思想来源于奇异值分解(singular value decomposition, SVD)。其理论如下:
假设是一个阶矩阵,其中的元素全部属于域,也就是实数域或复数域。如此则存在一个分解使得
其中是阶酉矩阵;是阶非负实数对角矩阵;而,即的共轭转置,是阶酉矩阵。这样的分解就称作的奇异值分解。对角线上的元素即为的奇异值。
常见的做法是将奇异值由大而小排列。如此便能由唯一确定了。(虽然和仍然不能确定。)
在矩阵的奇异值分解中:
- 的列组成一套对的正交“输入”或“分析”的基向量。这些向量是的特征向量。
- 的列组成一套对的正交“输出”的基向量。这些向量是的特征向量。
- 对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的“膨胀控制”。这些是和的特征值的非负平方根,并与和的行向量相对应。
应用
奇异值分解本身也可以直接用来进行评分预测,我们可以把User-Item矩阵分解为:
其中k是矩阵A中较大的部分奇异值的个数,一般会远远的小于用户数m和物品数n。这个近似的理论依据是前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。因此近似操作可以极大地减少计算量,但却可以保留大部分信息。
奇异值分解后,如果要预测第i个用户对于第j个电影的评分,就只需要计算。
问题
奇异值分解固然解决减少了预测计算量,但同时也存在着一些问题:
- SVD分解要求矩阵是稠密的,而事实上我们在做评分预测时,矩阵往往是稀疏的,存在着大量的空白。因此,为了使用SVD,必须对矩阵中缺失的部分进行插值补全。但插值操作会增大数据量,增加了算法的复杂度;同时简单粗暴的数据填充也会导致数据的失真。
- SVD分解的算法复杂度非常高,对于大小的矩阵,分解算法的时间复杂度为即。对于较大的数据集,这样的时间复杂度是不可接受的。
基于上述的一些问题,传统的 SVD 无法直接应用于推荐系统,因此需要进行简化。
FunkSVD
理论依据
Simon Funk在博客上公开发表了一个只考虑已有评分记录的矩阵分解方法,称为FunkSVD,也就是被Yehuda Koren称为隐语义模型的矩阵分解方法。不同于SVD分解将User-Item评分矩阵分解为3个矩阵,FunkSVD只将矩阵分解为两个矩阵:
这样,矩阵被分解为了两个低秩的用户和物品矩阵,其实就是把用户和物品都映射到一个 k 维空间中,这个 k 维空间对应着 k 个隐因子。我们认为用户对物品的评分主要是由这些隐因子影响的,所以这些隐因子代表了用户和物品一部分共有的特征,在物品身上表现为属性特征,在用户身上表现为偏好特征。然而这些隐因子并不具有实际意义,也不一定具有非常好的可解释性,每一个维度也没有确定的标签名字,所以称这些特征为 “隐因子”。
为了将稀疏矩阵分解为和,需要使用机器学习算法。通过最小化用户已有评分和用矩阵乘积得到的评分残差,获得最佳的、。
计算过程
不妨设用户对物品的评分为,经过矩阵分解投射到维空间的对应的用户的隐含特征向量为,对应的物品iii的隐含特征向量为。那么预测评分。
此时目标函数可以表示为:
其中,是已有评分的用户和物品对的样本集,是正则化系数,是超参数。
有了目标函数,我们可以通过梯度下降法来进行优化得到最终结果。
沿着随机梯度下降算法继续计算,现在对求偏导:
此时,、的迭代公式为:
其中,为训练步长。