起因是被 assign 了一个新的任务……要死。
参考资料:
推荐系统学习笔记之三 LFM (Latent Factor Model) 隐因子模型 + SVD (singular value decomposition) 奇异值分解
先说下我的理解。
隐因子模型(LFM)是一种推荐算法,“隐”可以理解成用户喜欢某个 item 的间接原因。
该算法的核心思想是转化成一个矩阵分解问题。
然后用传统机器学习算法去优化分解得到的矩阵。
主要的优势如下:
- 比较容易编程实现,随机梯度下降方法依次迭代即可训练出模型。
- 预测的精度比较高,预测准确率要高于基于领域的协同过滤以及基于内容CBR等方法。
- 比较低的时间和空间复杂度,高维矩阵映射为两个低维矩阵节省了存储空间,训练过程比较费时,但是可以离线完成;评分预测一般在线计算,直接使用离线训练得到的参数,可以实时推荐。
- 非常好的扩展性,如由SVD拓展而来的SVD++和 TIME SVD++。
矩阵分解的不足主要有:
- 训练模型较为费时。
- 推荐结果不具有很好的可解释性,无法用现实概念给分解出来的用户和物品矩阵的每个维度命名,只能理解为潜在语义空间。
我们用 \( \text{User}_1, \text{User}_2, \dots \) 表示用户,\( \text{Item}_1, \text{Item}_2, \dots \) 表示物品,\( R_{ij} \) 表示用户 \( i \) 对于物品 \( j \) 的评分(即喜好度)。我们需要得到一个关于用户-物品的二维矩阵 \( R \)。
常见的推荐系统中,\( R \) 是一个非常稀疏的高维矩阵,因为单个用户通常只对极少数物品产生过评分或交互行为。利用稀疏的已知评分 \( R \),填充预测得到一个稠密的满矩阵 \( \hat{R} \),就是协同过滤与矩阵分解的核心目的。
下面就来看看 LFM 是如何解决上述问题的。对于给定的用户行为数据集,使用 LFM 建模后,可以将稀疏矩阵分解为用户和物品在低维潜在语义空间的映射:
\( R \) 矩阵是 user-item 评分矩阵,矩阵值 \( R_{ui} \) 表示用户 \( u \) 对物品 \( i \) 的兴趣度。当计算出用户对所有候选物品的预估得分后,就可以按分数倒序截断生成 Top-K 推荐列表。
LFM 从数据集中抽取出若干个隐因子(Latent Factors,例如影视题材中的科幻、悬疑、爱情等),作为用户与物品之间连接的桥梁,将评分矩阵 \( R \) 近似表示为 \( P \) 矩阵与 \( Q \) 矩阵相乘:
- \( P \) 矩阵(用户-隐因子矩阵):大小为 \( |U| \times K \),第 \( u \) 行向量 \( p_u \) 表达用户 \( u \) 对各个隐因子的偏好程度。
- \( Q \) 矩阵(隐因子-物品矩阵):大小为 \( K \times |I| \),第 \( i \) 列向量 \( q_i \) 表达物品 \( i \) 在各个隐因子上的特征权重。
因此,LFM 计算用户 \( u \) 对物品 \( i \) 的兴趣度预测公式如下:
$$ \hat{r}_{ui} = p_u^T q_i = \sum_{k=1}^K p_{uk} q_{ki} $$我们发现使用 LFM 后,
- 我们不需要关心分类的角度,结果都是基于用户行为统计自动聚类的,全凭数据自己说了算。
- 不需要关心分类粒度的问题,通过设置 LFM 的最终分类数就可控制粒度,分类数越大,粒度越细。
- 对于一个 item,并不是明确的划分到某一类,而是计算其属于每一类的概率,是一种标准的软分类。
- 对于一个 user,我们可以得到他对于每一类的兴趣度,而不是只关心可见列表中的那几个类。
- 对于每一个 class,我们可以得到类中每个 item 的权重,越能代表这个类的 item,权重越高。
于是隐因子模型转化为矩阵分解问题。
模型的训练本质上是求解一个带 \( L_2 \) 正则项的最小二乘回归最优化问题:
$$ \min_{P, Q} \sum_{(u, i) \in \mathcal{K}} \left(r_{ui} - \sum_{k=1}^K p_{uk} q_{ki}\right)^2 + \lambda \left(\|p_u\|_2^2 + \|q_i\|_2^2\right) $$其中 \( \mathcal{K} \) 为已观测评分样本集合。工程实现中最常用的解法是随机梯度下降(SGD):
关于 \( P \)、\( Q \) 矩阵的初始化,实践中常见的做法是以小方差的高斯随机分布(或均匀分布)初始化隐向量,若存在可用的预训练特征(如内容标签的先验表示),也可载入作为 warm start。