草庐IT

Graph Neural Network——图神经网络

FavoriteStar 2023-03-28 原文

本文是跟着李沐老师的论文精度系列进行GNN的学习的,详细链接请见:零基础多图详解图神经网络(GNN/GCN)【论文精读】

该论文的标题为《A Gentle Introduction to Graph Neural Networks》,是对GNN的简介。那么论文的第一张图呢把鼠标放上去某一个结点将会表示出该节点的生成过程,可以看到放于Layer1中的某个节点时,它是由Layer2中的多个节点生成,而Layer2中的这些结点又有Layer3的部分节点生成,因此只要层次够深,那么一个节点就可以处理原始大片节点的信息

图这种数据结构在当前随处可见,因此图神经网络如果能够发挥对图这种结构的良好处理能力,将会有很广泛的应用场景,例如药物的生成、车流量检测、推荐系统、人物关系等等。

文章的主要内容分为四块,分别是

  • 什么样的数据结构可以表示为图
  • 图和别的数据结构的区别在哪,为什么要用图神经网络
  • 构建一个GNN查看内部各模块的内容
  • 提供一个GNN的操作平台

1、什么是图

图实际上就是表示实体(顶点)的信息以及它们之间的连接关系(边)。而图的节点所包含的信息、边表达的信息、以及整个图表达的信息都可以用向量来表示。因此就存在三种向量。

而图又分为有向图和无向图,如下:

那么数据如何表示为图呢?

1.1 图片表示为图

如果将每个像素点看成一个顶点,而邻接的关系看成图中的边的,那么就可以用邻接矩阵来表示这个图像了,如下:

在图中我们可以看到,最左边的图呢代表每个像素它的位置,两位数字分别代表行和列,那么它旁边的那些像素总共有8个和它靠近,那么在第三张图中就有8的顶点和它存在边的连接。而如何将第三张图表示成数据呢,就是用邻接矩阵,可以看到邻接矩阵的行和列每个元素都是一个顶点,如果顶点和顶点之间存在边的关系那么将会在矩阵的对应位置用蓝色的点进行标注。因此我们就将图片表示成了一个图,再用邻接矩阵这种结构来表示图了。

1.2 文本表示为图

文本可以看成一个序列,将每个单词看成一个顶点,而相邻的单词可以看成存在有向边的连接,再用邻接矩阵来表示,如下:

1.3 其他数据结构表示为图

例如咖啡因分子:

人物关系图:

空手道道馆中老师与学生的关系图:

等等。

1.4、数据表示成图后存在哪些问题

图上的问题大致上可以分为三类,第一类是关于整个图的任务,第二类是关于图中的顶点的任务,第三类任务是关于图中的边的任务。

  • 关于整个图的任务

    例如我们将分子的结构表示成图之后,我们要识别该图中是否有两个环,那么我们就可以做成一个分类任务:

  • 关于顶点的属性判断的任务

    对顶点进行划分,划分成两类,例如上述提到的空手道老师的任务,两位老师因为意见不合而决裂,那么我们所有的学生都要做出选择哪位老师的任务,因此就是对顶点的类型进行分类的任务:

  • 关于边的属性判断的任务

    例如在下图中,先对各种元素进行提取成顶点,然后判断各个顶点之间是什么关系,例如观看、攻击等等:

也就是对一个图中的边的属性进行划分:

1.5、将机器学习用于图模型中将会有什么挑战

首先,前面说到的图的信息、顶点的信息、边的信息可以用向量来表示,这对于神经网络是由友好的。但是关于各个顶点之间的连接性应该怎么表达是一个大问题。而我们前面提到邻接矩阵,首先它所占用的空间会非常大,其次对于这种稀疏矩阵的高效处理也是一个很大的问题,再者如果我们将矩阵中的某些列或者某些行进行交换,是不会影响邻接矩阵所表示的含义的,如下图:

或者看下面这个例子,对于四个顶点的图可以有这么多可能的邻接矩阵:

这就需要我们保证我们的网络也能够在应对这样的变化时做出相同的决策。

那么我们可以用到如下这种数据结构来表示:

对于每个顶点和每条边,我们都可以用标量或者向量来表示它们的内部属性,全局的图也是一样的。而对于所有的连接信息,我们则可以维护一个连接列表的结构,其中每一个值代表每条边对应连接的两个节点。

