GNN图神经网络原理解析

news2025/1/16 0:41:32

一、GNN基本概念

1. 图的基本组成

图神经网络的核心就是进行图模型搭建,图是由点和边组成的。在计算机处理时,通常将数据以向量的形式进行存储。因此,在存储图时,就会有点的向量,点与点之间边的向量,全局向量(描述整张图),邻接矩阵(记录哪些点之间存在关联)等。
既然输入给计算机的是向量格式,那么embedding也是GNN中很重要的环节,即将元素进行编码
在这里插入图片描述

2. 邻接矩阵

邻接矩阵记录了点与点之间是否存在关联,例如:0表示无关联,1表示有关联(先这样理解,后续有算法并不这样记录)。如果图模型中有5个点,那么邻接矩阵就是一个55的对称矩阵。
当然,邻接矩阵并没有严格的定义,只要能描述元素之间的关联即可,例如,输入一段文本,邻接矩阵记录了每个单词的下一个单词是什么,如下图所示:👇
在这里插入图片描述
然而,在实际任务中,我们通常并不是以N
N的格式构建邻接矩阵,因为不仅难以计算,而且矩阵是对称的,即浪费空间。一般地,邻接矩阵是 2*M 的格式,如下图中的Adjacency List,里面每个元素都是 source -> target的二元组,分别代表有向边的起点和终点。👇
在这里插入图片描述

3. 应用领域

有许多场景是无法使用传统神经网络完成的,传统的CNN、RNN、NLP等模型要求输入格式是固定的,例如图像任务要求全部的输入的shape必须是3224224等,而许多场景的格式是无法确定统一的,例如生物学中的细胞的组成等,很难套用NN module,因此GNN横空出世,给解决这类问题提出了一种新的思想。
在这里插入图片描述
GNN中最常见的三种任务分别是:(1)点(预测某个元素的性质);(2)边(元素之间的关联);(3)图(例如判定分子结构图是否存在环路)

4. Embedding & 点的更新

GNN最核心的任务就是embedding以及向量的更新【类比神经网络迭代进行parameter的更新】。GNN后续也提出了很多出色的更新点的向量的策略。下图展示了最简单的更新策略👇(例如:每次将点自身的向量 + 与之相邻的每个邻点的向量等,当然也可以在边上设置learnable参数,表征每个点对当前点的贡献程度)
在这里插入图片描述

5. 多层GNN & 邻接矩阵不变性

在CNN中,我们都知道,一般情况下,网络越深,epoch越大,精度越高(我说的一般!! 勿喷)。因此,GNN通常也喜欢使用多层GNN,但是,一定注意:我们更新的是点的向量,无论怎样更新,邻接矩阵是永远不变的,有边永远都有边。👇
在这里插入图片描述
那么问题来啦,既然每次更新都只是考虑当前点和相邻的点,没边的永远没边,为什么要做多层?看看下图,回忆回忆神经网络👇。第0层的x1和x5,在第一层并没有建立联系,即x1和x5没有任何关系,但是再往后看一层,g3就考虑到了x1和x5的特征,这也是为什么深度学习模型要深的原因之一。同样,这也是多层GNN提出的原因之一。
在这里插入图片描述

二、GCN(图卷积)

多数情况下,GCN是Semi - supervised Learning,即半监督学习,实际数据集中可能一部分点是没有标签的,在计算损失时只使用有标签的点计算损失。 接下来进入正题:

如上图所示,例如,将Graph输入进网络,在第一层依次对N个点进行更新,然后激活函数,第二层在刚才的基础上继续依次对N个点进行更新,以此类推,经过L(一般不太大,六度分割理论)层后,得到最终encoder得到每个点的编码向量结果。然后根据不同任务进行不同的处理。下面引出几个概念:👇
在这里插入图片描述
Adjacency matrix A是邻接矩阵;Matrix D是度矩阵(表征每个点有多少个邻居,一般只有对角线有元素);Feature vector X是特征矩阵,每行表示某个点的特征编码。

为什么要引出度矩阵呢?来看一种特殊的例子,如果特征向量都是正数,则如果只进行A*X(邻接矩阵 × 特征矩阵),那么一个点的邻居越多,一般得到的数值越大,即特征越明显,这显然是不合理的(你认识的人多就有钱吗,NO)。因此引出度矩阵D,起到取平均 / 归一化的作用。👇

(这段看看就行)线性代数讲过,左乘是对行操作,右乘是对列操作,先对行做归一化,再对列作归一化,这样导致每个数参与了2次归一化,太小了,因此,折中,D-1改为D-1/2
在这里插入图片描述
在这里插入图片描述

三、Graph Attention Network

先来回顾一下GNN👇
在这里插入图片描述
以节点1的特征向量的更新为例:👇
在这里插入图片描述
而Graph Attention Network的本质就是增加了Attention模块,即对于当前点来说,哪些点的贡献更大,哪些点的贡献更小,根据注意力机制获得的贡献程度进行更新。
在这里插入图片描述
那么我们如何获得边的权重呢?其中一种方式是将点1和点2的特征向量进行拼接(加入欲获取1和2之间的权重),假如shape是12N, 则构建一个2N1的可学习参数矩阵,相乘后则为权重。而获得的权重其实就是对邻接矩阵进行修改,上文提到邻接矩阵中的元素并不一定只有0和1,这里我们发现了在改进的算法中,邻接矩阵存储的是权重,因此邻接矩阵一定程度上也是可以更新的(但是有边永远还是有边,只是权重变化了)。
在这里插入图片描述
Graph Attention Network的计算流程如下:(1)获得每个点的编码向量,构建可学习参数矩阵W;(2)H*W获得重构后的特征;(3)获得边的贡献程度,即权重;(4)加权平均或其他算法,对每个点进行更新,即特征重构
在这里插入图片描述

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

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

