【推荐系统】User-Item CF:NGCF

news2024/11/27 11:46:41

💡 本次解读的文章是 2019 年发表于 SIGIR 的一篇基于图卷积神经网络的用户物品协同过滤推荐算法论文, 论文将用户-物品交互信息建模为二分图,提出了一个基于二分图的推荐框架 Neural Graph Collaborative Filtering(NGCF),有效地将协作信号以显式的方式注入到嵌入过程中,并利用 GNN 捕捉高阶交互信息,以此提高预测的效果。

一、本文贡献

(1)说明了在基于模型 CF 方法的嵌入中显式地利用协作信号的重要性;

(2)提出了一种高阶、显式编码协助信号的图神经网络推荐框架 NGCF;

(3)在 300 万规模的数据集上进行了实证研究,结果证明了 NGCF 的有效性。

二、NGCF 框架

NGCF 框架主要有三个部分组成,分别是嵌入层(Embeddings Layer)、嵌入传播层(Embedding Propagation Layers)以及预测层(Prediction Layer)。

2.1 嵌入层

对于一个用户 u u u (或物品 i i i),首先利用 one-hot 编码进行向量表示,再利用 embedding 技术获取大小为 d d d 的嵌入表示 e u ∈ R d ( e i ∈ R d ) \mathbf{e}_{u} \in \mathbb{R}^{d}(\mathbf{e}_{i} \in \mathbb{R}^{d}) euRd(eiRd),以此构建出一个作为嵌入查找表的参数矩阵:

将上述嵌入表作为用户嵌入和物品嵌入的初始状态,并通过后续的图神经网络以端到端方式进行优化,增强嵌入表示中的协同信号。

2.2 嵌入传播层

嵌入传播过程的介绍主要分为一阶传播和高阶传播两个部分。

(1)一阶传播

从直观上看,与用户发生过交互的物品一定程度上反映了用户的偏好,依据协同过滤的思想,与某一物品发生过交互行为的用户可以作为该物品的特征,进一步地,基于此特征衡量两个物品的协同相似度。而这一过程主要通过一阶传播实现,该过程包含两个主要操作:消息构建和消息聚合。

  • 消息构建

对于存在交互行为的用户-物品对 ( u , i ) (u,i) (u,i),将从物品 i i i 流向用户 u u u 的消息定义为:

