当前位置: 首页 > news >正文

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析


原文:https://arxiv.org/pdf/2002.02126.pdf

源码:伯乐工具箱

LightGCN架构图

输入数据源(图节点仅仅使用了用户或者物品的ID进行模型搭建):

  • ml-1m.inter
  • ml-1m.item
  • ml-1m.user

GCN聚合消息需要定义节点特征以及边

1 节点

节点特征(是需要经过训练得到合适的embedding):得到所有节点特征all_embeddings(9748(6041+3707)*64)

#定义user嵌入:6041*64
self.user_embedding = torch.nn.Embedding(num_embeddings=self.n_users, embedding_dim=self.latent_dim)
#定义item嵌入:3707*64
self.item_embedding = torch.nn.Embedding(num_embeddings=self.n_items, embedding_dim=self.latent_dim)
user_embeddings = self.user_embedding.weight
item_embeddings = self.item_embedding.weight
#进行组合得到:9748(6041+3707)*64
all_embeddings = torch.cat([user_embeddings, item_embeddings], dim=0)

2 边

得到所有边edge_index(1610886-1) 以及权重 edge_weight(1610886-1)

#根据.iter交互文件,获取user_id那一列作为row(805443*1)
row = self.inter_feat[self.uid_field]
#根据.iter交互文件,获取item_id那一列作为col(计数id需要加self.user_num)(805443*1)
col = self.inter_feat[self.iid_field] + self.user_num
edge_index1 = torch.stack([row, col])
edge_index2 = torch.stack([col, row])
#得到所有边矩阵2*1610886(805443+805443)
# row col //因为边是双向的
# col row 
edge_index = torch.cat([edge_index1, edge_index2], dim=1)
# 获得每个节点的度(节点的连边)
deg = degree(edge_index[0], self.user_num + self.item_num)
#对于每个节点,如果其度数为 $0$,则将其规范化因子设为 $1$,否则将其规范化因子设为 $1/\sqrt{\text{degree}}$。最终,得到的 #norm_deg 张量表示了每个节点的规范化因子。
norm_deg = 1. / torch.sqrt(torch.where(deg == 0, torch.ones([1]), deg))
#为每条边计算一个权重,该权重等于该边两个节点的规范化因子之积。(1610886*1)
edge_weight = norm_deg[edge_index[0]] * norm_deg[edge_index[1]]

3 GCN聚合

for layer_idx in range(self.n_layers):all_embeddings = self.gcn_conv(all_embeddings, self.edge_index, self.edge_weight)embeddings_list.append(all_embeddings)
#多轮嵌入求均值
lightgcn_all_embeddings = torch.stack(embeddings_list, dim=1)
lightgcn_all_embeddings = torch.mean(lightgcn_all_embeddings, dim=1)
#获得user和item节点的最终嵌入表示
user_all_embeddings, item_all_embeddings = torch.split(lightgcn_all_embeddings, [self.n_users, self.n_items])

self.propagate(edge_index, x=x, edge_weight=edge_weight) 是 PyTorch Geometric(简称 PyG)库中定义的一个函数。该函数的作用是对输入的节点特征矩阵 x 进行消息传递,更新节点特征矩阵,并返回更新后的节点特征矩阵。

其中,edge_index 是一个形状为 2×E2 \times E2×E 的张量,表示图中所有边的起始节点和结束节点的编号,EEE 表示边的数量;x 是一个形状为 N×FN \times FN×F 的节点特征矩阵,表示图中所有 NNN 个节点的特征,FFF 表示每个节点的特征向量的维度;edge_weight 是一个形状为 EEE 的张量,表示图中每条边的权重。

在该函数中,消息传递的方式是通过定义一个 message 函数和一个 update 函数来实现的。message 函数的作用是将源节点的特征和边权重作为输入,计算出每条边传递的消息;update 函数的作用是将每个节点收到的消息进行聚合,并更新节点的特征。

