图注意网络(GAT)的可视化实现详解

news2025/1/13 16:50:49

能够可视化的查看对于理解图神经网络(gnn)越来越重要,所以在这篇文章中,我将介绍传统GNN层的实现,然后展示ICLR论文“图注意力网络”中对传统GNN层的改进。

假设我们有一个表示为有向无环图(DAG)的文本文档图。文档0与文档1、2和3有一条边,为了实现可视化,这里将使用Graphbook,一个可视化的人工智能建模工具。

我们还为每个文档提供了一些节点特征。将每个文档作为单个[5] 1D文本数组放入BERT中,这样就得到了一个[5,768]形状的嵌入。

为了方便演示,我们只采用BERT输出的前8个维度作为节点特征,这样可以更容易地跟踪数据形状。这样我们就有了邻接矩阵和节点特征。

GNN层

GNN层的一般公式是,对于每个节点,我们取每个节点的所有邻居对特征求和,乘以一个权重矩阵,最后通过一个激活函数得到输出结果。所以这里创建一个以这个公式为标题的空白块,并将其传递给Adj矩阵和节点特征,我将在块中实现上面说的公式。

我们将节点特征平铺(即广播)为3D形状,也就初始的[5,8]形状的节点特征,扩展成有[5,5,8]形状,其中第0维的每个单元格都是节点特征的重复。所以现在可以把最后一个维度看作是“邻居”特征。每个节点有5个可能的邻居。

因为不能直接将节点特征从[5,8]广播到[5,5,8],我们必须首先广播到[25,8],因为在广播时,形状中的每个维度都必须大于或等于原始维度。所以得到形状的5和8部分(get_sub_arrays),然后乘以第一部分得到25,然后将它们全部连接在一起。将结果[25,8]重塑回[5,5,8],结果可以在Graphbook中验证最终2维中的每个节点特征集是相同的。

下一步就是广播邻接矩阵到相同的形状。对于第i行和col j的邻接矩阵中的每一个1,在维数[i, j]上有一行1.0的num_feat。所以在这个邻接关系中,在第0个单元格中第1、2和3行有一行num_feat 1.0(即[0,1:3,:])。

这里的实现非常简单,只需将邻接矩阵解析为十进制并从[5,5]形状广播到[5,5,8]。将这个邻接掩码与平铺节点邻居特征相乘。

我们还想在邻接矩阵中包含一个自循环,这样当对邻居特征求和时,也包括了该节点自己的节点特征。

这样就得到了每个节点的邻居特征,其中没有被一条边连接的节点(不是邻居)的特征为零。对于第0个节点,它包括节点0到3的特征。对于第三个节点,它包括第三和第四个节点。

下一步就是重塑为[25,8],使每个相邻特征都是它自己的行,并将其传递给具有所需隐藏大小的参数化线性层。这里隐藏层大小是32并保存为全局常量,以便可以重用。线性层的输出将是[25,hidden_size]。所以经过重塑就可以得到[5,5,hidden_size]。

最后对中间维度(维度索引为1)求和,对每个节点的相邻特征求和。结果是经过1层的节点嵌入集[5,hidden_size],得到了一个GNN网络。

图注意力层

图注意层关键是注意力系数,如上式所示。从本质上讲,在应用softmax之前,我们将边缘中的节点嵌入连接起来,并通过另一个线性层。

然后使用这些注意系数来计算与原始节点特征对应的特征的线性组合。

我们要做的是为每个邻居平铺每个节点的特征,然后将其与节点的邻居特征连接起来。

这里需要注意的是mask掩码需要在平铺节点特征之前交换0和1维。

这用结果仍然是一个[5,5,8]形数组,但现在[i,:,:]中的每一行都是相同的,并且对应于节点i的特征。然后我们就可以使用乘法来创建只在包含邻居时才重复的节点特征。最后就是将其与上面的GNN创建的相邻特征连接起来,生成连接的特征。

现在我们有了连接的特征,需要把它们输入到一个线性层中,所以还需要重塑回到[5,5,hidden_size],这样我们就可以在中间维度上进行softmax产生我们的注意力系数。

得到了形状为[5,5,hidden_size]的注意力系数,这实际上是在n个节点的图中每个图边嵌入一次。论文说这些应该被转置(维度交换),我们在ReLU之前已经做过了,现在我对最后一个维度进行softmax,这样它们就可以沿着隐藏的尺寸维度进行每个维度索引的标准化。

将[5,hidden_size, 5]形状乘以[5,5,8]形状得到[5,hidden_size, 8]形状。然后我们对hidden_size维度求和,最终输出[5,8],匹配我们的输入形状。这样就可以把这个层串起来多次使用。

总结

本文介绍二零单个GNN层和GAT层的可视化实现。在论文中,他们还解释了是如何扩展多头注意方法的,我们这里没有进行演示。

Graphbook是用于AI和深度学习模型开发的可视化IDE,Graphbook仍处于测试阶段,但是他却是一个很有意思的工具,通过可视化的实现,我们可以了解更多的细节。

https://avoid.overfit.cn/post/3cb8ab327fe3416d8b459ad9bc004b0d

作者:David Winer

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

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

相关文章

