图神经网络 GNN

news2024/12/28 20:30:03

之前经常看到图神经网络的内容,但是一直都觉得很难,就没有继续了解,现在抽空学习了一下,简单了解GNN是个什么东西,还没有进行代码实践,随着后续的学习,会继续更新代码的内容,这里先记录一下,方便以后查阅。

图神经网络 GNN

  • 图的基本内容
    • 图的基本知识
      • 图的基本元素
      • 图的表示——邻接矩阵
      • 把一些内容表示成图
        • 图片表示成图
        • 将一句话表示成图
        • 分子结构表示成图
        • 社会人物关系表示成图
      • 图的表示——邻接表
      • 图的度和邻居
      • 结构特征、节点特征、边特征
      • 图的分类
    • 图学习的优势
    • 图学习的应用
      • 节点级别任务
      • 边级别任务
      • 图级别任务
    • 图学习算法的分类
  • 图神经网络 GNN
    • 什么是GNN
    • 图神经网络的目的
    • 最简单的GNN层
    • 通过池化信息对GNN预测
    • Passing messages between parts of the graph
    • Learning edge representations
    • 加入全局信息
    • 多层GNN的作用
  • 图卷积神经网络 GCN
    • 半监督学习
    • GCN的计算
      • 图中基本组成
      • 特征计算方法
      • 邻接矩阵的变换
    • GCN层数
  • 参考资料

图的基本内容

图的基本知识

图的基本元素

图是由一些点和一些线构成的,能表示一些实体之间的关系,图中的点就是实体,线就是实体间的关系

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

为了进一步描述每个节点、边或整个图,我们可以在图的每个部分中存储信息

在这里插入图片描述

每个顶点、边和整张图都可以用一个向量来表示,在这个例子中,顶点的向量有六个值,柱体的高矮就表示该值的大小,每条边用一个长为8的向量来表示,全局用一个长为5的向量来表示

图的表示——邻接矩阵

在这里插入图片描述

把一些内容表示成图

图片表示成图

在这里插入图片描述

将一句话表示成图

在这里插入图片描述

分子结构表示成图

在这里插入图片描述

社会人物关系表示成图

在这里插入图片描述

图的表示——邻接表

图上有四种信息:顶点的属性,边的属性,全局信息以及连接性(即为每条边连接的是哪两个顶点)。前三个信息都能用向量来表示,怎么表示连接性呢?

我们可以用邻接矩阵来表示,该矩阵会是一个方阵,但是有一些问题。这个矩阵可能会非常大而且很稀疏,在空间上效率低下,并且计算比较困难。另外将邻接矩阵的行或列的顺序进行交换不会改变其属性的。

比如下面两张图都是前面“Othello"的人物关系图,看着不一样只是因为行和列的顺序不同,但是表示的信息是一样的。这就意味着如果你设计一个神经网络,无论你用下面两张图中的哪一张,都要保证得到的结果是一样的

在这里插入图片描述

下面的示例显示了可以描述这个 4 个节点的小图的每个邻接矩阵。

在这里插入图片描述

如果既想高效的存储邻接矩阵,又想这个顺序不会影响神经网络的结果,就可以用邻接链表的方式来表示邻接矩阵

比如下方这个,顶点,边和全局信息都用标量来表示,也可以用向量,连接性用邻接链表来表示,邻接链表的数量和边的数量是一致的,第 i i i项表示的是第 i i i条边连接的两个顶点;这样表示就很高效,而且不会受到顺序的影响

在这里插入图片描述

图的度和邻居

在这里插入图片描述

结构特征、节点特征、边特征

在这里插入图片描述

图的分类

在这里插入图片描述

在这里插入图片描述

图学习的优势

在这里插入图片描述

在这里插入图片描述

图学习的应用

在这里插入图片描述

节点级别任务

前面武术班的例子,假如说两个老师决裂,根据该社交图预测学生会选择哪个老师

在这里插入图片描述

金融诈骗检测

在这里插入图片描述

目标检测

在这里插入图片描述

边级别任务

先给出一张图片,然后经过语义分割将人物给分割出来,然后预测人物间的关系;这个图中顶点已经有了,相当于是预测边的属性

在这里插入图片描述

推荐系统

在这里插入图片描述

图级别任务

在这个任务中,目标是预测图形的属性,辨别图中是否含有两个环;该任务是分类问题

在这里插入图片描述

气味识别

在这里插入图片描述

图学习算法的分类

在这里插入图片描述

图神经网络 GNN

什么是GNN

