详解深度学习中的图神经网络GNN

news2024/9/21 2:47:53

引言 

图片

图神经网络GNN是深度学习的一个分支。

深度学习的四个分支对应了四种常见的数据格式,前馈神经网络FNN处理表格数据,表格数据可以是特征向量,卷积神经网络CNN处理图像数据,循环神经网络RNN处理时序数据,图神经网络GNN处理图数据。

这里的FNN指的是如下图所示的带有输入层,隐藏层,输出层的网络。

图片

但这四种对应关系并不是一成不变。

如果将图像拉直成向量,同样可以用FNN来处理。

声音文本这类时序数据,用RNN类型的网络最适合,但如果你把一个句子当作一个1*N的矩阵,那就可以用CNN处理了,只不过,CNN需要堆叠多个层来抓取时序数据中的上下文信息,这在图像领域被称为感受野。

注意:虽然可以通过一定的技巧把句子表示成矩阵然后用CNN处理,但从本质上来说,CNN还是不如RNN更适合处理时序数据。

如果将图像划分成patch,这些pathces组成序列,同样也可以用Transformer处理,这就是Vision Transformer:ViT。

而今天要讲的GNN,既能处理表格数据,又能处理图像,文本。

更准确地说,只要能表示成GNN兼容的图数据结构就能用GNN处理。

今天的文章来自distill发布的一篇博文:A Gentle Introduction to Graph Neural Networks。

网址:https://distill.pub/2021/gnn-intro/B站沐神视频讲解:https://www.bilibili.com/video/BV1iT4y1d7zP/?spm_id_from=333.999.0.0

这篇文章写的非常好,亮点是不光有交互式图表,还有PlayGround,可见作者是下了一番功夫的。

先科普一下什么是Playground?

Playground通常指在机器学习和人工智能领域用来交互式体验和可视化AI模型的一种系统或平台。

下面展示两个AI Playground。

图片

https://catalog.ngc.nvidia.com/orgs/nvidia/teams/playground/models/clip

图片

https://catalog.ngc.nvidia.com/orgs/nvidia/teams/playground/models/codellama

NVIDIA NGC或者Hugging face上有更多好玩的AI Playground,大家可以亲自去体验一下。https://huggingface.co/

https://catalog.ngc.nvidia.com/

A Gentle Introduction to Graph Neural Networks

https://distill.pub/2021/gnn-intro/

但我不会将上面的文章原样照搬过来,而是进行概括性的总结,大家一定一定去阅读原文,因为原文里有大量的交互式图表和Playground,能加速对GNN的理解。

今天的主角是GNN,而GNN处理的对象是图Graph。跟其它神经网络一样,在其出现之前,都有传统的方法来处理对应的数据结构。

但是在数据量和算力的加持下,为了完成更复杂的任务,对应的神经网络应运而生,GNN也是如此。

后续内容主要分为四部分

1.什么样的数据可以很自然的表示成图

2.图与其它类型数据的不同之处以及如何应对这种不同

3.构建一个GNN

4.构建一个Playground在真实数据上进行训练

什么是图?

图是由节点和边组成的,用于表示对象之间关系的数据结构。

图也分为有向图无向图,例如,社交媒体中,如果互相关注了则是无向图,如果像B站这样,我关注了你,但你并没有关注我,则是有向图。

图片

图片

节点有自己的属性,边有自己的属性,整个图也有自己的属性,如上图,属性可以用标量或者向量表示。向量大小可以不一致。

前面已经透漏了GNN可以处理图像和文本,那么图像和文本就可以表示成图。

先透露一下计算机如何存储图,一种是邻接矩阵,一种是邻接表

图像的每个像素即是一个节点,节点的属性自然就是RGB值,相邻像素之间用一条边来表示相邻关系,这里用邻接矩阵来表示连接性。

图片

同理,一个句子中每个字符,每个单词,每个Token都可以看作是一个节点,相邻节点之间可以用一条有向边相连,这就构成了一个有向图。

图片

除此之外,还有很多其它数据可以表示成图。

分子由两个或多个原子通过共用电子对构成化学键而连接成一个整体,分子之间不同的连接方式构成了不同的物质。

图片

社会是一个大家庭,所有成员和之间的关系构成了一个复杂的社交网络。

图片

如果能够充分利用这个网络,就能发挥巨大价值,例如,知识图谱,推荐系统。

引用关系也可以组织成图,例如,维基百科中每个网页都会列出引用资料。

好了,到此我们已经能够把很多事物表示成图的形式,这样就够用GNN来处理了,那到底能干什么呢?

GNN主要能处理三种类型的任务。

图层面任务

对图的整体进行预测,GNN输出对整个图的预测属性,例如,下图中分辨出具有两个环的图,这就是一个针对整个图的分类任务。

图片

