矩阵因式分解

矩阵分解是一种简单的嵌入模型。由于存在 反馈矩阵 A \(\in R^{m \times n}\),其中 \(m\) 为 即用户(或查询)的数量, \(n\) 是指商品的数量, 模型会学习:

  • 用户嵌入矩阵 \(U \in \mathbb R^{m \times d}\), 其中,第 i 行是用户 i 的嵌入。
  • 项嵌入矩阵 \(V \in \mathbb R^{n \times d}\), 其中,行 j 是项 j 的嵌入。

使用重复电影示例的矩阵因式分解图示。

我们学习嵌入,使积 \(U V^T\) 为 获得良好的近似反馈矩阵。请注意, \((i, j)\) 的条目 \(U . V^T\) 就是点积 \(\langle U_i, V_j\rangle\) 用户嵌入的比例 \(i\) 和项 \(j\),您希望它们接近于 \(A_{i, j}\)。

选择目标函数

平方距离是一种直观的目标函数。为此, 最大限度地降低所有观测到的条目对的平方误差总和:

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2.\]

在此目标函数中,您只需对观测到的对 (i, j) 求和, 即针对反馈矩阵中的非零值。不过,仅求和 对 1 的值进行求解并非好主意 - 所有变量的矩阵 使损失最小,并生成无法提供有效建议的模型 并且概括性很差。

三个矩阵的图示:仅观察到的矩阵分解、加权分解和奇异值分解。

也许您可以将未观测到的值视为 0,然后对所有 矩阵中的条目。这相当于最大限度地降低 平方 Frobenius \(A\) 与其近似值之间的距离: \(U V^T\)

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \|A - U V^T\|_F^2.\]

您可以通过 矩阵的奇异值分解 (SVD)。不过, SVD 也不是一个很好的解决方案,因为在实际应用中, 矩阵 \(A\) 可能非常稀疏。例如,考虑一下 在 YouTube 上的视频观看次数与某个特定用户观看过的所有视频的对比情况。 解 \(UV^T\) (对应于模型的近似值) 就可能接近于零,因此会导致 泛化性能。

相比之下,加权矩阵分解则将目标分解为 转换为以下两个总和:

  • 对观察到的条目进行求和。
  • 与未观察到的条目(被视为零)的总和。

\[\min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 + w_0 \sum_{(i, j) \not \in \text{obs}} (\langle U_i, V_j\rangle)^2.\]

在这里, \(w_0\) 是一个超参数,用于对这两个项进行加权 以确保目标不受这两种因素的支配。 调整此超参数非常重要。

\[\sum_{(i, j) \in \text{obs}} w_{i, j} (A_{i, j} - \langle U_i, V_j \rangle)^2 + w_0 \sum_{i, j \not \in \text{obs}} \langle U_i, V_j \rangle^2\]

其中, \(w_{i, j}\) 是查询 i 和商品 j 的频率的函数。

最小化目标函数

用于最小化目标函数的常见算法包括:

  • 随机梯度下降法 (SGD) 是一种最小化损失函数的通用方法。

  • 加权交替最小二乘 (WALS) 专门用于 特定目标。

目标矩阵 U 和 V 是二次的。(请注意, 不过,该问题并非共同凸出。)WALS 通过初始化 随机生成嵌入,然后在以下两者之间交替进行:

  • 修正 \(U\) 和解决 \(V\)问题。
  • 修正 \(V\) 和解决 \(U\)问题。

每个阶段都可以精确解决(通过线性系统的解),并且 分发。这种方法必定会收敛,因为每个步骤 一定会降低损失。

SGD 与 WALS

SGD 和 WALS 各有利弊。 请查看以下信息,了解它们的对比情况:

SGD

非常灵活,可以使用其他损失函数 函数。

可以并行处理。

更慢 - 收敛速度快。

较难处理未观察到的条目(需要 使用负采样或重力)。

WALS

仅依赖损失平方。

可以并行处理。

收敛比 SGD 更快。

更轻松地处理未观察到的条目。