2、图神经网络(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 是对图的所有属性(节点、边、全局上下文)的可优化转换,它保留了图的对称性(置换不变性),也就是将顺序变化之后不会影响的。而这里用到的神经网络结构为message passing neural network,即信息传递神经网络,它会对图中的各种属性向量进行转换,但不会改变其连接性。并且其输入和输出都是一个图。

2.1 最简单的GNN

一个最简单的GNN如上图所示:对于图、顶点、边这三类属性分类构造一个多层感知机(MLP),然后将对应的向量输入进去后得到一个新的向量来表示新的信息。而这并不会改变原来连接性的信息,因此图的结构仍然是保持不变的。那么我们如何将这些信息转换成我们想要的输出呢

假设现在是对顶点的信息进行预测,就是之前空手道的二分类任务,那么我们可以在最后一层输出的图后,接上一个全连接层,然后再接上一个Softmax层即可,例如我们要进行二分类任务,那我们的全连接层的输出维度设为2即可,n分类就设为n。 需要注意的是不管有多少个顶点,它们是共享一个全连接层的,共享其中的参数。那么也就是所有的顶点共享一个全连接层,所有的边共享一个全连接层, 全局自己就拥有一个全连接层。

那么再来看稍微复杂一点的情况,例如某个顶点我们没有其向量该怎么办呢,可以采用pooling技术,即将与该顶点相连的边的向量和全局的向量进行相加,就得到了代表这个顶点的向量,那么我们就可以拿这个向量去做预测等任务了,示意图如下:

其中红色的箭头代表四条边的向量,蓝色箭头的向量代表全局的向量,那么相加就可以得到该顶点的向量了,可表示成下面的示意图:

那么如果有顶点的向量而没有边的向量也是同理,只需要将该边所连接的两个顶点的向量和全局的向量进行相加即可,即:

而如果是拥有顶点的向量而没有全局的向量,那么可以将全部顶点的向量加起来作为全局的向量,即:

所以不管缺乏哪一类的属性都可以通过pooling来补齐

因此完整的最简单的GNN如下图:

但这部分的问题是在GNN blocks中并没有考虑到图的结构信息,这相当于对信息的浪费,结构可能不太理想。那么要用到下面的技术。

2.2 在图表的各部分之间传递信息

这部分的思想其实很容易理解,例如在对顶点进行更新时并不是直接进入MLP之中,而是将该顶点的向量和与之相连的所有顶点的向量求和,再进入MLP之中得到该顶点的更新向量,即:

这种情况呢就是只在顶点之间进行信息传递,即:

我们还可以实现更复杂的信息传递,例如把顶点的信息传递给边,把边的信息传递给顶点,即下图:

其中\(\rho _{V_n-E_n}\)代表将顶点的信息传递到边,即将边相连的两个顶点的向量加到边的向量之上,而\(\rho _{E_n-V_n}\)就是将边的信息传递到顶底,即将顶点有关系的边的向量都加到顶点的向量之上。完成之后再进入各自的MLP进行更新。这里需要注意的是这两个顺序交换是不一样的,即下面两种处理方式是不一样的:

但目前也没有特别明显的证明哪一种更好。另外一个办法就是两边同时更新,两种方式同时实施,即:

其实从之前我们就没有深入讲解说为什么需要一个全局的向量。这是因为如果你的图很大,有很多的节点但是连接又不够紧密的话,那么消息从一个顶点传递到远处的顶点可能需要很久的时间或者说很多次的传递过程,那么便虚拟化一个顶点,可以称为master node,该点呢与所有的顶点都相连,同时与所有的边都相连,作为消息传递的重要部分。那么对于全局向量加入了信息传递的过程就可以表示为下图,其中更新边的信息的时候是顶点和全局都传递信息,更新顶点的信息的时候是边和全局都传递信息,而同样,更新全局信息的时候也边和顶点都传递信息。

前述的pooling操作不仅仅可以求和,还可以做平均、取最大值这类操作。

3、当前技术综述

图除了我们前述的那种结构之外,是存在许多种其他结构的,例如下面这两种:

第一种是具有多种的边的类型,存在有向边和无向边;而第二种呢代表图可能是多层的,即当前层的某一个顶点其实可能是一整个图。

另外一个需要注意的点在于,如果层数较多那么后面层中的某一个顶点可能记录的信息就是整个图的信息了,那么求梯度的时候会非常复杂,因此可以尝试的方法是每次进行采样,采样得到一个子图然后再该子图上进行消息传递。

有关Graph Neural Network——图神经网络的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  4. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  5. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  6. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  7. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  8. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  9. ruby - 在 Ruby 中训练神经网络 - 2

    在神经网络方面,我完全是个初学者。我整天都在与ruby​​-fann和ai4r搏斗,不幸的是我没有任何东西可以展示,所以我想我会来到StackOverflow并询问这里的知识渊博的人。我有一组样本——每天都有一个数据点,但它们不符合我能够找出的任何明确模式(我尝试了几次回归)。不过,我认为看看是否有任何方法可以仅从日期预测future的数据会很好,而且我认为神经网络将是生成希望表达这种关系的函数的好方法.日期是DateTime对象,数据点是十进制数,例如7.68。我一直在将DateTime对象转换为float,然后除以10,000,000,000得到一个介于0和1之间的数字,我一直在将

  10. ruby - Heroku 和网络抓取 - 2

    我有一个nokigiri网络抓取工具,它发布到我试图发布到heroku的数据库。我有一个sinatra应用程序前端,我想从数据库中获取它。我是Heroku和Web开发的新手,不知道处理此类问题的最佳方法。我是否必须将上传到数据库的网络爬虫脚本放在sinatra路由下(如mywebsite.com/scraper),并让它变得如此模糊以至于没有人访问它?最后,我想让sinatra部分成为一个从数据库中提取的restapi。感谢大家的参与 最佳答案 您可以采用两种方法。第一个是通过控制台使用herokurunYOURCMD运行scrap

随机推荐