具体来说,该函数中的 propagate 函数会对输入的 xedge_weight 执行消息传递,按照以下步骤进行:

  1. 根据输入的 edge_indexedge_weight 构造一个稀疏权重矩阵 edge_index,形状为 N×NN \times NN×N,其中 NNN 表示节点数量,矩阵中的每个元素表示一条边的权重。
  2. 调用 message 函数,将源节点的特征和边权重作为输入,计算出每条边传递的消息。
  3. 将每个节点收到的消息进行聚合,并更新节点的特征。具体来说,对于每个节点 iii,将其所有邻居节点 jjj 的消息按照一定的方式聚合起来,得到一个新的特征向量,用于更新节点 iii 的特征。
  4. 返回更新后的节点特征矩阵。

在实际应用中,propagate 函数通常会被多次调用,用于实现多轮消息传递,并最终得到图中所有节点的特征表示。

4 推荐任务

#获得正例和负例的各自embedding
u_embeddings = user_all_embeddings[user]
pos_embeddings = item_all_embeddings[pos_item]
neg_embeddings = item_all_embeddings[neg_item]# calculate BPR Loss
pos_scores = torch.mul(u_embeddings, pos_embeddings).sum(dim=1)
neg_scores = torch.mul(u_embeddings, neg_embeddings).sum(dim=1)
mf_loss = self.mf_loss(pos_scores, neg_scores)# calculate regularization Loss
u_ego_embeddings = self.user_embedding(user)
pos_ego_embeddings = self.item_embedding(pos_item)
neg_ego_embeddings = self.item_embedding(neg_item)reg_loss = self.reg_loss(u_ego_embeddings, pos_ego_embeddings, neg_ego_embeddings, require_pow=self.require_pow)
loss = mf_loss + self.reg_weight * reg_loss

5 实验

  • 和NGCF进行实验对比:
  • 和最优模型进行对比:NGCF、Mult-VAE、GRMF
  • 消融实验:证明了非线性激活和特征转换这些GCN的结构在推荐系统中并不适用,这很可能是因为推荐系统中每个图节点仅仅使用了用户或者物品的ID进行模型搭建和训练。

相关文章:

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助,欢迎关注我的微信公众号 “码农的科研笔记”,了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 原文&…...

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common目录解析

文章目录1 框架工具说明2 技术栈说明3 框架截图4 源码解析/common目录4.1 common/baseinfo.py4.2 common/creenShot.py4.3 common/logOut.py4.4 common/reportOut.py4.5 common/sendMail.py注: 1、本文为本站首发,他用请联系作者并注明出处,谢…...

c++提高篇——queque容器

一、queque容器基本概念 Queue是一种先进先出(FIFO)的教据结构,它有两个出口 队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据。 queque容器可以形象化为生活中…...

MyBatis-XML映射文件详解

一、XML 映射器 1.概述 使用 xml 文件去配置 SQL 代码,比传统的 jdbc 简单方便,能够少写代码,减少使用成本,提高工作效率。 1.1SQL 映射文件中的顶级元素 cache – 该命名空间的缓存配置。 cache-ref – 引用其它命名空间的缓…...

基于Java+SpringBoot+Vue+Uniapp前后端分离健身预约系统设计与实现

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…...

webstom找不到vue全局组件

我真多服气,引入了自动组件注册 // 自动引入组建import { ElementPlusResolver } from unplugin-vue-components/resolversComponents({directoryAsNamespace: true,resolvers: [ElementPlusResolver()]}),生成了 components.d.ts 但是我在webstom中定义了标签 除非…...

ESP32设备驱动-内置霍尔磁力传感器数据读取

内置霍尔磁力传感器数据读取 文章目录 内置霍尔磁力传感器数据读取1、ESP32霍尔磁力传感器介绍2、软件准备3、硬件准备4、读取霍尔磁力传感值5、运行结果ESP32开发板具有内置霍尔效应传感器,可检测周围磁场的变化。本文将介绍如何在Arduino IDE中读取ESP32霍尔效应传感器的数据…...

