Self-supervised Graph Learning for Recommendation(SGL)

news2024/11/15 18:40:14

Code:GitHub - wujcan/SGL-Torch: SGL PyTorch version(作者给出了Pytorch和Tensorflow两个版本)

本文提出了一种应用于用户-物品二分图推荐系统图自监督学习框架。核心的思想是,对用户-物品二部图做数据增强(本文提出了三种方式:节点丢弃(nd))、边丢弃(ed),随机游走(rw),增强后的图可以看做原始图的子视图;在子视图上使用任意的图卷积操作,如LightGCN来提取结点的表征,对于同一个结点,多个视图就能形成多种表征;然后借鉴对比学习[5]的思路,构造自监督学习任务:最大化同一个结点不同视图表征之间的相似性,最小化不同结点表征之间的相似性;最后对比学习自监督任务推荐系统的监督学习任务联合起来,构成多任务学习的范式,具体如下图所示。 

 有上图可以看到,本文可大致分为两个部分:自监督学习部分、无监督学习部分(对比学习部分)

一、自监督学习

由于此部分不是本文重点,所以形式上很简单:lightgcn+bpr:

 

Lightgcn论文中给出的矩阵形式中的公式: 

adj_mat = tmp_adj + tmp_adj.T

# normalize adjcency matrix
rowsum = np.array(adj_mat.sum(1))
d_inv = np.power(rowsum, -0.5).flatten()
d_inv[np.isinf(d_inv)] = 0.
d_mat_inv = sp.diags(d_inv)
norm_adj_tmp = d_mat_inv.dot(adj_mat)
adj_matrix = norm_adj_tmp.dot(d_mat_inv)

return adj_matrix

 二、无监督学习

1、节点/边丢弃

