矩阵分解(Matrix Factorization,MF)通过引入隐向量(Latent Factor)模型,有效解决了传统协同过滤(Collaborative Filtering)面临的以下核心问题:
矩阵分解尝试解决协同过滤的什么问题
数据稀疏性(Data Sparsity)
- 问题:传统协同过滤依赖用户-物品评分矩阵,但实际场景中用户仅与少数物品交互,矩阵稀疏性极强(例如99%为空值),导致相似度计算不可靠。
- 解决方案: 矩阵分解将高维稀疏矩阵拆解为用户隐向量和物品隐向量(如用户-10维向量×物品-10维向量),通过低秩近似(Low-Rank Approximation)捕捉潜在关联,避免依赖直接共同评分。 例如,用户A未评价电影B,但若其隐向量与B的隐向量内积高,仍能预测兴趣。
可扩展性(Scalability)
- 问题:UserCF和ItemCF需计算用户/物品间相似度矩阵,计算复杂度为 $O(N^2)$ 或 $O(M^2)$(N为用户数,M为物品数),难以应对亿级数据,维护难度很大。
- 解决方案: MF将模型参数降至 $O((N+M) \times K)$(K为隐向量维度,通常10~100),训练时通过梯度下降等优化方法迭代求解,推断时仅需计算内积 $u_i \cdot v_j$。 对大规模数据集(如Netflix千万级用户)更高效。
隐性特征建模(Implicit Features)
- 问题:传统协同过滤仅利用评分/点击行为,忽略用户偏好和物品属性的深层关联(如用户偏爱“科幻电影”或物品隐含“导演风格”)。
- 解决方案:
隐向量自动编码潜在语义:
- 用户隐向量 $u_i$ 可视为其兴趣的压缩表示(如科幻、浪漫、特效倾向)。
- 物品隐向量 $v_j$ 编码其属性特征(如科幻类型、大制作、导演影响力)。 例如,用户隐向量的某一维度可能对应“对悬疑片的敏感度”,无需人工定义特征。
解决主观评分偏差(Rating Bias)
- 问题:用户评分存在主观偏差,例如有的用户习惯打高分(宽松评分者),有的则普遍低分(严格评分者)。
- 解决方案:
MF模型可显式引入全局偏差项:
$$
\hat{r}_{ij} = \mu + b_i + b_j + u_i \cdot v_j
$$
- $\mu$:全局平均分
- $b_i$:用户i的评分偏差(宽松/严格倾向)
- $b_j$:物品j的平均偏差(热门/冷门修正) 此方法在Netflix Prize竞赛中被证明显著提升预测准确性。
模型灵活性(Flexibility)
- 问题:传统协同过滤难以融合辅助信息(如用户年龄、物品类别)。
- 解决方案:
MF可作为基础框架,与混合模型结合:
- 隐因子模型+内容特征:向量分解时加入用户画像(SVD++)。
- 时间动态建模:分解时加入时间衰减因子(如随时间变化的用户兴趣)。 例如,在推荐新闻时,用户隐向量可随时间推移更新,反映兴趣变化。
矩阵分解的实现
矩阵分解是推荐系统中的核心算法,通过将用户-物品评分矩阵分解为两个低维矩阵,捕捉潜在特征以进行精准推荐。以下是其实现方法的分步说明:
问题定义与数据准备
- 输入数据:用户-物品评分矩阵 $R \in \mathbb{R}^{M \times N}$,其中 $M$ 为用户数,$N$ 为物品数。未评分的部分用空值或0表示。
- 目标:找到两个低维矩阵 $U \in \mathbb{R}^{M \times K}$(用户隐向量)和 $V \in \mathbb{R}^{N \times K}$(物品隐向量),使得: $$ R \approx U \cdot V^T $$ 其中 $K \ll M, N$,如 $K=10$。
为啥不用特征值分解或奇异值分解
尽管特征值分解(Eigenvalue Decomposition, EVD)和奇异值分解(Singular Value Decomposition, SVD)是线性代数中强大的工具,但它们在推荐系统场景下面临根本性限制
特征值分解(EVD)的局限性
- 仅适用于对称方阵: EVD要求矩阵必须是方阵(即行数=列数),但用户-物品评分矩阵 $R \in \mathbb{R}^{M \times N}$ 通常是高度非对称的(用户数 $M \neq$ 物品数 $N$),直接应用EVD数学上不可行。
- 无法处理稀疏矩阵: 用户行为数据极稀疏(如99%的评分缺失),EVD必须作用于完整矩阵。若强制填充(如填0或均值),会扭曲原始数据分布: 例如,用户未评分的物品可能被误认为是“不喜欢”(实际可能是未知),导致特征向量无法捕捉真实偏好。
传统奇异值分解(SVD)的挑战
-
稠密矩阵依赖: 严格数学定义的SVD要求输入矩阵是稠密且完整的,但用户-物品矩阵天然稀疏(如Netflix Prize中98%的数据为空)。
- 填充问题:若对缺失值简单填充(如全局均值或用户均值),相当于强行引入噪声,导致分解结果包含大量人为干扰。
- 例如,若用户 $u$ 对动作电影有偏好但未评分科幻片,填充均值会错误体现其对科幻片的兴趣,从而破坏隐向量的语义意义。
-
计算复杂度不可行: 传统SVD的算法复杂度为 $O(\min(M,N)^3)$。对于大规模推荐场景(如 $M=10^7$ 用户,$N=10^6$ 物品),计算开销近乎天文学数字,即便分布式计算也难以承受。
将矩阵分解转化为最优化问题
我们将矩阵分解视为一个最优化问题,求解 $U$ 和 $V$ 的关键在于通过优化损失函数来最小化预测误差。主要的方法包括:
梯度下降法(Gradient Descent)
-
步骤:
-
随机初始化 $U$ 和 $V$。
-
对于每个观察值 $r_{ij}$,计算预测误差 $e_{ij} = r_{ij} - \hat{r}_{ij}$。
-
更新用户隐向量 $u_i$ 和物品隐向量 $v_j$: $$u_i \gets u_i + \alpha \left( e_{ij} \cdot v_j - \lambda u_i \right)$$
$$ v_j \leftarrow v_j + \alpha \left( e_{ij} \cdot u_i - \lambda v_j \right) $$
其中 $\alpha$ 为学习率。
-
重复迭代,直至收敛(例如,当损失函数的变化小于设定的阈值时)。
-
-
优点:实现简单,适合处理小规模数据。
-
缺点:计算复杂度较高,难以并行化以处理大规模数据。
交替最小二乘法(Alternating Least Squares, ALS)
-
核心思想:交替固定 $U$ 或 $V$,求解另一个矩阵的最优闭式解。
- 固定 $V$,优化 $U$: 对每个用户 $i$,求解线性方程组 $\min_{u_i} \sum_j \left( r_{ij} - u_i \cdot v_j^T \right)^2 + \lambda |u_i|^2$,解得: $$ u_i = \left( V^T V + \lambda I \right)^{-1} V^T R_i $$
- 固定 $U$,优化 $V$: 同理,对每个物品 $j$,解得: $$ v_j = \left( U^T U + \lambda I \right)^{-1} U^T R_j $$
-
优点:能够并行处理用户和物品,适合大规模数据(如Spark实现)。
-
缺点:仅适用于显式反馈数据(如评分),对于隐式反馈需要进行改进(如加权ALS)。
Basic SVD / Funk SVD / LFM
Simon Funk 在博客上公开发表了一个只考虑已有评分记录的矩阵分解方法,称为 Funk-SVD,也就是被 Yehuda Koren 称为隐语义模型的矩阵分解方法。它的出发点为,既然将一个矩阵做 SVD 分解成 3 个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?
算法概述
基本奇异值分解(Basic SVD,又称Funk SVD或隐因子模型LFM)是一种基于显式评分数据的推荐算法。其核心思想是将用户-物品评分矩阵分解为低维用户隐向量和物品隐向量,通过点积逼近真实评分。
预测函数
$$ \hat{r}_{ui} = u_u^T v_i $$ 其中:
- $u_u$:用户 $u$ 的 $K$ 维隐向量
- $v_i$:物品 $i$ 的 $K$ 维隐向量
损失函数
$$ \mathcal{L} = \sum_{(u,i) \in \text{已知评分}} \left( r_{ui} - u_u^T v_i \right)^2 $$
- 问题:无正则化项,模型容易过拟合(表现为训练集误差极低,但测试集误差高)。
- 适用场景:适合快速基线建模或隐向量维度 $K$ 较小的简单任务。
改进方向
针对Basic SVD的不足,后续演化出两种主要改进:
- 归纳偏差增强:加入用户/物品偏置(RSVD)。
- 数据增强:融合隐式反馈(SVD++)。
RSVD(Regularized SVD)
算法改进
RSVD在Basic SVD基础上引入三点关键改进:
- 评分偏差建模: 用户评分可能普遍偏高或偏低(用户偏置 $b_u$),物品可能因质量差异整体评分不同(物品偏置 $b_i$)。
- 正则化约束: 通过L2正则化约束隐向量和偏置项,抑制过拟合。
- 全局均值修正: 添加全局评分均值 $\mu$ 作为基线对齐评分量纲。
预测函数
$$ \hat{r}_{ui} = \mu + b_u + b_i + u_u^T v_i $$
损失函数
$$ \mathcal{L} = \sum_{(u,i)} \left( r_{ui} - \hat{r}_{ui} \right)^2 + \lambda \left( |U|_F^2 + |V|_F^2 + b_u^2 + b_i^2 \right) $$
参数更新规则
- 用户隐向量: $$u_u \leftarrow u_u + \eta \left( e_{ui} v_i - \lambda u_u \right)$$
- 物品隐向量: $$v_i \leftarrow v_i + \eta \left( e_{ui} u_u - \lambda v_i \right)$$
- 用户偏置: $$b_u \leftarrow b_u + \eta \left( e_{ui} - \lambda b_u \right)$$
- 物品偏置: $$b_i \leftarrow b_i + \eta \left( e_{ui} - \lambda b_i \right)$$
优势与局限
- 优势:
- 稳定性和泛化性显著提升(Netflix Prize中曾广泛使用)。
- 偏置项可解释性强(例如 $b_u$ 反映用户打分严格程度)。
- 局限:
- 需调节超参数 $\lambda$ 和 $\eta$(通常采用网格搜索或AutoML工具)。
SVD++:隐式反馈增强的SVD
核心思想
用户未明确评分的隐式行为(点击、浏览、收藏等)反映潜在兴趣,引入隐式反馈因子 $y_j$ 扩展用户隐向量。
预测函数
$$ \hat{r}_{ui} = \mu + b_u + b_i + v_i^T \left( u_u + \frac{1}{\sqrt{|N(u)|}} \sum_{j \in N(u)} y_j \right) $$ 其中:
- $N(u)$:用户 $u$ 的隐式行为物品集合
- $y_j$:物品 $j$ 的隐式反馈隐向量(维度与 $u_u$、$v_i$ 相同)
损失函数
$$ \mathcal{L} = \sum_{(u,i)} \left( r_{ui} - \hat{r}_{ui} \right)^2 + \lambda \left( |U|_F^2 + |V|_F^2 + |Y|_F^2 + b_u^2 + b_i^2 \right) $$
参数更新特性
- 显式评分部分: 更新规则与RSVD相同。
- 隐式反馈部分: 对所有 $j \in N(u)$,更新: $$ y_j \leftarrow y_j + \eta \left( \frac{e_{ui} v_i}{\sqrt{|N(u)|}} - \lambda y_j \right) $$
应用挑战
- 计算复杂度高:每个用户需遍历其隐式行为物品集合,时间复杂度增至 $O(|N(u)|)$。
- 工程优化方案:
- 近似训练:对隐式行为做采样(如负采样)。
- 分批次并行更新隐式向量。
总结
优点(相比协同过滤)
- 泛化能力强:通过隐向量捕捉潜在特征,缓解数据稀疏性(即使共同行为少的用户/物品也能预测)。
- 空间复杂度低:存储参数量为 $(M + N) \times K$(用户+物品隐向量),远小于协同过滤的 $O(M^2)$ 或 $O(N^2)$ 相似度矩阵。
- 扩展灵活:方便融入隐式反馈(如点击)、偏置项、上下文特征,模型迭代成本低。
局限性(作为推荐系统算法)
- 强依赖历史行为:无任何交互记录的新用户/物品(冷启动)无法生成隐向量,导致推荐失效。
- 可解释性弱:用户难理解“为何推荐此内容”(协同过滤可解释性更强)。