相关文章

Acwing---1235. 付账问题

付账问题1.题目2.基本思想3.代码实现1.题目 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 nnn个人出去吃饭,他们总共消费了 SSS元。 其中第 iii 个人带了 aiaiai元。 幸运的是,所有人带的钱的总数是足够…

vue解决跨域问题-反向代理

浏览器有同源策略,限制同协议、同域名、同端口,只要有一项不一致,就是跨域。(不同源则跨域) 解决方案: 后端 、cors 、 jsonp、 反向代理 同源下:浏览器向服务器请求数据,服务器响应…

jenkins +docker+python接口自动化之docker下安装jenkins(一)

jenkins dockerpython接口自动化之docker下安装jenkins(一) 目录:导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可,完成后出…

俄罗斯方块游戏代码

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽…

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…

数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)

百度地图开发系列目录 数据可视化大屏应急管理综合指挥调度系统完整案例详解(PHP-API、Echarts、百度地图)数据可视化大屏百度地图API开发:停车场分布标注和检索静态版百度地图高级开发:map.getDistance计算多点之间的距离并输入…

元宵晚会节目预告没有岳云鹏,是不敢透露还是另有隐情

在刚刚结束的元宵节晚会上,德云社的岳云鹏,再一次参加并引起轰动,并获得了观众朋友们的一致好评。 不过有细心的网友发现,早前央视元宵晚会节目预告,并没有看到小岳岳,难道是不敢提前透露,怕公布…

TCP 三次握手和四次挥手

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录TCP 建立连接(三次握手)为啥不能是 4 次?为啥不能是 2 次?三次握手的意义:TCP 断开连接(四…

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中,除了将数据呈现后,我们往往需要为用户提供,打印,导出等能力,导出是为了存档或是二次分析,而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑, 而前端打印可…

Android Binder机制之一(简介)

目录 前言 一、Android 进程间通信方式 二、Binder架构图 三、Binder涉及角色 3.1 Binder驱动 3.2 Binder实体 3.3 Binder引用 3.4 远程服务 3.5 ServiceManager守护进程 四、涉及源码 前言 这是本人第N次看Binder 相关知识了,其实每次看都有新的收获&…

Docker搭建本地私有仓库

目录 一、本地私有仓库的优点 二、Docker搭建本地私有仓库 2.1、首先下载 registry 镜像 2.2、在 daemon.json 文件中添加私有镜像仓库地址 2.3、运行 registry 容器 2.4、Docker容器的重启策略 2.5、为镜像打标签 2.6、上传到私有仓库 2.7、私有仓库的 centos 镜像有…

Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中

Cubox是什么应用? Cubox 是一款跨平台的网络收藏工具,通过浏览器扩展、客户端、手机应用、微信转发等方式,将网页、文字、图片、语音、视频、文件等内容保存起来,再经过自动整理、标签、分类之后,就可以随时阅读、搜索…

02- pandas 数据库 (数据库)

pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …

windeployqt实现一键打包

每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…

前端如何实现将多页数据合并导出到Excel单Sheet页解决方案|内附代码

前端与数据展示 前后端分离是当前比较盛行的开发模式,它使项目的分工更加明确,后端负责处理、存储数据;前端负责显示数据.前端和后端开发人员通过接口进行数据的交换。因此前端最重要的能力是需要将数据呈现给用户后,与终端用户进行交互。 在前端拿到数…

【Linux】宝塔面板 SSL 证书安装部署

宝塔面板 SSL 证书安装部署前言证书下载宝塔配置SSL注意事项前言 前期有讲过Tomcat和Nginx分别部署SSL证书,但也有好多小伙伴们私信我说,帮忙出一期宝塔面板部署SSL证书的教程,毕竟宝塔的用户体量也是蛮大的,于是宠粉的博主&…

基于地基激光雷达数据和深度学习的Faster R-CNN的橡胶树个体分割

Paper题目:Individual Rubber T ree Segmentation Based on Ground-Based LiDAR Data and Faster R-CNN of Deep Learning Abstract 中国南方的橡胶树经常受到可能导致树体倾斜的自然干扰的影响。从扫描点云中对单个橡胶树进行准确的树冠分割是准确检索树参数的必…

前端 ES6 之 Promise 实践应用与控制反转

Promise 主要是为解决程序异步处理而生的,在现在的前端应用中无处不在,已然成为前端开发中最重要的技能点之一。它不仅解决了以前回调函数地狱嵌套的痛点,更重要的是它提供了更完整、更强大的异步解决方案。 同时 Promise 也是前端面试中必不…

玩转系统|初遇ChatGPT,我和TA的第一次约会

最近互联网圈子有一个非常火爆的话题ChatGPT,短短一周的时间就有上百万的用户,如果你不是程序员,也许会问这到底是个什么玩意?ChatGPT是什么?ChatGPT,美国“开放人工智能研究中心”研发的聊天机器人程序 [1…

CAPL(vTESTStudio) - DoIP - TCP接收_04

TCP接收 函数介绍 TcpOpen函数