论文对这一部分描述的非常简洁,但也很抽象。下面公式中M^{'},M^{''} ,M_1,M_2 masking vector(0/1组成的向量),\nu\varepsilon 分别是点集和边集,字面意思就是:通过masking vector和点集/边集合坐元素积,0元素对应位置上的点/边被消掉。但代码是通过采样方式实现的,详情建议看原码:

M^{'},M^{''}\ \epsilon\ \{0,1\}^{|V|} 

 M_1,M_2\ \epsilon\ \{0,1\}^{|V|}

if is_subgraph and self.ssl_ratio > 0:
    if aug_type == 'nd':
       drop_user_idx = randint_choice(self.num_users, size=self.num_users * self.ssl_ratio, replace=False)
       drop_item_idx = randint_choice(self.num_items, size=self.num_items * self.ssl_ratio, replace=False)
       indicator_user = np.ones(self.num_users, dtype=np.float32)
       indicator_item = np.ones(self.num_items, dtype=np.float32)
       indicator_user[drop_user_idx] = 0.
       indicator_item[drop_item_idx] = 0.
       diag_indicator_user = sp.diags(indicator_user)
       diag_indicator_item = sp.diags(indicator_item)
       R = sp.csr_matrix(
       (np.ones_like(users_np, dtype=np.float32), (users_np, items_np)), 
       shape=(self.num_users, self.num_items))
       R_prime = diag_indicator_user.dot(R).dot(diag_indicator_item)
       (user_np_keep, item_np_keep) = R_prime.nonzero()
       ratings_keep = R_prime.data
       tmp_adj = sp.csr_matrix((ratings_keep, (user_np_keep, item_np_keep+self.num_users)), shape=(n_nodes, n_nodes))

2、随机游走

以上两个操作生成了一个在所有图卷积层上共享的子图。为了探索更强能力,我们考虑为不同的层分配不同的子图。这可以看作是为每个节点构建一个随机游走的单独子图。

The above two operators generate a subgraph shared across all the graph convolution layers. To explore higher capability, we consider assigning different layers with different subgraphs. This can be seen as constructing an individual subgraph for each node with random walk

这是论文中对着一部分的描述, 看完以后是不是很蒙?那我们只能看代码了。

从下图代码中可以看到,'nd','ed'中生成了两张子图(sub_graph1,sub_graph2),而else也就是rw生成的是两个个子图列表并且每个子图列表中子图的数量是等于n_layers(GCN中卷积蹭的数量)

 下面是消息传递的代码。norm_adj是由上方子图得到的临接矩阵。if是rw对应的代码(由上图可知rw数据增强得到的是两个子图列表),else里是nd和ed对应的代码,可以看到rw方法,GCN做消息传递时候,每层都是在不同子图上进行的(norm_adj[k]),而ed方法做GCN时是在同一个子图上进行的(norm_adj)

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

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

相关文章

ActiveMQ一文解读

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。 目前在生产环境中使用较多的消息队列有 ActiveMQ、RabbitMQ、ZeroM…

42. 会话划分问题

文章目录 题目需求思路一实现一题目来源 题目需求 现有页面浏览记录表(page_view_events)如下,每行数据代表:每个用户的每次页面访问记录。 规定若同一用户的相邻两次访问记录时间间隔小于60s,则认为两次浏览记录属于…

紧急提醒,你的计算机或许已中招,赶快进行排查

大家早上好,我是YUAN。 这几天,安全圈又曝出了一个重大漏洞。如果你的电脑使用的是技嘉-GIGABYTE主板,那么你可能已经中招了,但还不知情。 在介绍这个漏洞之前,让我们思考一个问题:如果产品经理让你实现一…

基于Selenium+Python实现自动解数独,秒变最强大脑

前言 在本文中,我将向大家介绍如何使用Python编写一个数独脚本,并实现模拟完成数独游戏的脚本。数独是一种经典的逻辑游戏,它可以帮助我们锻炼逻辑思维能力。通过编写数独脚本,我们可以使用Python语言解决数独问题,从而…

一、枚举类型——新特性(模式匹配-覆盖范围)

模式匹配会引导你逐渐使用 sealed 关键字,这有助于确保你已覆盖了所有可能传入选择器表达式的类型。不过接下来再看一个示例: SealedPatternMatch.java JDK 17 import java.util.List;sealed interface Transport { };record Bicycle(String id) impleme…

第八章:YOLO v3(渐进式改进)网络详解

(目标检测篇)系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

ruiyo-cloud-plus集成shardingsphere-proxy进行分库分表

一、什么shardingsphere-proxy Sharding-Proxy是ShardingSphere的第二个产品。 它定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL版本,它可以使用任何兼容MySQL协议的访问…

阿里云轻量应用服务器和云服务器ECS有什么区别?

阿里云服务器ECS和轻量应用服务器有什么区别?云服务器ECS是明星级云服务器,轻量应用服务器可以理解为简化版的云服务器ECS,轻量适用于单机应用,云服务器ECS适用于集群类高可用高容灾应用,阿里云百科来详细说下阿里云轻…

用栈实现队列——力扣232

题目描述 思路 class MyQueue {stack<int> inStack, outStack;void in2out(){while(!inStack.empty()){outStack.push(inStack.top());inStack.pop();}} public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if(outStack.empty()){in2out();}int x out…

etiger.vip 答案 1907最高的山

1907.最高的山 题目描述 有n座山&#xff0c;编号从1到n&#xff0c;第i座山的高度为hi&#xff0c;请问其中最高的山是哪一座&#xff1f; 输入输出格式 输入格式 第一行一个正整数n&#xff0c;表示山的数量&#xff0c;n<1000。 第二行n个正整数&#xff0c;中间由空…

四元数转换为一个旋转矩阵

#include <iostream> #include <vector> #include <Eigen/Core> #include <Eigen/Geometry> #

回调函数的应用(sqort函数)——指针进阶(三)

目录 前言 什么是回调函数&#xff1f; 回调函数的应用 qsort函数 qsort函数的使用 qsort模拟实现 模拟函数的使用 总结 前言 回调函数是一种非常常见的编程技术&#xff0c;在许多不同的编程语言和框架中都有广泛的应用。但它到底是什么&#xff0c;以及如何使用呢&#xff1…

-XX:MaxDirectMemorySize

-XX:MaxDirectMemorySize最大堆外内存大小&#xff0c;此参数的含义是当Direct ByteBuffer分配的堆外内存到达指定大小后就触发Full GC。首先可以在jdk文档中找到&#xff1a;关于MaxDirectMemorySize内存的描述&#xff1a;Sets the maximum total size (in bytes) of the New…

02_06内核cpu信息及内存布局及堆管理及内存使用情况

linux_cpu_大致信息查看 因为需要知道当前linux cpu是多少位的,才能知道内核空间的分布 64位Linux-般使用48位来表示虚拟地址空间&#xff0c;45位表示物理地址。通过命令: cat/proc/cpuinfo。 查看Linux内核位数和proc文件系统输出系统软硬件信息如下: 通过cat /proc/cpuinfo…

RabbitMQ笔记--消息中间件,rabbitmq安装及简单使用

1.消息中间件 消息&#xff1a;指在应用间传送的数据。 消息队列中间件&#xff1a;指利用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型&#xff0c;可以在分布式环境下扩展进程间的通…

unittest自动化测试之unittest封装方法

目录 封装方法 完整代码 总结&#xff1a; 封装方法 在编写自动化脚本的时候&#xff0c;都要求代码简介&#xff0c;上一篇unittest---unittest断言中代码重复性比较多&#xff0c;我们进行一次简单的优化&#xff08;优化方法不同&#xff0c;请勿喷&#xff09; 我们可以…

Video4linux: cannot set V4L control... 解决方案

问题描述 最近在用USB_CAM读取摄像头的时候&#xff0c;总是出现如下问题&#xff1a; 思来想去真是难受。 问题分析 在usb_cam/ config /usb_cam.yaml文件中&#xff0c;把他报错的东西加在ignore里面即可。 首先打开camera_driver.cpp文件&#xff0c;把908行的printf语句…

ARM64学习笔记---建立异常向量表(二)

源码: #include "mm.h" #include "sysregs.h".section .rodata .align 3 .globl el_string1 el_string1:.string "Booting at EL".section ".text.boot" .globl _start _start://读取mpidr_el1寄存器的值&#xff0c;该寄存器决定了…

学无止境·MySQL(4-3)(多表查询加强版-------更新版)

比4-2表中多几个数据&#xff0c;更具备普遍性 试题2&#xff08;更新加强版&#xff09;1、创建表2、找出销售部门中年纪最大的员工的姓名3、求财务部门最低工资的员工姓名4、列出每个部门收入总和高于9000的部门名称5、求工资在7500到8500元之间&#xff0c;年龄最大的人的姓…

MySql 高级-0706

1. MySQL 架构 1.1 MySQL 简介 mysql内核 sql优化攻城狮 mysql服务器的优化 各种参数常量设定 查询语句优化 主从复制 软硬件升级 容灾备份 sql编程 1.2 MySQL逻辑架构介绍 1.2.1第1层:连接层 ** 系统(客户端)访问 MySQL 服务器前&#xff0c;做的第一件事就是建立 TCP 连接…