2023面试准备之--mysql

文章目录mysql存储引擎索引聚簇索引和非聚簇索引事务锁MVCC机制(类似于copy on write)主从复制为什么要主从同步?怎么处理mysql的慢查询?mysql clint ---->server ----> 存储引擎 存储引擎 Innodb 是MySQL5.5版本及之后默…...

yolov5源码解读--训练策略

yolov5源码解读--训练策略超参数解读命令行参数train模型迭代超参数解读 hyp.scratch.yaml lr0: 0.0032 初始学习率 lrf: 0.12 使用余弦函数动态降低学习率(lr0*lrf) momentum: 0.843 动量 weight_decay: 0.00036 权重衰减项 warmup_epochs: 2.0 预热(…...

基于Django的员工管理系统

目录 一、新建项目 二、创建app 三、设计表结构 四、在MySQL中生成表 五、静态文件管理 六、添加页面 七、模板的继承 一、新建项目 django-admin startproject 员工管理系统 二、创建app startapp app01 三、设计表结构 app01/migrations/models.py from django.db impo…...

企业数智化转型在即,看看低代码软件公司如何做!

在信息爆炸的现代社会中,利用先进技术为企业提升办公协作效率,是一件事半功倍的事。当前,数字化转型升级已经是发展趋势,不少企业已经在朝着数智化转型方向迈进。作为一家低代码软件公司,流辰信息看到了市场发展前景&a…...

如何将pdf版的文书文字提取出来?

//在线工具地址https://ocr.bytedance.zj.cn/image/ImageText在当今信息爆炸的时代,图文并茂已经成为了一个广告宣传的常用方式。然而,图片中的文字信息往往难以获取,尤其对于那些需要快速获取信息的人们来说,阅读图片中的文字会是…...

设计模式——工厂模式

工厂模式 1.需求 抽奖活动 新用户注册即参与抽奖&#xff0c;奖品为&#xff1a;1.优惠券&#xff0c;2.优酷会员&#xff0c;3.京东卡 2.无模式 public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType awardInfo.getAward…...

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…...

设计模式浅谈

什么是设计模式 设计模式是一种软件设计的思想。是在软件开发过程中&#xff0c;经过验证的、用于解决在特定环境下重复出现的、特定问题的解决方案。 设计模式的设计原则 原文链接&#xff1a;https://blog.csdn.net/qq_43471489/article/details/124067150 设计原则 1、…...

【kubernetes】使用crictl对k8s节点进行调试

crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 可以Github上下载最新的发布版本: https://github.com/kubernetes-sigs/cri-tools/releases 包名大小发布日期...

数字经济讨论题

自2001年以来&#xff0c;Alphabet&#xff08;Google&#xff09;已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…...

gcc/g++、动静态库、make/makefile

目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言&#xff0c;使用gcc或者g并没有什么区别。而对于cpp文件&#xff0c;在预处理、编译、汇编这三部分&#xff0c;…...

北京博奥智源,浅谈图书馆的馆情展示系统细则

功能特点&#xff1a; 1、支持智慧大屏的定制&#xff0c;内置精美的主题模板。 2、提供丰富的数据模块&#xff0c;可通过拖拽自由组合&#xff0c;配置灵活。 3、支持屏幕分辨率自定义&#xff0c;自适应屏幕大小。 4、支持背景颜色的更换&#xff0c;同时可上传图片更换背景…...

Docker----------day-mysql8主从复制

1.安装master 1.1拉取镜像 docker search mysql docker pull mysql mkdir -p /home/mysql8/data mkdir -p /home/mysql8/conf mkdir -p /home/mysql8/log1.2 2.启动交互式添加容器数据卷 #不添加容器数据卷 docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASS…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...