A GNN is an optimizable transformation on all attributes of the graph (nodes, edges, global-context) that preserves graph symmetries (permutation invariances).

GNN 是对图的所有属性(节点、边、全局上下文)的可优化变换,可保留图对称性(排列不变性)。

这里的GNN是用“信息传递神经网络”框架来搭建的,GNN的输入是一个图,输出也是一个图,它会对你的图的属性(点,边,全局信息)进行变换,但不会改变图的连接性,就是哪条边连接哪条顶点,这个信息是不会改变的。

无论事情整的多么复杂,我们用图神经网络的目的就是整合特征

图神经网络的目的

在这里插入图片描述

最简单的GNN层

对顶点向量、边向量和全局向量分别构造一个多层感知机(MLP),输入的大小和输出的大小是相同的,这三个MLP就组成了一个GNN的层,输入是一个图,输出也是一个图,并且连接性不变

在这里插入图片描述

满足了上文中对GNN的第一个要求,只对属性进行变换,并不改变图的结构;并且MLP是对每个向量独自作用,对样本前后顺序没有要求,所以也就满足了图的排列不变性,满足了第二个要求。

通过池化信息对GNN预测

我们已经构建了一个简单的 GNN,但是我们如何在上面描述的任务进行预测呢?

考虑最简单的情况,例如前面讲到的武术馆的那张社交图。根据那张图来预测学生最终会选择哪个老师,顶点已经用向量来表示,可以直接加一个输出为2的全连接层。

在这里插入图片描述

但是,如果顶点中没有信息,信息储存在边中,我们就需要一种收集边信息的方法,将其用作顶点预测。我们可以通过池化来完成这一步。

在这里插入图片描述

如果我们只有边特征,并且尝试预测二分类节点信息,我们可以使用池化将信息路由(或传递)到需要去的地方,模型看起来像这样

在这里插入图片描述

如果我们只有节点特征,并尝试预测二分类边信息,则模型如下所示

在这里插入图片描述

如果我们只有节点级特征,并且需要预测二分类全局属性,则需要将所有可用的节点信息收集在一起并聚合它们。这类似于 CNN 中的全局平均池层。对于边也可以进行同样的操作。

在这里插入图片描述

我们可以将最简单的GNN模型总结成如下的结构。
一张图输入,经过GNN层(实质上就是三个分别对应点、边和全局的MLP),输出一个属性已经变换但是连接性不变的图,在经过全连接层,得到输出。

在这里插入图片描述

这个结构中,我们没有利用到图各部分之间的连接性,每个部分都是单独处理的,仅仅在池化的时候用了其他部分的信息,下面将告诉大家,怎么来汇集全图信息。

Passing messages between parts of the graph

我们可以在GNN层中使用池化来感知到图形的连通性,做出更复杂的预测。可以通过passing messages来完成,通过消息传递,相邻节点或边缘传递信息并影响彼此的更新。

消息传递分为三步:

  1. 对于图中的每个节点,收集所有相邻节点嵌入(或消息)。

  2. 通过聚合函数(如sum)聚合所有消息。

  3. 所有合并的消息都通过一个更新函数传递,通常是一个学习过的神经网络。

在这里插入图片描述

消息传递可以在顶点或边之间发生,这是我们利用图形连结性的关键,我们将在GNN层中构建更详细的消息传递变体,以产生具有增强表现力和力量的GNN模型。

这让人想起标准卷积:本质上,消息传递和卷积是聚合和处理元素邻居信息以更新元素值的操作。在图形中,元素是一个节点,在图像中,元素是一个像素。但是,图中相邻节点的数量可以是可变的,这与图像中每个像素具有固定数量的相邻元素不同。

通过将消息传递GNN层堆叠在一起,节点最终可以合并来自整个图的信息

在这里插入图片描述

图中红框表示的是聚合该顶点1近邻的顶点信息,就是聚合距离该顶点为1的顶点信息。

Learning edge representations

我们的数据集并不总是包含所有类型的信息(节点、边和全局上下文)。当我们想要对节点进行预测,但我们的数据集只有边信息时,我们在上面展示了如何使用池化将信息从边传递到节点,但仅限于模型的最终预测步骤。我们可以使用消息传递在 GNN 层内的节点和边之间共享信息

先把与边连接的顶点信息池化,传递到边上,边通过更新后,再把与顶点相连接的边信息池化传递给顶点,再通过MLP进行更新。如果顶点和边向量的长度不一样,需要先通过投影到相同维度,再做传递。

在这里插入图片描述