第72步 时间序列建模实战:单步滚动预测(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 从这一期开始,我们开始基于python构建各种机器学习和深度学习的时间序列预测模型,本质上就是调用各种模型的回归分析的属性。所以很多模型其实之前都介绍过,比如说决策树、SVM等等。 同样&#xff0…

【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

本周的工作结束&#xff0c;详述一些在项目代码中实际遇到的一些坑。 代码中遇到这样一个场景&#xff1a; 有个业务接口&#xff0c;接口返回的值是一个JSON格式的字符串&#xff0c;通过JSON解析的方式&#xff0c;解析为格式为&#xff1a; Map<Long, Map<String, O…

数据结构——时间复杂度与空间复杂度

目录 一.什么是空间复杂度与时间复杂度 1.1算法效率 1.2时间复杂度的概念 1.3空间复杂度的概念 二.如何计算常见算法的时间复杂度 2.1大O的渐近表示法 使用规则 三.如何计算常见算法的空间复杂度 3.1 大O渐近表示法 3.2 面试题——消失的数字 3.3 面试题——旋转数组 一…

ChatGPT是留学生的论文神器还是学术不端的罪魁祸首?

当今时代&#xff0c;ChatGPT无疑是大数据和人工智能的完美结合&#xff0c;成为了搜索技术的革命性创新。几秒钟&#xff0c;一篇逻辑清晰、观点鲜明、有充分论据支持的文章即可生成。这种革命性的创新在学术界掀起了巨大的浪潮&#xff0c;甚至让全球的学校开始思考&#xff…

【GAN入门】生成 AI的概念

一、说明 GAN是生成对抗网络&#xff08;Generative Adversarial Network&#xff09;的缩写&#xff0c;是一种无监督学习算法&#xff0c;由Goodfellow等人于2014年提出。GAN由一个生成器网络和一个判别器网络组成&#xff0c;通过二者之间的对抗来训练生成器网络生成与真实样…

深入了解Python数据类型及应用

Python提供了一组丰富的内置数据类型&#xff0c;使您能够在程序中处理不同类型的数据。核心数值类型包括整数、浮点数和复数。整数表示整数&#xff0c;对于精确的计数和计算非常有用。 浮点数表示具有小数精度的实数&#xff0c;这对科学和统计计算非常重要。复数将数字扩展到…

C++系列赋值运算符重载

赋值运算符重载 类的默认函数拷贝构造函数和赋值运算符 重载赋值运算符相关注意事项 类的默认函数 一个类至少有4个默认函数&#xff1a; 默认构造函数拷贝构造函数析构函数赋值运算符重载函数 拷贝构造函数和赋值运算符 拷贝构造函数是在创建类的时候调用的&#xff0c;之…

利用PCA科学确定各个指标的权重系数

背景参考: 1、提取主成分 对样本进行PCA分析,查看不同变量贡献率,确定主要的指标。我们可以通过下列代码获取需要的所有数据: import numpy as np from sklearn.decomposition import PCA# 创建一个数据 np.random.seed(0) data = np.random.random((100,5)) y = np.ra…

深入理解CI/CD流程:改变你的开发生命周期

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

投后管理系统的主要功能及开发

投后管理系统是一种用于跟踪和管理投资组合中的投资的工具&#xff0c;通常由私募股权、风险投资公司、资产管理公司和投资者使用。其主要功能包括以下内容&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

全新跑分软件GeekRUN-7问世

实测非常好用CPU跑分神器点击下载 感兴趣的可以测测你的手机跑的多少。 我的峰值是7340&#xff0c;低值是4685&#xff0c;测试时后台不能有任何APP

丙烯酸共聚聚氯乙烯树脂

声明 本文是学习GB-T 42790-2023 丙烯酸共聚聚氯乙烯树脂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了丙烯酸共聚聚氯乙烯树脂的外观、物化性能等技术要求&#xff0c;描述了相应的采样、试验方 法、检验规则、标志、包装、…

2023年中国场馆产业研究报告

第一章 行业综述 1.1 定义与分类 场馆&#xff0c;作为一个多元化和充满活力的行业&#xff0c;为人们提供了一个为不同目的而聚集的空间。无论是为了活动、表演、展览还是聚会&#xff0c;场馆都在为社区的社会、文化和经济建设做出了不可或缺的贡献。 场馆是一个为举办各类…

深入思考redis面经

1 redission分布式锁 1.1 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的 答&#xff1a;主要是为了抗住高并发问题&#xff0c;解决redis的缓存击穿问题&#xff0c;但是也能解决一定…

【算法|链表】环形链表Ⅱ

环形链表Ⅱ 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

原创 VTK 基础入门 ( 一 ) 贴纹理

纹理 这个示例先读入一幅JPEG的二维纹理图;然后定义一个纹理类vtkTexture对象&#xff0c;接着把读入的NPG图像输入到vtkTexture 里&#xff0c; 作为它即将“贴”到平面上的一个纹理图;再定义一个vtkPlaneSource对象&#xff0c;类vtkPlaneSource 可以生成一个…

Pytorch学习:torch.max(input,dim,keepdim=False)

文章目录 torch.max()dimkeepdimdim0dim1 out&#xff1a;返回命名元组 (values, indices) torch.max() torch.max(input) → Tensor&#xff1a;返回 input 张量中所有元素的最大值。 注意输入的必须是张量形式&#xff0c;输出的也为张量形式 当输入为tuple类型时&#xf…

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…

计算机组成原理之计算机系统概论、计算机的发展史、系统总线,三章开篇讲

第一章-计算机系统概论 1计算机系统简介 现代计算机的多态性 把感应器嵌入和装备到电网、铁道、桥梁、隧道、公路、建筑、供水系统、大坝、油气管道等各种物体中&#xff0c;并且被普遍连接&#xff0c;形成“物联网”&#xff0c;然后将“物联网”与现有的网络整合起来&…

无涯教程-JavaScript - ACOT函数

描述 ACOT函数以0至π之间的弧度(以弧度为单位)返回数的反正切或反余切的主值。 语法 ACOT (number)争论 Argument描述Required/OptionalNumberNumber is the cotangent of the angle you want. This must be a real number.Required Notes 要将输出从弧度转换为度, 使用D…