矩阵分解

矩阵分解是一个简单的嵌入模型。根据反馈矩阵 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\) 是反馈矩阵 A 的近似近似值。请注意,\((i, j)\) \(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) 进行求和,即对反馈矩阵中的非零值求和。然而,仅对某个值求和并不是一个好的做法,所有矩阵的损失都极小,会生成无法提出有效建议且泛化效果较差的模型。

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

也许您可以将未观察到的值视为 0,并对矩阵中的所有条目求和。这对应于最大限度减小 \(A\) 与其近似值 \(U V^T\)之间的平方 Frobenius 距离:

\[\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\)。

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

新加坡元与 WALS

SGD 和 WALS 各有优缺点。 请查看以下信息,了解它们之间的对比情况:

新加坡元

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

可以并行运行。

较慢 - 收敛速度没有那么快。

很难处理未观测到的条目(需要使用负采样或重心)。

WALS

仅依赖于损失方块。

可以并行运行。

收敛速度快于新加坡元。

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