【科研导向】Neural Collaborative Filtering 神经协同过滤 <论文理解代码分析>

article/2025/8/26 11:57:01

Neural Collaborative Filtering——WWW'17

  • 文章简介
    • 一.摘要解析
    • 二.技术要点
    • 三.实验部分
  • 代码解析
    • 一.模型构建
    • 二.难点问题
  • 未来展望

文章简介

该文由何向南教授团队于17年发表在IW3C2,其核心思想在于结合了传统矩阵分解的易用性与神经网络对用户项目交互的高维感知力来提高最终推荐的性能表现。
Keywords: 协同过滤//神经网络//深度学习//矩阵分解//隐式反馈

一.摘要解析

研究背景是当年深度学习在语音识别,计算机视觉和NLP方面已经取得了巨大成功。而在推荐系统的研究上,深度学习主要被用于模拟辅助信息,如项目的文本描述和音乐的声学特征等。在对协同过滤的关键因素——用户和项目特征之间的交互建模时,仍然采用矩阵分解的方式。
具体做法是通过可以从数据中学习任意函数的神经架构来替换内积,基于此提出了NCF的通用框架。在NCF的框架下泛化了矩阵分解GMF来建模线性表达,加入了多层感知机MLP来增强非线性建模。

二.技术要点

  1. Learning from Implicit Data:从隐式反馈数据中学习用户和项目的交互,其交互矩阵Y=RM×N的构建如下图所示。
    编码方式:one-hot交互函数

  2. GMF:在众多协同过滤技术中,矩阵分解是最受欢迎的一种,它将用户和项目投影到共享的Latent space,使用潜在特征向量来表示用户或项目,而用户与项目的交互则被建模为其潜在向量的内积。而NCF解释了如何将MF作为其框架下的案例之一,并泛化为GMF。核心参数:number_factors即向量表示的因子数

  3. MLP:标准的多层感知机,对于网络结构其采用的常见的塔式结构(底层最宽,往上递减),在这里我们可自定义网络的层数以应对不同场景的需求。由于神经网络的特性,MLP在建模非线性表达时具体显著优势,可作为GMF很好的补充。核心参数:number_layers即网络层数与因子数

  4. NCF(GMF&MLP):在基础模型构建完成之后,如何融合此二者则变成一个非常重要的问题,这将直接影响模型的性能。在这个问题的处理上,作者同样做了多种尝试,最终考虑到共享GMF和MLP的嵌入可能会限制融合模型的性能(即两个模型对某个数据集的最佳batch_size变化很大),于是采用二者分别学习嵌入,并通过连接二者最后一个隐藏层来组合这两个模型。详见下图:NCF通用框架

三.实验部分

实验部分主要回答三个问题:

  1. NCF与最新的基于隐式反馈的协同过滤方法相比表现如何?
    of cause better
  2. 所提出的优化框架(log loss with negative sampling)如何作用于推荐任务?
    3~6左右的采样率可以很好的提升方法性能
  3. 更深层的隐藏单元是否有助于更好的学习用户-项目交互?
    实验数据表明在0-4层中,4层的结果最优

实验设置
数据集:MovieLens & Pinterest
预训练:通过两个模型单独学习得到的参数作为NCF初始化参数
评估方法: 该模型采用leave-1-out评估,其中评价指标为HitRate & NDCG //可以理解为命中率和排名靠前率//
基准方法:ItemPop & ItemKNN & BPR & eALS

通过实验验证,表明了进行个性化推荐的必要性以及同时结合线性与非线性模型的先进性。

代码解析

源代码:Neural Collabrative Filtering
该模型基于Pyhon2 & Theano/Keras构建,部分包可能无法从官网获取,需要从Github or Google下载。而且,其中部分代码可能因环境差异导致无法解析,进而影响程序运行。下面我将以伪代码展示出来,并以框架的形式将模型复现,包括对部分源代码的修改。

一.模型构建

Load data

# Series of loaddata functions
def load_negative_file(self, filename):return negativeList
def load_raing_file_as_list(self, filename):return ratingList
def load_raing_file_as_matrix(self, filename):return uimatrix

GMF Part

def get_model(num_users, num_items, latent_dim, regs=[0, 0]):
# para: 用户数,项目数,映射维度···predict_vector = merge([user_latent, item_latent], mode = 'mul')# 以element-wise multiply的形式表达user-item交互return modeldef get_train_instances(train, num_negative):
# para: 训练矩阵,负采样数···for (u, i) in train.keys():user_input / item_input.append(u / i)labels.append(1)for t in xrange(num_negative):j = random(num_items)# while train.has_key((u, j)) 该行为源码,运行报错while (u, i) in train: # 此行为修改后可运行的代码j = random(num_items)user_input / item_input.append(u / i)labels.append(0)return user_input, item_input, labels

