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

引言 

图片

图神经网络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.mzph.cn/news/166521.shtml

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

相关文章

c++|类和对象(上)

目录 一、面向过程和面向对象初步认识 二、类的引入和定义 2.1类的引入 2.2类的定义 三、类的访问限定符及封装 3.1访问限定符 3.2封装 四、类的作用域 五、类的实例化 六、类的对象大小的计算 6.1如何计算对象的大小 6.2类对象的存储方式 七、类成员函数的thi…

Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解

01-综述 可以使用Python内置的logging模块来实现Django项目的日志记录。 所以与其说这篇文章在讲Django的“日志功能-日志模块-日志输出”,不如说是在讲Pthon的“日志功能-日志模块-日志输出”,即Python的logging模块。 下面用一个实例来进行讲解。 …

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(免费思路)

中国是世界上最大的苹果生产国,年产量约为 3500 万吨。同时,中国也是世界上最大的苹果出口国,世界上每两个苹果中就有一个出口到国。世界上每两个苹果中就有一个来自中国,中国出口的苹果占全球出口量的六分之一以上。来自中国。中…

基于51单片机超声波测距汽车避障系统

**单片机设计介绍, 基于51单片机超声波测距汽车避障系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的超声波测距汽车避障系统是一种用于帮助汽车避免碰撞和发生事故的设备,以下是一个基本…

Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置

VS2022最新最全安装教程 很高兴你打开了这篇博客,接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板(C空项目),继续冲!3.进入…

docker的使用方法

文章目录 为什么要用dockerdocker安装docker工作原理docker命令docker搭建练习docker可视化docker镜像docker容器数据卷DockerFiledocker全流程Docker网络原理docker composedocker swarm 为什么要用docker 官网:https://www.docker.com文档地址:https:…

系列五、声明式事务(xml方式)

一、概述 声明式事务(declarative transaction management)是Spring提供的对程序事务管理的一种方式,Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,是指在配置文件中声明,用在Spring配置文件中声明式的处理事务来…

搞笑的客服日常,今天遇到的晒白客服,你遇到过吗?

大家看看这个 https://blog.csdn.net/a871923942/article/details/129778391?utm_mediumdistribute.pc_feed_404.none-task-blog-2 今天遇到傻逼审核 开头第一句就使用快捷话术 客服感觉自己发错了 然后就撤回消息 第二次继续发话术,说违规,审核不通过…

案例015:Java+SSM+uniapp基于微信小程序的校园防疫系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

互联网上门洗鞋店小程序

上门洗鞋店小程序门店版是基于原平台版进行增强的,结合洗鞋行业的线下实际运营经验和需求,专为洗鞋人和洗鞋店打造的高效、实用、有价值的管理软件系统。 它能够帮助洗鞋人建立自己的私域流量,实现会员用户管理,实现用户与商家的点…

【SpringCloud】微服务架构设计模式

一、聚合气微服务设计模式 最常见、最简单的设计模式,效果如图所示: 聚合器调用多个服务实现应用程序所需的功能 它可以是一个简单的 Web 页面,将检索到的数据进行处理并展示,也可以是一个更高层次的组合微服务,对…

记录ruoyi-plus-vue部署的问题

ruoyi-vue-plus5.x 后端 ruoyi-vue-plus5.x 前端 前端本地启动命令 # 克隆项目 git clone https://gitee.com/JavaLionLi/plus-ui.git# 安装依赖 npm install --registryhttps://registry.npmmirror.com# 启动服务 npm run dev# 构建生产环境 yarn build:prod # 前端访问地址…

[C++历练之路]vector的介绍以及底层模拟实现

W...Y的主页 😊 代码仓库分享 💕 🍔前言: 我们学习了STL中的string以及其所有重要接口并进行了模拟实现,但是STL中包含的内容不止于此。学习了string之后继续学习STL中的vector,学习成本会大大降低&#…

产品经理面试必看!To B和To C产品的隐秘差异,你了解多少?

大家好,我是小米,一位对技术充满热情的产品经理。最近在和小伙伴们交流中发现一个热门话题:To B(面向企业)和To C(面向消费者)的产品经理究竟有何异同?这可是我们产品经理面试中的经…

FFmpeg常用命令讲解及实战二

文章目录 前言一、ffmpeg 常用命令1、ffmpeg 的封装转换2、ffmpeg 的编转码3、ffmpeg 的基本编转码原理 二、ffprobe 常用参数1、show_format2、show_frames3、show_streams4、print_format5、select_streams 三、ffplay 的常用命令1、ffplay 常用参数2、ffplay 高级参数3、ffp…

【附代码】判断线段是否相交算法(Python,C++)

【附代码】判断线段是否相交算法(Python,C) 文章目录 【附代码】判断线段是否相交算法(Python,C)相关文献测试电脑配置基础向量旋转向量缩放向量投影推导 点乘定义推导几何意义 叉乘定义推导几何意义 判断线…

四数之和java版

题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a b c d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以…

物流实时数仓:数仓搭建(ODS)

系列文章目录 物流实时数仓:采集通道搭建 物流实时数仓:数仓搭建 文章目录 系列文章目录前言一、IDEA环境准备1.pom.xml2.目录创建 二、代码编写1.log4j.properties2.CreateEnvUtil.java3.KafkaUtil.java4.OdsApp.java 三、代码测试总结 前言 现在我们…

当内容创作进入 AGI 时代,你也可以成为「神笔马良」

我神笔马良的童话故事我们或多或少都听过,一支神笔在手,想画什么就能画出什么,栩栩如生。创造者的理解力、想象力和创作力都能通过这支神笔释放。 近一年,随着 AIGC 内容生产工具的快速出圈,有人把 Stable Diffusion、…