⌈ 传知代码 ⌋ 基于曲率的图重新布线

💛前情提要💛

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~


📌导航小助手📌

  • 💡本章重点
  • 🍞一. 概述
  • 🍞二. 核心算法
  • 🍞三. 关键代码
  • 🍞四. 运行方法
  • 🍞五.运行结果
  • 🫓总结


💡本章重点

  • 基于曲率的图重新布线

🍞一. 概述

论文链接

Topping, Jake, et al. “Understanding over-squashing and bottlenecks on graphs via curvature.” arXiv preprint arXiv:2111.14522 (2021).

大多数图神经网络(Graph Neural Networks, GNN)使用消息传递范式,其中节点特征在输入图上传播。最近的研究表明,来自远距离结点的信息流失真,是限制依赖远程交互的任务的消息传递效率的重要因素。

该限制被称为“过度挤压”(Over-squashing)。过度挤压的原因在于,图中每个结点的k跳邻居的数量随着k的增长而指数级增长,远距离结点的信息难以压缩到固定大小的结点特征中,从而导致信息丢失。本文提供了对GNN中过度挤压现象的精确描述,并分析了它是如何从图中的瓶颈产生的。

为此,本文引入了一种新的基于边的组合曲率,并证明了负曲率边是导致过度挤压问题的原因。本文还提出了一种基于曲率的图重现布线方法,以缓解过度挤压问题。

在这里插入图片描述
上图:曲面上曲率的演变可能会减少瓶颈。

下图:本文展示了如何在图上做同样的事情来提高GNN的性能。蓝色代表负曲率;红色代表正曲率。


🍞二. 核心算法

算法说明

在这里插入图片描述

  1. 黎曼几何中的一个自然对象是里奇曲率(Ricci curvature),这是一种决定测地线色散的双线性形式,即从“相同”速度的附近点开始的测地线是否保持平行(欧几里得空间)、收敛(球面空间)或发散(双曲空间)。
  2. 算法在每次迭代中都会添加一条边来支持图中最负曲率的边,然后移除最正曲率的边。
  3. 原始输入图和重新布线图之间的图编辑距离以max number of iterations 的 2 倍为界。
  4. 移除曲率最大的边是为了平衡曲率和结点的度的分布。

🍞三. 关键代码

def sdrf(data, max_iterations=10, remove_edges=True, remove_bound=0.5, tau=1.0, undirected=True):# 1. 将torch_geometric.data.Data实例转化为networkx.DiGraph实例,方便后续加边、减边操作G = to_networkx(data)if undirected:G = G.to_undirected()# 2. 获取图信息(邻接矩阵,边的个数)edge_index = data.edge_indexif undirected:edge_index = to_undirected(edge_index)A = to_dense_adj(remove_self_loops(edge_index)[0])[0]  # 邻接矩阵A = A.cuda()N = A.shape[0]  # 边的个数C = torch.zeros(N, N).cuda()  # 初始化Ricci曲率矩阵,即Ric(i, j)# 3. 进入图的加边、减边循环过程,其中max_iterations为最大迭代次数for x in range(max_iterations):can_add = True# 3.1 根据BFC算法更新Ricci曲率矩阵balanced_forman_curvature(A, C=C)ix_min = C.argmin().item()x = ix_min // Ny = ix_min % N# 3.2 计算可加边的候选集candidatesif undirected:x_neighbors = list(G.neighbors(x)) + [x]y_neighbors = list(G.neighbors(y)) + [y]else:x_neighbors = list(G.successors(x)) + [x]y_neighbors = list(G.predecessors(y)) + [y]candidates = []for i in x_neighbors:for j in y_neighbors:if (i != j) and (not G.has_edge(i, j)):candidates.append((i, j))# 3.3 根据边添加之后对Ricci曲率的提升程度,从候选集中选择边k~l进行添加if len(candidates):D = balanced_forman_post_delta(A, x, y, x_neighbors, y_neighbors)improvements = []for i, j in candidates:improvements.append((D - C[x, y])[x_neighbors.index(i), y_neighbors.index(j)].item())k, l = candidates[np.random.choice(range(len(candidates)), p=softmax(np.array(improvements), tau=tau))]G.add_edge(k, l)  # 添加边if undirected:A[k, l] = A[l, k] = 1else:A[k, l] = 1else:can_add = Falseif not remove_edges:break# 3.4 移除具有最大Ricci曲率的边,其中remove_bound为曲率最大上界if remove_edges:ix_max = C.argmax().item()x = ix_max // Ny = ix_max % Nif C[x, y] > remove_bound:G.remove_edge(x, y)  # 移除边if undirected:A[x, y] = A[y, x] = 0else:A[x, y] = 0else:if can_add is False:break# 4. 将networkx.DiGraph实例转化为torch_geometric.data.Data实例,返回return from_networkx(G)