MLP Part

def get_model(num_users, num_items, layers=None, reg_layers=None):
# para: 用户数,项目数,网络层数[32, 16, 8](3层)···vector = merge([user_latent, item_latent], mode='concat')# vector = user + item 两个向量直接拼接for idx in range(1, num_layer=len(layers)):layer = Dense(···) # 优化器l2,激活函数reluvector = layer(vector)prediction = Dense(1, ···)(vector) # 激活函数sigmoidreturn model
def get_train_instances(train, num_negative):
# same with upper

NeuMF Part

def get_model(num_users, num_items, mf_dim=8, layers=None, reg_mf =0, reg_layers=None):···# MF part: element-wise multiplymf_vector = merge([mf_user_latent, mf_item_latent], mode='mul')# MLP part: same with uppermlp_vector = merge([mlp_user_latent, mlp_item_latent], mode='concat')for idx in range(1, num_layer):layer = Dense(layers[idx],···) # 优化器l2,激活函数relumlp_vector = layer(mlp_vector)# Concatenate# 此处并非简单的将二者结果连接,而是将二者的预测因子拼接后,再经过一次Dense层predict_vector = merge([mf_vector, mlp_vector], mode='concat')prediction = Dense(1,···)(predict_vector) # 激活函数sigmoidreturn model
def get_train_instances(train, num_negative):
# same with upper

二.难点问题

从文章内容来说,其重点在于理解MF是如何被解释为GMF的一种特例以及两模型融合时采用的策略延展到代码中是如何表现的。文章的思想在于将传统方法深度学习相结合,既保证其原理性又能借助深度学习提高其非线性的模型表达。
从代码部分来说,查阅多方资料后并修改源代码后,复现NCF模型难度不大。但是该模型相对较老旧,许多包和配置无法直接安装。虽然Python2版本下部分语法的差异性影响了代码可读性,不过代码整体逻辑严密,函数封装合理,结合文章叙述去理解代码相对顺利。

未来展望

作者所期望的是将NCF拓展到对辅助信息建模,如用户评论/知识库/时间信号等。而我在商品推荐的场景下,考虑项目类别信息建模,得益于推荐类别的高精度,利用数据中的类别属性单独建模用户-项目类别,然后在被推荐类别的项目中继续做项目推荐。此举可以在一定程度上缓解u-i矩阵的稀疏度,并提高模型表现。


http://chatgpt.dhexx.cn/article/8mL9rYMA.shtml

相关文章

Maven Filtering和Profile

Filtering Filtering是resource插件的功能,作用是将资源文件中的占位符替换成对应的值,如下图所示: 使用注意 启用resource插件的filtering功能;设定资源文件的路径、过滤条件和编码等等;设定属性文件来源&#xf…

Particle Filtering粒子滤波

粒子滤波理论 本文由最基础的贝叶斯估计开始介绍,再引出蒙特卡罗采样,重要性采样,SIS粒子滤波,重采样,基本粒子滤波Generic Particle Filter,SIR粒子滤波,这些概念的引进,都是为了解…

Deep Frequency Filtering for Domain Generalization论文阅读笔记

这是CVPR2023的一篇论文,讲的是在频域做domain generalization,找到频域中generalizable的分量enhance它,suppress那些影响generalization的分量 DG是一个研究模型泛化性的领域,尝试通过各自方法使得模型在未见过的测试集上有良好…

读Multiscale Vessel Enhancement Filtering笔记

1.Introduction 通常对CTA和MRA的血管成像方法中,可视化3维血管结构的方法是MIP。但是MIP的缺点是会将非血管结构展现出来并且对于对比度比较低的小血管展现不太好。这也正是TOF-MRA的缺点。 这篇论文的目的是为了增强血管结构,最终达到血管分割的目的。…

Maven Resources Plugin的Filtering功能的Bug

Maven Resources Plugin的Filtering功能是非常强大的,是构建中非常重要的一项必备特性,但是最近发现了Filtering在过滤复杂文本(例如Shell脚本)时,会有一些问题,简单记录一下。以下是一段Shell脚本&#xf…

Neural Collaborative Filtering

目录 2 PRELIMINARIES3. NEURAL COLLABORATIVE FILTERING3.1 通用框架3.2 广义矩阵分解(GMF)3.3 MLP3.4 GMF和MLP的聚合—NeuMF 4 EXPERIMENTSQ1 NCF的效果比其他SOTA的隐式CF好吗?Q2 带有负采样的log loss(这个优化框架)是否适用于RS&#x…