我们更新哪些图属性以及更新它们的顺序是构建 GNN 时的一项设计决策。我们可以选择是否在边缘嵌入之前更新节点嵌入,或者反之亦然。这是一个开放的研究领域,具有多种解决方案 - 例如,我们可以以“编织”方式进行更新,其中我们有四种更新的表示形式,它们组合成新的节点和边表示形式:节点到节点(线性)、边到边(线性)、节点到边(边层)、边到节点(节点层)

在这里插入图片描述

在这里插入图片描述

加入全局信息

我们之前的消息传递,只考虑了1近邻的点,如果一个点想要了解到距离他很远的信息,这是一个问题。为此我们提出master node or context vector,这是一个虚拟的点,他可以和任何其他点或者任何边相连接,这个就是全局信息U。 U是全局信息,它可以和图中的任何信息相连接。

在汇聚顶点信息到边的时候,也会把U一起汇聚,把边信息传递给顶点的时候,也会把U一起传递;然后更新边和顶点后,将边和顶点的信息一起汇聚给U,之后做MLP更新。

在这里插入图片描述

在顶点预测中,我们可以用顶点信息、相邻顶点信息、连接边信息、全局信息中的全部或者选择其中几项,来更新顶点信息,做顶点预测;这些信息可以简单地加在一起,也可以通过其他方式汇聚在一起。

在这里插入图片描述

多层GNN的作用

层数越多,GNN的“感受野”越大,每个点考虑其他点的信息越多,考虑越全面

在这里插入图片描述

图卷积神经网络 GCN

半监督学习

GCN属于半监督学习(不需要每个节点都有标签都可以进行训练)

计算Loss时,只需要考虑有标签的节点即可。

为了减少有标签节点的Loss,其周围的点也会做相应的调整,这也是图结构的特点,因此GNN和GCN中,不需要所有节点都有标签也可以进行训练(当然至少需要一个节点有标签)

在这里插入图片描述

GCN的计算

图中基本组成

在这里插入图片描述

特征计算方法

在这里插入图片描述

邻接矩阵的变换

在这里插入图片描述

但是现在存在一个问题:一个节点的度越大,其做矩阵乘法后的值就越大(累加次数变多了),这种情况是不好的(相当于一个人认识的人越多,其的特征值就越大,这样不好)

为了解决这个问题,我们需要对度矩阵求倒数,相当于平均的感觉,对度数大的节点加以限制

在这里插入图片描述

在这里插入图片描述
上面的左乘相当于对行做了归一化操作,那么列也需要做归一化操作

在这里插入图片描述

但是又有问题了,行和列都做了归一化,那不是会存在2次归一化的情况吗(行列重叠处)

所以我们需要在度矩阵倒数那加一个0.5次方来抵消这个2次归一化的影响

在这里插入图片描述

GCN层数

图卷积也可以做多层,但是一般不做太深层,一般只做2-3层(类似于一种说法,你只需要认识6个人就可以认识全世界)

实验表明:GCN中,深层的网络结构往往不会带来更好的效果。
直观解释:我表哥认识的朋友的朋友的朋友的朋友认识市长,不代表我和市长关系就很好。

层数越多,特征表达就越发散,一般2-5层即可

在这里插入图片描述

参考资料

A Gentle Introduction to Graph Neural Networks

零基础多图详解图神经网络(GNN/GCN)【论文精读】

不愧是公认最好的【图神经网络GNN/GCN教程】,从基础到进阶再到实战,一个合集全部到位!

图神经网络7日打卡营

图神经网络简介,什么是图神经网络,GNN

【图神经网络实战】深入浅出地学习图神经网络GNN(上)

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

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

相关文章

Autosar诊断实战系列20-UDS首帧数据接收及流控帧发送代码级分析

本文框架 前言1. 长帧数据的首帧接收2. 首帧数据的处理及流控帧发送2.1 首帧数据的处理2.2 流控帧数据的发送前言 在本系列笔者将结合工作中对诊断实战部分的应用经验进一步介绍常用UDS服务的进一步探讨及开发中注意事项, Dem/Dcm/CanTp/Fim模块配置开发及注意事项,诊断与Bs…

【Redis】数据过期策略和数据淘汰策略

数据过期策略和淘汰策略 过期策略 Redis所有的数据结构都可以设置过期时间,时间一到,就会自动删除。 问题:大家都知道,Redis是单线程的,如果同一时间太多key过期,Redis删除的时间也会占用线程的处理时间…

【C++】STL详解(九)—— set、map、multiset、multimap的介绍及使用

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C学习 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C】STL…

