神经协同过滤算法解析:从矩阵分解到深度神经网络

总阅读量 加载中... 次

1 引言

推荐系统作为解决信息过载问题的核心技术,已经在电商、内容平台、社交网络等领域得到了广泛应用。在众多推荐算法中,协同过滤(Collaborative Filtering)因其“物以类聚”的朴素思想——即相似用户会喜欢相似的物品——而成为推荐领域最经典的方法之一。

传统的协同过滤主要基于矩阵分解(Matrix Factorization)技术,将用户-物品交互矩阵分解为两个低维隐向量矩阵,从而预测用户对未交互物品的偏好。这种方法在Netflix Prize比赛中大放异彩,但其线性建模方式限制了模型的表达能力。

2017年,香港科技大学何向南团队在WWW国际会议上发表了论文《Neural Collaborative Filtering》,首次将深度神经网络引入协同过滤建模,提出了Neural Collaborative Filtering(NCF)框架。该论文被引用超过3000次,成为推荐系统领域的经典之作。本文将深入解析这篇论文的核心思想,帮助读者理解如何用深度学习革新传统推荐算法。

2 核心算法解析

2.1 传统矩阵分解的局限

在基于矩阵分解的协同过滤中,我们假设用户u对物品i的偏好可以表示为:

y^ui=puT⋅qi

其中 pu 和 qi 分别是用户和物品的隐向量。这种内积(dot product)操作本质上是一种线性组合,假设用户偏好的各个维度是相互独立的。然而,实际用户行为往往呈现复杂的非线性模式——例如,一个喜欢科幻电影的用户可能同时喜欢动作片,但这种关联无法通过简单的线性内积捕捉。

此外,内积操作不满足三角不等式,即向量夹角相近的物品并不一定在真实偏好空间中相近,这导致了隐式表示的局限性。

2.2 NCF框架设计

NCF框架的核心思想是用神经网络替代内积操作,学习更复杂的用户-物品交互函数。整体框架包含三个主要组件:

首先是一致嵌入层(Embedding Layer)。NCF将用户ID和物品ID通过嵌入层映射到分布式表示。与传统矩阵分解的one-hot编码不同,NCF使用可训练的嵌入矩阵,将稀疏的ID映射为稠密的隐向量。用户的嵌入向量和物品的嵌入向量随后被拼接或元素级相乘,传递给下游神经网络。

其次是多层感知机(MLP)。NCF使用多层感知机来学习用户和物品隐向量之间的非线性交互。每一层通过全连接操作和非线性激活函数(如ReLU)逐步提取高阶交互特征。网络深度使得模型能够捕获更复杂的模式,论文建议使用递减的隐藏层大小(如64-32-16-8),逐层抽象。

最后是神经矩阵分解(NeuMF)。这是NCF的最终模型,结合了广义矩阵分解(GMF)和MLP两条路径。GMF使用元素级乘积(element-wise product)融合用户和物品向量,本质上是线性模型的增强版。NeuMF将GMF的输出与MLP的最后一层拼接,再通过一个输出层产生最终预测:

y^ui=σ(wT⋅[g⊙h,hMLP])

其中 g 是GMF的输出, hMLP 是MLP的最后隐藏层, ⊙ 表示元素级乘积。

2.3 损失函数设计

NCF采用二元交叉熵损失函数,将推荐问题建模为二分类问题:

L=−∑(u,i)∈Y+log⁡y^ui−∑(u,i)∈Y−log⁡(1−y^ui)

其中 Y+ 是正样本集合(用户有过交互的物品), Y− 是负采样得到的负样本集合。这种负采样策略解决了正负样本严重不平衡的问题,是推荐系统训练的常见技巧。

3 实践应用

NCF框架适用于多种推荐场景。在电影推荐(如MovieLens数据集)和商品推荐场景中,NCF能够学习用户偏好的复杂模式。在冷启动场景中,使用预训练的嵌入向量可以缓解新用户新物品的推荐难题。NCF也可以与内容特征结合,构建混合推荐模型。

在实际部署中,NCF面临两个主要挑战:训练效率(需要大量负采样和GPU资源)和在线Serving(需要实时计算用户-物品分数)。实践中可以通过近似最近邻检索(如Faiss)加速推理,或者蒸馏为轻量模型。

4 代码示例

以下是一个简化版的PyTorch实现示例:

import torch
import torch.nn as nn

class NCFModel(nn.Module):
    def __init__(self, num_users, num_items, embed_dim=32, hidden_layers=[64, 32, 16]):
        super().__init__()
        
        # 嵌入层
        self.user_embed = nn.Embedding(num_users, embed_dim)
        self.item_embed = nn.Embedding(num_items, embed_dim)
        
        # MLP mlp_layers = []
        prev_dim = embed_dim * 2
        for dim in hidden_layers:
            mlp_layers.extend([
                nn.Linear(prev_dim, dim),
                nn.ReLU()
            ])
            prev_dim = dim
        self.mlp = nn.Sequential(*mlp_layers)
        
        # 输出层
        self.output = nn.Linear(hidden_layers[-1], 1)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, user_ids, item_ids):
        # 获取嵌入
        u = self.user_embed(user_ids)
        i = self.item_embed(item_ids)
        
        # 拼接后通过MLP
        x = torch.cat([u, i], dim=-1)
        x = self.mlp(x)
        
        # 输出预测分数
        return self.sigmoid(self.output(x)).squeeze()

训练时使用二元交叉熵损失,优化器通常选择Adam。

5 总结

NCF论文的核心贡献在于将深度学习引入协同过滤,用神经网络学习用户-物品交互函数,突破了传统矩阵分解的线性局限。框架通过嵌入层学习分布式表示,通过MLP学习高阶非线性交互,通过GMF+MLP的融合实现更强大的表达能力。

这篇论文开启了推荐系统深度学习浪潮的序幕,后续的NCF改进版本(如DIN、DIEN、BST等)将注意力机制、序列建模等技术引入推荐算法,逐步构建起现代推荐系统的技术体系。对于推荐系统的学习者和从业者来说,NCF是一篇值得深入研读的经典论文。