稍微看了一些关于推荐方面的资料,做一下简单的总结。
推荐任务定义:
在一个标准推荐任务中,我们有 m 个用户(user),
n 个物品(item),以及一个稀疏评分矩阵 R(R∈Rm∗n) 。 R 中每个Rij 表示用户 i 对于物品j 的评分。如果 Rij≠0 ,那么说明用户 i 有对物品j 的评分,反之则没有。每一个用户 i 可以用向量sui=(Ri1,Ri2,...,Rin) 表示,同样地,每一个物品 j 可以用向量sij=R1j,...,Rmj 表示。对于用户和物品各自的边信息(side information)矩阵,则分别用 X∈Rm∗p 和 Y∈Rn∗q 表示。设 ui,vj∈Rk ,其中 ui 为用户 i 的隐因子向量(latent factor vector),
vj 则是物品 j 的隐因子向量(latent factor vector),k 是隐空间的维度。因而,对于用户和物品来说,对应的隐因子向量形式分别是 U=u1:m 和 V=v1:n 。由于 R=UV ,所以如果能够求出 U 和V 的话,那么我们可以求出一个非稀疏的评分矩阵 R 出来。给定一个稀疏的评分矩阵
R ,以及边信息矩阵 X 和Y ,我们的目标是学习出 U 和V ,从而预测出 R 中缺失的评分。(这也叫矩阵的UV分解)
矩阵分解
矩阵分解的思想很简单,对于用户-物品这个评分矩阵
1. 得到了用户的偏好,以及物品的特性
2. 降低了矩阵的维度。
举个例子,比如音乐推荐。我们比如有3个用户(u表示),4首音乐(m表示)。
可以想到,在真实的场景中,这个矩阵是极其稀疏的,对于庞大的音乐库来说,每个用户听过的曲目都是极小的一部分。并且由于用户数量和音乐数量极大,所以这个 R 实际上是一个极大的矩阵。
现在假设音乐的风格有以下几类:摇滚,重金属,民谣,说唱,轻音乐。分别用
通过这两个矩阵,我们就可以计算出 ui 对 mi 的评分:
通过这种方式,我们即可补全矩阵R。
现在的问题是,如何求出矩阵
Q
和
很简单的做法,我们可以通过迭代的方式,逐步使得
R~=QPT
与R之间的距离变小。设置loss函数,然后使用梯度下降法。loss函数设置如下:
其中 L(⋅,⋅) 是衡量两个矩阵之间距离的loss函数,而 (||Q||2F+||P||2F) 则是正则项,用来约束参数,避免过拟合。 ||⋅||F 是F-范数。这就是最基本的矩阵分解的思想和做法,后面有更进一步,比如考虑多种因素的,引入历史信息的,引入时间信息的。可以参见 这篇博客。
F-范数:
设
A=(aij)n∗n∈Cn∗n
,令
||A||F 是一种与向量的2-范数 ||x||2 相容的方针范数,称其为方阵A的Frobenius范数,简称F-范数。看这个形式,其实跟L2范数的计算方式一模一样嘛。但是L2范数是没有限制矩阵的形状的,而F范数必须是个方阵。
关于L2范数为什么可以起到正则化的效果,可以参见 这篇博客,个人觉得讲的非常好,浅显易懂。佩服~