基于图的协同过滤算法原理与实现
题目描述
协同过滤是推荐系统中的经典方法,它利用用户的历史行为(如评分、点击)来预测其未来兴趣。基于图的协同过滤算法(如早期的ItemRank,以及现在常与图神经网络结合的方法)将用户和物品视为一个二分图的节点,将交互行为视为边,通过设计图上信息的传播与聚合方式,最终学习得到用户和物品的嵌入向量,用于计算匹配分数,完成推荐任务。本题将深入解析其核心原理、典型算法步骤和实现要点。
循序渐进讲解
第一步:构建用户-物品二分图
- 问题形式化:假设我们有 \(M\) 个用户和 \(N\) 个物品,用户-物品的交互数据(如评分、购买)可以表示为一个稀疏矩阵 \(R \in \mathbb{R}^{M \times N}\),其中 \(R_{ui}\) 表示用户 \(u\) 对物品 \(i\) 的评分(或隐式反馈,如点击则为1,否则为0)。
- 图结构构建:我们将此交互矩阵转化为一个无向二分图 \(G = (\mathcal{V}, \mathcal{E})\)。
- 节点集合 \(\mathcal{V} = \mathcal{U} \cup \mathcal{I}\),包含用户节点(\(\mathcal{U}\))和物品节点(\(\mathcal{I}\))。
- 边集合 \(\mathcal{E}\):如果 \(R_{ui} \ne 0\),则在用户节点 \(u\) 和物品节点 \(i\) 之间建立一条边 \(e_{ui}\)。边的权重通常可以与 \(R_{ui}\) 的值相关(例如,显式评分或隐式反馈的置信度)。
第二步:定义图上信息传播(Message Passing)
这是算法的核心。其基本思想是:相似的用户会对同一物品有相似的喜好;用户喜欢与他已喜欢的物品相似的物品。这可以通过图上节点的“近邻”信息传播来建模。
- 初始化嵌入向量:为每个用户节点 \(u\) 和物品节点 \(i\) 随机初始化一个 \(d\) 维的嵌入向量 \(e_u^{(0)}\) 和 \(e_i^{(0)}\)。
- 邻域聚合:
- 在每一层(或每一次迭代)\(l\),每个节点会从其一阶邻居节点聚合信息,以更新自身的表示。
- 以物品节点 \(i\) 的更新为例:
- 收集邻居信息:物品 \(i\) 的所有邻居是与之有过交互的用户集合 \(\mathcal{N}(i) = \{u | R_{ui} \ne 0\}\)。
- 聚合操作:对来自这些邻居用户的信息进行聚合。最简单的方式是平均池化:
\[ m_i^{(l)} = \frac{1}{|\mathcal{N}(i)|} \sum_{u \in \mathcal{N}(i)} e_u^{(l-1)} \]
这个聚合得到的 $m_i^{(l)}$ 可以被理解为“哪些用户喜欢我(物品i)”,它反映了物品i的受众特征。
3. **更新操作**:将聚合信息与节点自身上一层的表示结合,生成当前层的表示。一个简单的更新方式是直接替换或加权求和:
\[ e_i^{(l)} = \text{UPDATE}(e_i^{(l-1)}, m_i^{(l)}) = m_i^{(l)} \]
更复杂的方式可以是:$e_i^{(l)} = \text{LeakyReLU}(W^{(l)} \cdot [e_i^{(l-1)} \| m_i^{(l)}])$,其中 $W^{(l)}$ 是可学习参数,$\|$ 表示拼接。
- 对称的用户节点更新:
- 同理,对于用户节点 \(u\),其邻居是与之交互过的物品集合 \(\mathcal{N}(u) = \{i | R_{ui} \ne 0\}\)。
- 聚合与更新过程对称:
\[ m_u^{(l)} = \frac{1}{|\mathcal{N}(u)|} \sum_{i \in \mathcal{N}(u)} e_i^{(l-1)} \]
\[ e_u^{(l)} = \text{UPDATE}(e_u^{(l-1)}, m_u^{(l)}) \]
* $m_u^{(l)}$ 可以被理解为“用户u喜欢哪些物品”,它反映了用户的兴趣画像。
- 多层传播:重复上述“邻域聚合”与“节点更新”步骤 \(L\) 层。通过 \(L\) 层传播,每个节点的最终表示能够捕获其 \(L\) 跳(\(L\)-hop)邻域内的结构信息。例如,经过两层传播后,用户 \(u\) 的表示融合了他喜欢的物品(一跳邻居)以及喜欢这些物品的其他用户(二跳邻居)的信息,实现了“用户-物品-用户”的协同。
第三步:生成最终表示与模型预测
- 最终节点嵌入:经过 \(L\) 层传播后,我们可以得到每个用户和物品的最终层嵌入 \(e_u^{(L)}\) 和 \(e_i^{(L)}\)。实践中,有时会将所有层的嵌入拼接或平均,以保留不同阶的邻域信息。
- 预测评分/偏好:要预测用户 \(u\) 对物品 \(i\) 的偏好得分 \(\hat{R}_{ui}\),最简单有效的方法是计算其最终嵌入向量的内积(或余弦相似度):
\[ \hat{R}_{ui} = {e_u^{(L)}}^T e_i^{(L)} \]
内积值越高,表示用户对该物品的偏好越强。
第四步:模型训练与损失函数
- 训练目标:学习所有节点的嵌入向量 \(E = \{e_u, e_i\}\),使得预测的偏好分数 \(\hat{R}_{ui}\) 尽可能接近真实的观测值。
- 损失函数:
- 显式反馈(如评分):常用均方误差(MSE) 作为损失函数:
\[ \mathcal{L} = \sum_{(u, i) \in \mathcal{D}} (R_{ui} - \hat{R}_{ui})^2 + \lambda \|E\|^2_2 \]
其中 $\mathcal{D}$ 是训练集中的(用户,物品)交互对,$\lambda$ 是L2正则化系数,用于防止过拟合。
* **隐式反馈(如点击)**:更常用**贝叶斯个性化排序(BPR)** 损失。它假设观察到的(正)交互物品的排名应高于未观察到的(负)物品。对于一个正样本 $(u, i)$ 和一个随机采样的负样本 $(u, j)$,其损失为:
\[ \mathcal{L}_{BPR} = -\sum_{(u,i,j) \in \mathcal{D}_{BPR}} \ln \sigma(\hat{R}_{ui} - \hat{R}_{uj}) + \lambda \|E\|^2_2 \]
其中 $\sigma$ 是sigmoid函数,$\mathcal{D}_{BPR}$ 是由(用户,正物品,负物品)组成的三元组集合。
- 优化:使用随机梯度下降(SGD)或其变体(如Adam)来最小化损失函数,优化更新所有节点的嵌入向量以及可能的聚合/更新函数中的参数。
核心思想总结
基于图的协同过滤本质上是在高阶连通性上定义平滑性约束。它通过用户-物品交互图上有限步的随机游走或信息传播,将“行为相似的用户对物品有相似喜好”(用户协同)和“用户喜欢与他历史喜好相似的物品”(物品协同)这两种思想统一到了一个基于图表示学习的框架中。最终,用户和物品被映射到同一向量空间,它们的邻近性直接对应于预测的偏好强度。这种方法为后续更复杂的图神经网络(如NGCF、LightGCN等)在推荐系统中的应用奠定了基础。