m u ← i = f ( e i , e u , p u i ) \mathbf{m}_{u \leftarrow i}=f\left(\mathbf{e}_i, \mathbf{e}_u, p_{u i}\right) mui=f(ei,eu,pui)
其中, m u ← i \mathbf{m}_{u \leftarrow i} mui 为传播消息的嵌入表示, f ( ⋅ ) f(\cdot) f() 是消息编码函数,它以嵌入 e i \mathbf{e}_{i} ei e u \mathbf{e}_{u} eu 作为输入,利用系数 p u i p_{ui} pui控制边 ( u , i ) (u,i) (u,i) 上每次传播的衰减因子。在本文中上述消息定义的具体实现为:
m u ← i = 1 ∣ N u ∥ N i ∣ ( W 1 e i + W 2 ( e i ⊙ e u ) ) \mathbf{m}_{u \leftarrow i}=\frac{1}{\sqrt{\left|\mathcal{N}_u \| \mathcal{N}_i\right|}}\left(\mathbf{W}_1 \mathbf{e}_i+\mathbf{W}_2\left(\mathbf{e}_i \odot \mathbf{e}_u\right)\right) mui=NuNi 1(W1ei+W2(eieu))
其中, W 1 , W 1 ∈ R d ′ × d \mathbf{W}_{1},\mathbf{W}_{1} \in \mathbb{R}_{d' \times d} W1,W1Rd×d 是可训练的权重矩阵,用于提取传播中的有用信息, d ′ d' d 表示变换大小, ⊙ \odot 表示逐位乘积, e i ⊙ e u \mathbf{e}_i \odot \mathbf{e}_u eieu 表示物品与用户交互信息的编码。这里用图拉普拉斯范数 1 ∣ N u ∥ N i ∣ \frac{1}{\sqrt{\left|\mathcal{N}_u \| \mathcal{N}_i\right|}} NuNi 1 作为 p u i p_{ui} pui 的取值, N u \mathcal{N}_{u} Nu N i \mathcal{N}_{i} Ni 分别表示用户 u u u 和物品 i i i 的一跳邻居,其反映了历史物品对用户偏好的贡献程度,且传播的消息随路径长度衰减。

  • 消息聚合

在获取了消息的表示后,对于用户 u u u 需要对邻域传播来的消息进行聚合,以此更新 u u u 的嵌入表示。具体地,将聚合函数定义为:
e u ( 1 ) = L e a k y R e L U ( m u ← u + ∑ i ∈ N i m u ← i ) \mathbf{e}^{(1)}_{u} = LeakyReLU(\mathbf{m}_{u \leftarrow u} + \sum_{i \in \mathcal{N}_{i}}{\mathbf{m}_{u \leftarrow i}}) eu(1)=LeakyReLU(muu+iNimui)
其中, e u ( 1 ) \mathbf{e}^{(1)}_{u} eu(1) 表示经过第一个嵌入传播层后得到的用户 u u u 嵌入表示, m u ← u \mathbf{m}_{u \leftarrow u} muu 表示用户的自连接,它保留了原始特征的信息。类似地,可以通过从物品 i i i 连接的用户传播信息来获得物品 i i i 的嵌入表示 e i ( 1 ) \mathbf{e}^{(1)}_{i} ei(1)

(2)高阶传播

在获取了一阶传播表示后,可以通过堆叠更多的图神经网络层,来获取高阶交互信息。通过堆叠 l l l 个嵌入传播层,用户和物品能够接收从其 l l l 跳邻居传播的消息,在第 l l l 步中,用户 u u u 的嵌入表示为:
e u ( l ) = L e a k y R e L U ( m u ← u ( l ) + ∑ i ∈ N i m u ← i ( l ) ) \mathbf{e}^{(l)}_{u} = LeakyReLU(\mathbf{m}_{u \leftarrow u}^{(l)} + \sum_{i \in \mathcal{N}_{i}}{\mathbf{m}_{u \leftarrow i}^{(l)}}) eu(l)=LeakyReLU(muu(l)+iNimui(l))
其中, m u ← i ( l ) = p u i ( W 1 ( l ) e i ( l − 1 ) + W 2 ( l ) ( e i ( l − 1 ) ⊙ e u ( l − 1 ) ) ) \mathbf{m}_{u \leftarrow i}^{(l)} = p_{ui}(\mathbf{W}_{1}^{(l)}\mathbf{e}_{i}^{(l-1)} + \mathbf{W}_{2}^{(l)}(\mathbf{e}_{i}^{(l-1)} \odot \mathbf{e}_{u}^{(l-1)})) mui(l)=pui(W1(l)ei(l1)+W2(l)(ei(l1)eu(l1))) m u ← u ( l ) = W 1 ( l ) e u ( l − 1 ) \mathbf{m}_{u \leftarrow u}^{(l)}=\mathbf{W}_{1}^{(l)}\mathbf{e}_{u}^{(l-1)} muu(l)=W1(l)eu(l1) W 1 , W 2 ∈ R d l × d l − 1 \mathbf{W}_{1}, \mathbf{W}_{2} \in \mathbb{R}^{d_{l} \times d_{l-1}} W1,W2Rdl×dl1 表示可训练的变换矩阵。

(3)矩阵表示

基于上述一阶传播和高阶传播的向量化表示,将传播过程以矩阵的形式进行统一表示:
E ( l ) = LeakyReLU ⁡ ( ( L + I ) E ( l − 1 ) W 1 ( l ) + L E ( l − 1 ) ⊙ E ( l − 1 ) W 2 ( l ) ) \mathbf{E}^{(l)}=\operatorname{LeakyReLU}\left((\mathcal{L}+\mathbf{I}) \mathbf{E}^{(l-1)} \mathbf{W}_{1}^{(l)}+\mathcal{L} \mathbf{E}^{(l-1)} \odot \mathbf{E}^{(l-1)} \mathbf{W}_{2}^{(l)}\right) E(l)=LeakyReLU((L+I)E(l1)W1(l)+LE(l1)E(l1)W2(l))
其中, E ( l ) ∈ R ( N + M ) × d l \mathbf{E}^{(l)} \in \mathbb{R}^{(N+M) \times d_{l}} E(l)R(N+M)×dl 是经过 l l l 步嵌入传播后得到的用户和物品的表示, E ( 0 ) \mathbf{E}^{(0)} E(0) 表示初始嵌入,即 e u ( 0 ) = e u , e i ( 0 ) = e i \mathbf{e}^{(0)}_{u} = \mathbf{e}_{u}, \mathbf{e}^{(0)}_{i} = \mathbf{e}_{i} eu(0)=eu,ei(0)=ei I \mathbf{I} I 表示单位矩阵, L \mathcal{L} L 表示用户-物品二分图的拉普拉斯矩阵:
L = D − 1 2 A D − 1 2  and  A = [ 0 R R ⊤ 0 ] \mathcal{L}=\mathrm{D}^{-\frac{1}{2}} \mathrm{AD}^{-\frac{1}{2}} \text { and } \mathrm{A}=\left[\begin{array}{cc} 0 & \mathbf{R} \\ \mathbf{R}^{\top} & 0 \end{array}\right] L=D21AD21 and A=[0RR0]
其中, R ∈ R N × M \mathbf{R} \in R^{N \times M} RRN×M 表示用户-物品交互矩阵, A \mathbf{A} A 为邻接矩阵, D \mathbf{D} D 为对角度矩阵(第 t t t 个对角元素 D t t = ∣ N t ∣ D_{tt} = |N_{t}| Dtt=Nt,因此,有 L u i = 1 / ∣ N u ∣ ∣ N i ∣ \mathcal{L}_{u i}=1 / \sqrt{\left|\mathcal{N}_{u}\right|\left|\mathcal{N}_{i}\right|} Lui=1/NuNi 。这种通过矩阵表示的传播规则,可以丢弃节点采样过程,以相当高效的方式同时更新所有用户和物品的表示,这意味着该方法可以在大规模图上运行。

2.3 预测层

在经过 L L L 层嵌入传播层后,可以得到用户 u u u 的多个嵌入表示 { e u ( 1 ) , ⋯   , e u ( L ) } \left\{\mathbf{e}_{u}^{(1)}, \cdots, \mathbf{e}_{u}^{(L)}\right\} {eu(1),,eu(L)},由于不同层得到的表示强调的是通过不同连接传递的消息,它们在反映用户偏好方面的贡献不同。因此,这里主要利用拼接操作,将它们拼接成最终的嵌入表示:
e u ∗ = e u ( 0 ) ∥ ⋯ ∥ e u ( L ) , e i ∗ = e i ( 0 ) ∥ ⋯ ∥ e i ( L ) \mathbf{e}_{u}^{*}=\mathbf{e}_{u}^{(0)}\|\cdots\| \mathbf{e}_{u}^{(L)}, \quad \mathbf{e}_{i}^{*}=\mathbf{e}_{i}^{(0)}\|\cdots\| \mathbf{e}_{i}^{(L)} eu=eu(0)eu(L),ei=ei(0)ei(L)
在分别获取了用户 u u u 和物品 i i i 的最终嵌入表示后,可以利用内积来估计用户对目标物品的偏好:

y ^ N G C F ( u , i ) = e u ∗ ⊤ e i ∗ \hat{y}_{\mathrm{NGCF}}(u, i)=\mathbf{e}_{u}^{* \top} \mathbf{e}_{i}^{*} y^NGCF(u,i)=euei

三、模型训练

(1)损失函数定义

为了学习模型参数,论文使用了成对 BPR 损失函数,它考虑了观察到的和未观察到的用户-物品交互之间的相对顺序,即 BPR 假设观察到的交互比未观察到的交互更能反映用户的偏好,应该赋予更高的预测值,目标函数如下:
 Loss  = ∑ ( u , i , j ) ∈ O − ln ⁡ σ ( y ^ u i − y ^ u j ) + λ ∥ Θ ∥ 2 2 \text { Loss }=\sum_{(u, i, j) \in O}-\ln \sigma\left(\hat{y}_{u i}-\hat{y}_{u j}\right)+\lambda\|\Theta\|_{2}^{2}  Loss =(u,i,j)Olnσ(y^uiy^uj)+λ∥Θ22
其中, O = { ( u , i , j ) ∣ ( u , i ) ∈ R + , ( u , j ) ∈ R − } O=\left\{(u, i, j) \mid(u, i) \in \mathcal{R}^{+},(u, j) \in \mathcal{R}^{-}\right\} O={(u,i,j)(u,i)R+,(u,j)R},训练集中的数据对, R + \mathcal{R}^{+} R+ 表示观察到的交互, R − \mathcal{R}^{-} R 表示未观察到的交互, σ ( ⋅ ) \sigma(\cdot) σ() 表示 sigmoid 函数, Θ = { E , { W 1 ( l ) , W 2 ( l ) } l = 1 L } \Theta = \left\{\mathbf{E},\left\{\mathbf{W}_{1}^{(l)}, \mathbf{W}_{2}^{(l)}\right\}_{l=1}^{L}\right\} Θ={E,{W1(l),W2(l)}l=1L} λ \lambda λ 用于控制 L2 正则化强度,防止过拟合。这里论文采用 mini-batch Adam 优化预测模型并更新模型参数,对于一批随机采样的三元组 ( u , i , j ) ∈ O (u, i, j)\in O (u,i,j)O,在传播 L L L 步后建立其表示为 [ e ( 0 ) , ⋯   , e ( L ) ] [e^{(0)}, \cdots, e^{(L)}] [e(0),,e(L)],然后利用损失函数的梯度更新模型参数。

(2)消息和节点的 Dropout

Dropout 操作主要用于缓解模型的过拟合现象,一般只在训练中使用,在测试时禁用。本文的方法在训练时,以概率 p 1 p1 p1 删除传播过程中的消息,即在第 l l l 个传播层中,只有部分消息贡献于嵌入表示。另外,本文的方法还进行了节点丢弃来随机阻塞特定的节点并丢弃其所有的传出消息,即对于第 l l l 个传播层,随机丢弃拉普拉斯矩阵的 ( M + N ) p 2 (M + N)p2 (M+N)p2 个节点,其中 p 2 p2 p2 为丢弃率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于nodejs+vue的社区问答网站与设计

目 录 摘要 I Abstract II 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 相关技术介绍 3 3 系统分析 5 3.1可行性分析 5 3.2 需求分析 5 3.2.1非功能性需求 5 3.2.2功能需求 6 3.3 系统用例 6 3.3.1 会员功能需求 6 …

【C++修炼之路】13. priority_queue及仿函数

每一个不曾起舞的日子都是对生命的辜负 stack&&queue一 . priority_queue介绍二. priority_queue的使用三. 仿函数3.1 仿函数的介绍3.2 仿函数的好处四.priority_queue模拟实现五.仿函数之日期比较一 . priority_queue介绍 priority_queue文档介绍 优先队列是一种容器…

机器学习实战(第二版)读书笔记(2)—— LSTMGRU

刚接触深度学习半年的时间,这期间有专门去学习LSTM ,这几天读机器学习实战这本书的时候又遇到了,感觉写的挺好的,所以准备结合本书写一下总结方便日后回顾。如有错误,欢迎批评指正。 一、LSTM 优势:可在一…

ApiSix 开启SkyWalking插件,实现链路信息追踪

ApiSix 开启SkyWalking插件,实现链路信息追踪1 ApiSix开启SkyWalking插件1.1 修改config.yml配置文件1.2 在路由中开启SkyWalking插件2 创建两个SpringBoot服务,接入SkyWalking2.1 下载skywalking agent2.2 创建服务2.3 测试SkyWalking1 ApiSix开启SkyWa…

【链表】反转链表

BM1反转链表 描述 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0\leq n\leq10000≤n≤1000 要求:空间复杂度…

飞行员兄弟( 二进制枚举) --《算法竞赛进阶指南》

题目如下: 输入样例: --- ---- ---- ---输出样例: 6 1 1 1 3 1 4 4 1 4 3 4 4思路 or 题解: 数据量很小可以直接进行 搜索 在这里我使用 二进制枚举 的方法去寻找答案 时间复杂度:O(2n)O(2^n)O(2n) 我们二进制枚举…

计算机相关专业混体制的解决方案(事业编之学校与医院)

文章目录1、教师行业1.1 中小学教师资格1.2 高校教师资格证1.3 应聘中小学教师1.4 待遇2、医疗行业2.1 如何进入医院信息科2.2 医院信息科工作内容2.3 医院信息科待遇主要介绍三个方面: 1、招聘条件,要求是什么。 2、工作内容,需要我做什么工…

【哈希表】leetcode242.有效的字母异位词(C/C++/Java/Python/Js)

leetcode242.有效的字母异位词1 题目2 思路 (字典解法)3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python版本3.5 JavaScript版本4 总结1 题目 题源链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xf…

【JavaScript】多态(Symbol),迭代器接口,getter/setter,继承,instanceof

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录多态symbol迭代器接口实现数组的迭代器方法练习Getter/Setterstatic继承instanceof多态 我拿到一…

虽迟但到,我的2022年终总结

“子在川上曰,逝者如斯夫”。经历一年的居家办公、解封,终于在年底回归正常生活。时隔三年回老家过年,一切如故,好像疫情从没有来过。2022年对我来说是值得记忆的一年,在这一年里完成了买房这件人生大事,终…

SpringCloud学习笔记【part1】Spring Cloud Gateway网关的搭建、处理跨域问题

一、Spring Cloud Gateway 介绍 API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求。API 网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先…

macos nginx 安装/卸载,启动/重启/关闭

1.安装/卸载 在macos中使用homebrew安装 brew install nginx,卸载brew uninstall nginx。homebrew安装 brew install xx,卸载brew uninstall xx 可以直接安装nginx-full,来安装echo模块 brew install nginx-full # 如果上面安装报错,需要按…

C 程序设计教程(18)—— 数组和指针(一):数组

C 程序设计教程(18)—— 数组和指针(一):数组 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。 目…

【SpringCloud复习巩固】微服务+Eureka+Ribbon

文章中需要用到的代码和sql 链接:https://pan.baidu.com/s/1_1Qqro7wR5zi7Ds8Bgmf-g 提取码:vxzg 目录 一.微服务 1.1单体架构 1.2分布式架构 1.3微服务 1.4各自特点总结 1.5微服务技术对比 二.服务拆分及远程调用 三.Eureka注册中心 3.1服务调用…

KVM虚拟化之小型虚拟机kvmtool的使用

根据 kvmtool github仓库文档的描述,类似于QEMU,kvmtool是一个承载KVM Guest OS的 host os用户态虚拟机,作为一个纯的完全虚拟化的工具,它不需要修改guest os即可运行, 不过,由于KVM基于CPU的硬件虚拟化支持&#xff0…

【JavaGuide面试总结】Java集合篇·上

【JavaGuide面试总结】Java集合篇上1.简单说说Java集合框架体系Collection接口Map接口2.说说 List, Set, Queue, Map 四者的区别?3.你在编程时如何选用集合?4.Collection 子接口之 ListArrayList 和 Vector 的区别?ArrayList 与 LinkedList 区别?说一说 ArrayLis…

ISIS特性与配置实例(DU比特、OL置位、Tag等)

2.3.0 ISIS基础命令与查询命令介绍、ISIS特性、ISIS与OSPF 本文章以ISIS的特性结合ISIS配置实例进行讲述,故篇幅会非常之大,建议电脑端上结合目录观看以免影响观感。 目录路由渗透配置路由渗透实例一、配置设备IP地址二、配置ISIS三、检查ISIS&#xff0…

ProGet 22.0 Enterprise Crack by Xacker

ProGet将所有包和 Docker 容器放在一个地方,扫描漏洞,并控制谁可以访问不同的提要。ProGet 可在数分钟内完成安装,并且拥有功能强大的免费版本,其中包含许多您可以在准备就绪后进行升级的强大功能。 特色用例 私人 NuGet 服务器 …

Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0

Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0 启动Springboot项目时候报错 java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Maven/apache-maven-3.6.3/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/o…

Linux动静态库

目录 一、库的概念与类型 二、库的组成文件(.o) 2.1 初始源代码(.c .h) 2.2 可重定位二进制文件(.o) 2.3 库文件(lib) 与 头文件(.h) 三、实现静态库(.a) 3.1 建立静态库文件 3.2 交付库 3.3 编译器在编译链接中的作用 3.4 使用第三方静态库与头文件 3.…