对于图像和文本而言,图层面的任务类似于MINIS数字分类,或者句子情感分析,例如。判断一个句子表达的是正向情绪还是负面情绪。

顶点层面任务

GNN预测图中每一个节点的属性,例如,下图,预测社交网络中的成员是否是诈骗分子。这就是一个节点分类任务。

图片

对于图像和文本而言,顶点层面的任务类似于图像分割,图像分割不就是对每个像素分类嘛,对于文本,就是预测句子中每个单词的词性(例如名词、动词、副词等)。

边层面任务

边的存在与否是一种结构属性,也就是连接性,GNN也可以预测图中边的非结构属性,什么是非结构属性?对于一个社交网络而言,边代表节点之间有关系,但如何度量亲疏程度呢?这就涉及边的非结构属性了。

预测亲疏程度是一个回归任务,下图则是一个分类任务,每一条边只能是watching,fighting,standing on中的一种。

图片

图片

后面我们会看到,这三类任务可以用一个统一的GNN网络解决。

​​​​​​​

GNN所面对的挑战

前面对于节点,边,图的属性预测GNN都能处理,但对于节点之间的连接性预测却是一种挑战,前面说过用邻接矩阵来表示连接性,当节点数增加,矩阵会变得非常稀疏,内存利用率很低,

例如,下图,仅有四个节点的随机组合对应的邻接矩阵就非常庞大了。

何况更多节点呢?

图片

另外,当你将矩阵转置后,GNN输出结果不应该改变,因为转置没有改变节点之间的关系。

图片

图片

为了解决邻接矩阵带来的挑战,邻接列表应运而生。

图片

到此我们已经扫清了所有障碍,接下来我们就构建一个简单的分类网络,来看看GNN是如何做预测的?

图片

前面我们说过节点,边,图的属性就是一堆向量,也就是前面说的表格数据,处理向量用MLP就可以了,当然你也可以用其他网络,如上图,节点,边,图各有一个MLP,所有点参数共享,也就是所有点共用一个MLP,所有边共用一个MLP。

另外,Layner n+1与上一层相比,图的连接性没变,只改变了属性。也就是可以继续使用初始的邻接链表。

上图构成了一个GNN block,也叫做GNN层,类似CNN中的卷积层,多个GNN 层可以进行累加形成更复杂的网络。

有了GNN block,如果要构建一个节点二分类任务,那么用下面这个网络就够了。

图片

但是,如果一个图只有边有信息,而节点没有存储信息,又要对节点进行分类,该怎么办?

此时就需要把边的信息利用起来了,这被称为信息聚合

图片

如上图,当对一个节点进行预测时,将所有与其相连的边的信息聚合起来作为节点的属性。

聚合操作可以时平均值,最大值,总和

所以,有了信息聚合后,如果只有边的属性,要对节点分类,网络结构如下:

图片

同理,有了信息聚合后,如果只有节点信息,要对边分类,网络结构如下:

图片

有了信息聚合后,只有节点信息,对图分类:

图片

最终的GNN结构如下:

图片

有了信息聚合,就能构建更复杂的GNN网络,这个网络不仅能二分类同样适用于多分类问题。

但是你发现没,上面这个简单的GNN网络并没有利用连接性信息,每个节点以及每条边和全局上下文都是独立处理的。只有在聚合信息进行预测时才使用连接性。

所以,我们可以更进一步的利用聚合信息操作,这样就能进行更复杂的预测。

那么该怎么做呢?

我们可以使用消息传递的方法来实现这一点,即相邻节点或边之间交换信息并影响彼此更新的嵌入。

图片

如上图,也就是在处理当前节点时,把相邻节点的信息聚合过来。

这跟卷积操作有点像,一个特征图的像素对应上一层的一个相邻区域。

图片

有了信息传播操作后,我们的GNN网络更新如下:

节点层面任务:

图片

边层面任务:

图片

图层面任务:

图片

最后,展示了一个Playground,可以改变网络的层数,聚合操作类型,以及各个属性向量的长度,可以通过最终的模型性能来展示各个参数的影响。

图片

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

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

相关文章

thinkphp6 不支持:redis错误

起因: 使用 redis 时候,thinkphp 报错。 解决方法: 打开 php.ini 文件,增加 extensionphp_redis.dll 即可

C/C++内存管理(2):`new`和`delete`的实现原理

new和delete操作自定义类型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

I Doc View在线文档预览系统RCE漏洞(QVD-2023-45061)

0x01 产品简介 iDocView是一个在线文档解析应用&#xff0c;旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 漏洞成因 本次漏洞出现在在线文档解析应用中的远程页面缓存功能。具体问题在于该应用未能对用户输入的URL进行充分的安全验证&#xff0c;从而导致存在安全隐患…

如何开发洗鞋店用的小程序