🍞四. 运行方法

数据集

支持 Cora, Citeseer, Pubmed, Cornell, Texas, Wisconsin

脚本自动下载。如不能请参考 geom-gcn

配置文件

不同数据集的配置文件位于./configs/。运行之前需要修改数据集根目录和输出目录:

output_dir: $OUTPUT_DIR$
data:root: $DATA_ROOT$

训练和测试

# train on train data splits
python train.py --config-file configs/*.yaml
# test on val and test data splits
python eval.py --config-file configs/*.yaml
search_dir=configs
for file in "$search_dir"/*
dopython train.py --config-file $filepython eval.py --config-file $file
done

🍞五.运行结果

运行日志、模型权重、重新布线结果保存在 $OUTPUT_DIR/$DATASET_NAME/

测试结果(accuracy)保存在 ./result.csv

在这里插入图片描述


🫓总结

综上,我们基本了解了“一项全新的技术啦” 🍭 ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

【传知科技 – 了解更多新知识】

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

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

相关文章

扩散模型Stable Diffusion

扩散模型构成 Text Encoder(CLIPText) Clip Text为文本编码器。以77 token为输入,输出为77 token 嵌入向量,每个向量有768维度。 Diffusion(UNetScheduler) 在潜在空间中逐步处理扩散信息。以文本嵌入向量和由噪声组成的起始多维数组为输入&#xff0c…

1909java内部知识管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java内部知识管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开 发环境为TOMCAT7.0,Myeclipse8.5开发&…

近邻算法的详细介绍

近邻算法(Nearest Neighbor Algorithm),通常称为 k-近邻算法(k-Nearest Neighbors,简称 k-NN),是一种基本的分类和回归方法。它的工作原理非常直观:通过测量不同特征值之间的距离来进…

Matlab速通知识点(半小时速通)

#跟着网上课程学习了matlab的基础用法,在这里给大家整合出来,形成知识点的形式,以便大家查阅或者学习,知识点全,有注解~ %% a[1,2,3;4,5,6;7,8,9];%矩阵写法b1:1:10;%开始:步长:结束c1:10;%遇上…

热题系列章节5

169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出:…

数据仓库核心:事实表深度解析与设计指南

文章目录 1. 引言1.1基本概念1.2 事实表定义 2. 设计原则2.1 原则一:全面覆盖业务相关事实2.2 原则二:精选与业务过程紧密相关的事实2.3 原则三:拆分不可加事实为可加度量2.4 原则四:明确声明事实表的粒度2.5 原则五:避…

数据结构(4):串

只需要掌握小题,在考纲中占比不大 1 串的定义 1.1 基本定义 字符串 数据结构三要数:逻辑结构、存储结构、运算 子串必须是连续的! 空格也是一个字符!每个空格字符占1B 1.2 串和线性表 2 串的基本操作 比值的操作!&…

rocketmq做了哪些事情来提高性能

在中间件和消息队列的领域内,Apache RocketMQ是一个高性能、高吞吐量的分布式消息中间件,它被广泛应用于处理大规模消息服务的构建中。为了达到这样的性能标准,RocketMQ不仅在架构设计上进行了优化,还在代码层面进行了大量的重构和…

走的人多了,也便成了路(七)

好多年前就听到这样的说法:一流的企业做标准,二流的企业做品牌,三流的企业做产品。 在通信行业待久了,经历了移动通信技术标准的发展历程,体会到很多事情没有那么神秘,甚至由于一些偶然因素的出现&#xff…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台,它提供以下关键功能: HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

Flutter金融理财类APP常用的第三方库总汇

Flutter金融理财类APP常用的第三方库总汇 金融理财类APP在现代社会中扮演着越来越重要的角色,为用户提供了便捷的金融服务和投资渠道。Flutter作为一个高效的跨平台移动应用开发框架,能够帮助开发者快速构建这类应用。本文将汇总Flutter金融理财类APP开…

Java中的动态代理机制及其应用

动态代理(Dynamic Proxy)是Java语言中一种强大的特性,允许在运行时动态地创建代理类。代理类可以拦截对目标对象的所有方法调用,并在调用前后执行一些额外的逻辑。动态代理在Java的许多框架中得到了广泛应用,比如Spring AOP(面向切面编程)、Hibernate、MyBatis等。本文将…

数据中心基础设施智能运维

数据中心基础设施智能运维 随着科技的飞速发展,数据中心作为信息社会的核心基础设施,扮演着越来越重要的角色。然而,传统的运维模式由于对人力资源的高度依赖,已无法满足现代数据中心对高效、安全和可持续运维的要求。华为的《数…

vue实现stompjs+websocket和后端通信(二)

vue项目的搭建在这里就不说了,网上有很多教程。大家自行百度。前端使用stompwebsocket有很多的实现版本。这里只讲stomp/stompjs方式实现。 导入 使用stomp/stompjs需要执行安装命令: import Stomp from stomp/stompjs; 然后在组件中引入即可&#xff…

探索国内大模型AIGC产品

​ 人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗…

2. keepalived结合LVS配合使用

keepalived结合LVS配合使用 1、后端nfs存储提供项目文件2、后端nfs上集中安装MySQL,共用数据库3、业务服务器通过LNMP正常部署wordpress博客,客户端通过DNS解析可正常访问4、所有业务服务器上修改arp参数、配置VIP5、配置keepalived实现LVS高可用5.1 kee…

web前端电影简介标签:深度解析与创意应用

web前端电影简介标签:深度解析与创意应用 在web前端开发中,电影简介标签的设计与实现是一项既具挑战性又充满创意的任务。这些标签不仅需要准确传达电影的核心信息,还要通过精美的设计和交互效果吸引用户的眼球。本文将从四个方面、五个方面…

Python私教张大鹏 Vue3整合AntDesignVue之Dropdown 下拉菜单

基本用法 核心代码&#xff1a; <template><a-dropdown><a class"ant-dropdown-link" click.prevent>Hover me<DownOutlined /></a><template #overlay><a-menu><a-menu-item><a href"javascript:;"…

软件心学格物致知篇(7)软件开发文档写什么

软件心学格物致知篇(7)软件开发文档写什么 前言 当今约束大家生产力的有哪些因素&#xff1f;是编程语言&#xff1f;开发框架&#xff1f;开发IDE&#xff1f;还是自身迫切需要更高水平的技能&#xff1f; 好像上面的每一项技术都在不断发展&#xff0c;也在不断的为我们生…

Spring Event如何优雅实现系统业务解耦

Spring Event如何优雅实现系统业务解耦 一、介绍 Spring事件&#xff08;Spring Event&#xff09;是Spring框架的一项功能&#xff0c;它允许不同组件之间通过发布-订阅机制进行解耦的通信。在Spring中&#xff0c;事件是表示应用程序中特定事件的对象&#xff0c;例如用户注…