返回
Featured image of post 矩阵分解,用来解决协同过滤的问题

矩阵分解,用来解决协同过滤的问题

矩阵分解(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)

  • 步骤

    1. 随机初始化 $U$ 和 $V$。

    2. 对于每个观察值 $r_{ij}$,计算预测误差 $e_{ij} = r_{ij} - \hat{r}_{ij}$。

    3. 更新用户隐向量 $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$ 为学习率。

    4. 重复迭代,直至收敛(例如,当损失函数的变化小于设定的阈值时)。

  • 优点:实现简单,适合处理小规模数据。

  • 缺点:计算复杂度较高,难以并行化以处理大规模数据。

交替最小二乘法(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的不足,后续演化出两种主要改进:

  1. 归纳偏差增强:加入用户/物品偏置(RSVD)。
  2. 数据增强:融合隐式反馈(SVD++)。

RSVD(Regularized SVD)

算法改进

RSVD在Basic SVD基础上引入三点关键改进:

  1. 评分偏差建模: 用户评分可能普遍偏高或偏低(用户偏置 $b_u$),物品可能因质量差异整体评分不同(物品偏置 $b_i$)。
  2. 正则化约束: 通过L2正则化约束隐向量和偏置项,抑制过拟合。
  3. 全局均值修正: 添加全局评分均值 $\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) $$

参数更新特性

  1. 显式评分部分: 更新规则与RSVD相同。
  2. 隐式反馈部分: 对所有 $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)$ 相似度矩阵。
  • 扩展灵活:方便融入隐式反馈(如点击)、偏置项、上下文特征,模型迭代成本低。

局限性(作为推荐系统算法)

  • 强依赖历史行为:无任何交互记录的新用户/物品(冷启动)无法生成隐向量,导致推荐失效。
  • 可解释性弱:用户难理解“为何推荐此内容”(协同过滤可解释性更强)。

参考文献

推荐算法之矩阵分解

MF矩阵分解 – SVD、LFM、RSVD、SVD++

© 2023 - 2025 壹壹贰捌· 0Days
共书写了258.5k字·共 93篇文章 京ICP备2023035941号-1