订单型批发制造企业经营分析123个指标大全(ODOO15/16)

ODOO-ERP搭建完成之后,我们重点是帮客户建立经营分析能力,以下是针对订单型企业的经营分析指标,涵盖业务运营的监控、资产构成、利润、盈亏点计算、资产运营效率等各方面,并且持续完善​。 有些企业不重视,觉得自己企业…

基于Java的环境保护宣传管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

前端——html面试题(一)

文章目录 前言一、说说你对 html 语义化的理解。二、html的标签有哪些三、标签类型1、问题:请说说你对块级元素、行内元素、空元素的理解,它们分别都有哪些常见的标签? 总结 前言 说说对html语义化的理解html的标签标签类型 一、说说你对 ht…

基于YOLOv8的安全帽检测系统(3):DCNv3可形变卷积,基于DCNv2优化,助力行为检测 | CVPR2023 InternImage

目录 1.Yolov8介绍 2.安全帽数据集介绍 3.InternImage介绍 4.训练结果分析 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的(SOTA)模型,它建立在先前YOLO成功…

【C语言】汉诺塔 —— 详解

一、介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大焚天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大焚天命令婆罗门把圆盘从下面开始按…

java连接数据库SQL注入问题的解决

演示注入 解决方法把statement类型替换成了preparedstatement类型 其底层原理就是把用户输入的字符串转义了

java使用数据库连接池

我的jar包名字 这些包都可以去搜索,有很多小伙伴会用网盘给我们.导入jar包就是复制然后粘贴就好了

【C语言】归并排序

文章目录 一、什么是归并排序二、归并排序步骤图解三、归并排序代码实现1、递归实现2、非递归实现 四、总结 一、什么是归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列…

抖音聊天对话模板,制作一条一条冒出来的聊天对话短视频

聊天对话模板是一种非常有趣且实用的工具,它主要用于制作抖音聊天记录一条一条冒出来的视频。有了聊天对话模板,你再也不需要费心去写剧本,只需输入一些简单的文案,就能自动生成搞笑对话视频。 聊天对话工具下载: htt…

2023蓝帽杯半决赛电子取证+CTF部分题解

文章目录 电子取证123456789101112131415 CTFWeb | MyLinuxBotWeb | AirticleShareCrypto | ezrsaPwn | AdminPwn | uafmisc|排排坐吃吃果果 电子取证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CTF Web | MyLinuxBot Web | AirticleShare import requests import times reques…

【正点原子】无法打开 源 文件 “linux/time_types.h“ (dependency of “linux/ide.h“)

问题描述 在VS code中些驱动代码时显示: 检测到 #include 错误。请更新 includePath。已为此翻译单元(/home/alientek/linux/atk-mp1/Linux_Drivers/2_LED/led.c)禁用波形曲线。C/C(1696) 无法打开 源 文件 "linux/time_types.h" (dependency of "…

前端开发、后端开发与全栈开发:构建现代网站的全面视角

探讨前端开发、后端开发和全栈开发的概念和在构建现代网站和应用程序中的作用。随着技术的快速发展和市场竞争的加剧,理解和掌握这三种开发角色对于构建成功的数字产品至关重要。 一、前端开发:用户体验的核心 前端开发者主要负责构建用户与服务器交互…

JUC——原子类

1.基本类型原子操作类 AtomicInteger:整型原子类 AtomicBoolean:布尔型原子类 AtomicLong:长整型原子类 1.1常用API public final int get() //获取当前的值 public final int getAndSet(int newValue)//获取当前的值,并设置…

Linux shell编程学习笔记7:只读变量

在编程过程中,我们经常会使用到一些常量,也就是值不需要改变的变量,在许多编程语言提供了常量的定义方式,比如c/c的define MAXNUM 99999 或 const int a 7,javasccipt的const a7, 等等。 跟以上这些方法…

协议栈——连接服务器

如对方的ip和port配置信息,这里的连接是指通信前的准备工作 上一篇介绍查看套接字的命令时,可以看到很多信息,但是刚刚创建出来的套接字是什么信息都没有的,协议栈也因此不知道和谁通信; 客户端填补信息 这一步中调…

免杀对抗-DLL劫持免杀

C&Py-DLL劫持-语言-调用加载 1.使用visual studio创建项目 2.将文件名重命名为.c后缀 3.将如下加载器代码生成dll文件 加载器代码&#xff1a; #include "pch.h" #include <Windows.h> #include <stdio.h> #include <string.h>#pragma comment…