随着人们生活水平的提高&#xff0c;洗护行业是越来越细分化了&#xff0c;从最开始的干洗店包含洗护行业的所有服务到现在有专门为洗鞋开的店&#xff0c;如果开发一款洗鞋店用的小程序&#xff0c;可以实现用户在家下单直接有人上门取鞋的话&#xff0c;应该如何去开发呢&…

在数组的指定位置插入指定元素值numpy.insert()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 在数组的指定位置插入指定元素值 numpy.insert() [太阳]选择题 请问以下代码中最后输出结果是&#xff1f; import numpy as np arr np.array([1, 2, 3]) print("【显示】arr ",…

tp8 使用rabbitMQ(2)工作队列

代码的参数说明在 第一小节的代码中&#xff0c;如果需要可移步到第一节中查看 工作队列 工作队列&#xff08;又称&#xff1a;任务队列——Task Queues&#xff09;是为了避免等待一些占用大量资源、时间的操作。当我们把任务&#xff08;Task&#xff09;当作消息发送到队列…

【nowcoder】BM2 链表内指定区间反转

题目 题目分析&#xff1a; # 代码实现&#xff1a; package BMP2;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM2 {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法…

一个最简单的工业通讯数据分析例子

1.背景 对工业设备的通讯协议进行分析可以帮助我们更好地理解其工作原理和相关技术&#xff0c;并且有助于以下几个方面&#xff1a; 1. 优化工业设备的通讯效率&#xff1a;了解通讯协议的细节可以帮助我们找到通讯效率低下的原因并进行优化&#xff0c;提高设备的通讯效率和…

重生之我是一名程序员 37 ——C语言中的栈溢出问题

哈喽啊大家晚上好&#xff01; 今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢&#xff1f;栈溢出指的是当程序在执行函数调用时&#xff0c;为了保护函数的局部变量和返回地址&#xff0c;将这些数据存储在栈中。如果函数在函数调用时使用了过多的…

Redis入门教程

1. 什么是NoSql NoSQL一词最早出现于1998年&#xff0c;是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。2009年&#xff0c;Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论&#xff0c;来自Rackspace的Eric Evans再次提出了NoSQL的概念&am…

使用Python的turtle模块绘制钢铁侠图案

1.1引言&#xff1a; 在Python中&#xff0c;turtle模块是一个非常有趣且强大的工具&#xff0c;它允许我们以一个可视化和互动的方式学习编程。在本博客中&#xff0c;我们将使用turtle模块来绘制钢铁侠的图案。通过调用各种命令&#xff0c;我们可以引导turtle绘制出指定的图…

XDR 网络安全:技术和最佳实践

扩展检测和响应&#xff08;XDR&#xff09;是一种安全方法&#xff0c;它将多种保护工具集成到一个统一的集成解决方案中。它为组织提供了跨网络、端点、云工作负载和用户的广泛可见性&#xff0c;从而实现更快的威胁检测和响应。 XDR的目标是提高威胁检测的速度和准确性&…

tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 代码中的消息持久化的说明 RabbitMQ 消息持…

通过云服务器部署JavaWeb项目

文章目录 搭建Java运行环境部署项目更改部分项目代码打包项目把war包上传到webapps目录下验证程序 搭建Java运行环境 搭建环境的部分比较复杂&#xff0c;为了让大家的思路更加清晰特别总结为一篇博客点击查看 部署项目 更改部分项目代码 打包项目 把war包上传到webapps目录…

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

机器人制作开源方案 | 智能图书搬运机器人

作者&#xff1a;张宸豪 戚益凡 陈世达 高梓钦 谭清 单位&#xff1a;华北科技学院 指导老师&#xff1a;罗建国 韩红利 阅读对于学生的重要性毋庸置疑&#xff0c;因此图书馆是一个校园非常重要的组成部分&#xff0c;图书馆的书籍借阅&#xff0c;能为学生提供非常大的…

链表的回文结构

题目描述 题目链接&#xff1a;链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是&#xff1a; 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下&#xff1a; ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中&#xff1a;l…

电感热点温度概述及估算方法总结

🏡《电子元器件学习目录》 目录 1,什么是电感的热点温度2,热点温度参数意义3,热点温度计算方法3.1,测温估算法3.2,电阻变化估算法4,总结1,什么是电感的热点温度 电感的热点指电感的发热点,一般是电感的绕阻。电感的热点温度为电感绕阻的温度。 2,热点温度参数意义 电…

大洋钻探系列之三IODP 342航次是干什么的?(下)

上文简要地介绍IODP342航次的总体情况&#xff0c;本文以航次1个钻孔&#xff08;U1403&#xff09;为例&#xff0c;更为详细地系统展示大洋钻探航次的工作和成果。 ​编辑​ 站位叠加多波束影像的成果图见下图&#xff0c;从图中的颜色效果可以看出&#xff0c;此多波束的成…