图像处理中滤波(filtering)与卷积(convolution)的区别

图像处理中滤波和卷积是常用到的操作。很多人认为卷积就是滤波,两者并无区别,其实不然。两者在原理上相似,但是在实现的细节上存在一些区别。这篇博文主要叙述这两者之间的区别。 1、滤波(或者叫相关) 简单来说&#…

MAVEN中filtering的作用是什么?

FILTERING的作用 MAVEN提供了一种过滤机制,这种机制能够在资源文件被复制到目标目录的同时,当filtering true时替换资源文件中的占位符;当filtering false时不进行占位符的替换。 写在前面 如下所示filtering的用法,它对资源…

在Navicat premium上实现两个数据库同步

问题:有两个数据库A和B,现需要将数据库A的数据同步到数据库B上。 法一:使用备份 首先在数据库A上生成备份 然后将数据库A的备份拷贝到存储数据库B的备份的文件夹下,然后点击还原备份 方法二:使用工具中的同步操作 点击工具->结构同步 选…

Otter实现数据库同步

Otter工作原理 原理描述: 基于Canal开源产品,获取数据库增量日志数据。典型管理系统架构,manager(web管理)+node(工作节点) a. manager运行时推送同步配置到node节点 b. node节点将同步状态反馈到manager上基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作…

【愚公系列】2022年12月 数据库-关系数据库同步框架Dotmim.Sync的使用

文章目录 前言1.移动智能的三种模式2.混合模式模式的瓶颈3.数据同步的解决方案 一、关系数据库同步框架Dotmim.Sync的使用1.包介绍2.SqlServer到Sqlite同步测试基本使用3.SqlServer到Sqlite同步测试Web API代理3.1 服务端设置SqlServer同步服务3.2 客户端设置SqlLite同步服务3.…

django mysql数据同步_[django自动同步数据库]Django数据库同步操作技巧详解

同步数据库: 使用上述两条命令同步数据库 1.认识migrations目录: migrations目录作用:用来存放通过makemigrations命令生成的数据库脚本,里面的生成的脚本不要轻易修改。 要正常的使用数据库同步的功能,app目录下必须要…

SQLSERVER数据库同步

SQLSERVER数据库数据同步 1、实现方法2、实现发布3、实现订阅 1、实现方法 使用的是SQL自带的发布与订阅功能,SQL Server版本是2008,一台发布,一台订阅,实现数据库的数据同步。 2、实现发布 打开复制,右击本地发布&…

MySQL第九讲 MySQL集群主从搭建指定数据库同步数据

1、全库同步与部分同步 之前提到,我们目前配置的主从同步是针对全库配置的,而实际环境中,一般并 不需要针对全库做备份,而只需要对一些特别重要的库或者表来进行同步。那如何 针对库和表做同步配置呢? 首先在Master端…

Python数据库同步神器(一键同步)

1.背景: 最近公司项目的用户中心模块经常出现线上问题,测试人员需要将线上真实数据导入到测试环境中去复现Bug。公司有3套测试环境,来回切换并校验数据比较麻烦,于是就有了如下的数据库同步神器。 2.界面: 3.源代码&…

分布式数据库同步

分布式部署时数据库之间的数据同步 数据的同步原理就是同步binlog日志到需要复制的其他的数据库上,其他数据库根据binlog日志里面的ddl和dml语句,执行该语句同步到当前数据库,就能保证多个数据库的数据的一致性。 Binlog日志主要是的数据库执行的ddl、…

异构数据库同步方案

目录 1 概述 2 原理 3 参数 1 概述 为减轻生产库负载,避免在其上直接运行分析应用拖垮系统,需要将生产系统产生的业务数据实时同步到大数据分析平台。 凭借异构(主从库不同类型、主从对象不同属主模式)数据处理能力&#xff…

IDEA 之because it is included into a circular dependency循环依赖的解决办法

问题场景: 今天启动项目的时候突然遇到这个错误导致无法启动 Information:2019/8/26 11:34 - Compilation completed with 1 error and 0 warnings in 6 s 52 ms Error:Cannot build artifact aws_multi_branch_1.0.0:war exploded because it is included into a…

Maven dependencyManagement 详解

dependencyManagement(以下简称:《依赖管理器》) 《依赖管理器》简介 Maven中的《依赖管理器》元素提供了一种管理依赖版本号的方式。在《依赖管理器》元素中声明所依赖的jar包的版本号等信息,那么所有子项目再次引入此依赖jar包…