GCN/GNN

图这个数据结构与之前讨论的文本是一个序列,图片是一个矩阵来说,图更加的复杂。

对图神经网络的简单介绍。

简介:图神经网络被用在处理图的结构和性质上面,构建一个图神经网络需要什么模块

上现在的图神经网络是一个比较新的领域

博客分成四个部分:

  1. 首先是解释什么数据可以表示成一张图;
  2. 图跟别的数据有什么不一样的?
  3. 构建一个GNN,看一下各个模块长什么样子;
  4. 提供一个GNN 的playground

解释什么是图:就是表示一些实体之间的关系,所谓的实体就是一些点,关系就是一些边;

 从左到右分别是顶点,边的关系,以及整张的图

 U代表的是一个全局的信息

这个attributes的意思是:关心的不仅是整个图的架构,而且还关心的是每个顶点每条边和整张图的表示的信息关系,这些信息就叫做attribute。

属性用什么来表示?

定点就是这个黄色的,可以用一个向量来表示里面的一些属性。其中这里面一共有6个值,高矮就是表示这个值的大小。同样也可以用另外的向量来表示边,这个向量的长度是8.所以边里面的属性用一个长为8的向量来表示。最后整个全局的信息用一个长度为5的向量来表示。

图神经网络关注的核心就是怎么样把我们想要的信息用向量来表示,以及这些向量能不能通过数据来学到。

 图一般有两种,一种是有方向的,另一种是没有方向的图。

 没有方向指的是两个连接顶点的边是没有方向的,比如说在微信上你是我的好友,我是你的好友这样的好友关系是没有方向的。

没有方向的图指的是比如在b站上我关注了你但是你没有关注我,这样的关系就是有方向的。

数据是如何表示成图的

首先是怎么把图片表示成一张图?

 假设现在有一张图,长宽高是244×244×3,一般来说会把其表示成一个三个维度的tensor(张量,在输入神经网络的时候输入的是一个tensor),但是从另一个角度来讲可以把它当成一个图,特德每一个像素就是一个点,两个有临界关系的像素就用线连接起来,这就是边。线面的这个图片就是怎么样把一张图片表示成一个图。左边就是图片,右边就是邻接矩阵。

(点的关系)这样就是把图片上的每一个像素就映射成了图上面的一个点。

(边的关系)点一下这个点,可以看到有八条边连接着周围和这个点有关系的像素点,在图上也对应这有八条边的关系。

上面的就是怎么把一张图片表示成图的形式。 

中间的这个矩阵叫做邻接矩阵,他的每一行是一个顶点,每一列也是一个顶点,如果第i行和第j列之间的值为1(就是这个蓝色的点)就表示第i个节点和第j个节点之间是有边的。

例子:别的数据也能表示成图

第一个例子是一个分子图,每一个原子可以表示成图里面的一个点,原子和原子之间的关系表示成一个边。

另外一个图就是社交网络了,人与人之间的交互图。

还有在文章当中的引用图,就是将另外一篇文章引导当前的这篇文章当中,但注意的是这是一个有向边。

在图上能够定义什么样的问题?

主要是由三大类问题,一个是在一个图层里面的,一个是顶点层面的,还有一个是边层面的。

首先是在图层面上面的任务,先给了一些原始图,识别哪一张图里面有两个环,哪一张图里面没有两个环,任务就是给定一张图,对这张图进行分类。

 第二个任务就是在顶点层面的

判断其中的一个点是属于A 关系还是B关系上。

最后一个任务是边上的

给定一张图篇,运用语义分割将图片的背景任务分别拿出来。然后判断人物之间的关系

 意思就是给定一张图,把边上的属性预测出来。

 

 这样就是介绍了在图上的三种问题,分别是整张图上的识别,对一个顶点属性的判断,以及对边的属性的判断。

将机器学习用在图上面会遇到什么样的挑战?

将神经网络用在图上面最核心的就是怎么样表示图使的能够跟神经网络是兼容的。图上面有四种信息,分别是顶点的属性,边的属性,全局的一些信息以及他的连接性(就是每条边到底链接的是那两个点),前面的这三个属性可以使用向量来表示的,但是问题在于怎么表示连接性呢?

连接性可以用之前提到过的邻接矩阵(什么意思)来表示,如果有n个顶点的话,邻接矩阵就是n×n的矩阵,其中连个顶点直接相连的话,那就是1 否则就是0 .但是会遇到的问题就是这个矩阵会非常的大,按照正常的存放这个矩阵没办法存放,那就用到了稀疏矩阵来存储。但是稀疏矩阵在计算的时候是非常困难的。

除了上面的这个问题,邻接矩阵的另外的问题是:邻接矩阵被他的任何行的顺序或者是列的顺序进行交换都是不会影响他。

假设现在有4个点,然后练了4条边,下面的这个矩阵都是可能的邻接矩阵。就是把4个顶点任何的排序最后得到的邻接矩阵都是一样的。

 若想存储高效并且使得整个的排序不会影响邻接矩阵 ,可以用下面的这个存储方法:

8个顶点7条边,每一个顶点的属性用的都是一个标量来表示。当然也可以换成向量。每一条边也是用一个标量来表示,全局的信息也是一个标量来表示。又出现了一个叫做邻接列表的东西,他的长度是和边数一样的,他的第i个项表示的是第i个边连接的是哪两个节点。这样可以看到在存储上只有把边和所有的属性存起来,所以可以说存储是高效的。另外就是对于顺序是没关系的,可以把边的顺序任意打乱,我只要把我的邻接列表的顺序相应的变了就行。同样可以把顶点的顺序打乱,邻接列表也会做相应的改变,这样的表示即是存储高效的也是对顺序没有关系的。

给定一个这样的输入形式怎么样用神经网络来处理呢?——GNN

 GNN就是对图上的所有属性(顶点,边,全局 连接关系)进行的一个优化的变换,这个变换是能保持住图的对称信息的,(对称信息就是把这些顶点进行另外的一个排序之后整个的结果是不会发生变化的)我们将用的是一个叫做 信息传递的神经网络。GNN的输入是一个图输出也是一个图,(也就是在一个层面里给一个图进去再给一张图出来) 他会表示他对图的属性进行一个变换,但是不会对图的连接性进行改变。

最简单的GNN是怎么构造的?

对于顶点,边和全局向量构造了一个MLP 。这个MLP 他的输入和输出的大小是一样的。这三个MLP 就组成了一个GNN 的层。这个层的输入是一个图,输出也是一个图(输出的图的属性已经被更新了,但是整张图的结构是没有发生变化的,这就们满足了我们的第一个要求对图的属性改变名单是不改变图的结构)

因为MLP 是对每一个向量独自作用的,不会考虑所有的链接信息,所以对图的顶点做任何排序,都是不会对结果有什么改变的。

 这样这个最简单的层就满足了之前的两个要求。

最后一层的输出怎么样得到我们要的预测值?

最简单的情况:就是对顶点做预测,顶点的这个向量是已经知道的了,进入到全连接层,得到输出,这样就会对顶点做分类。不管有多少个顶点,只有一个全连接层。也就是说所有的顶点都会共享一个全连接层里面的参数。

 稍微复杂的情况是对一个顶点做预测没但是并不知道这个顶点的向量怎么办?pooling的技术

假设这个点是没有向量的,但是还是想得到这个点的向量,那要怎么对这个点做预测呢?

可以把与这个点连接的边的向量和全局的向量拿出来,然后吧这些向量全部加起来就会得到代表这个点(顶点)的向量。再用这些向量做一个全连接层的输出就行。

 假设没有边的向量只有顶点的向量,也是按照上面的方法,将顶点(边上的点)和全局的向量拿出来,做一个汇聚,然后输入到全连接层(边的)最后得到一个输出。

假设没有全局的向量只有顶点的向量,相对整张图做一个预测的话怎么办?就是将整张图里面的顶点的向量加起来,得到全局的向量,进入到全局的全连接层最后在输出。

不管是缺乏哪一类的属性都可以通过汇聚这个操作得到想要的属性的向量。最后得到预测值。

 总结GNN的结构:

给定一张图,首先进入的是一系列的GNN 的层,每个层里面都有三个MLP 对应的是三种不同的属性,最后的输出是保持了整张图的结构的输出,但是所有的属性都进行了一个更新,左后根据对哪一个属性做预测的话,就添加合适的输出层(缺失信息的话加入汇聚层)这样就完成了一个我们的预测了。这个简单的情况是有局限性的,主要是在GNN层并没有使用结构信息。导致GNN层并没有把图的结构更新到属性里面。导致最后的结果并不能冲分利用图的结构信息。

 现在研究一下怎么把信息放进到GNN里面。用到的技术是信息传递(passing messages)

假设在这张图里面对这个顶点的信息进行更新,就是把这个顶点的向量和他邻居的两个向量加在一起得到汇聚的向量,再放进到MLP 当中,左后得到的就是这个顶点的更新的向量。

上面的这个过程就是最简单的信息传递。跟标准的图片上的卷积有点像。

边和顶点的信息汇聚怎么做?

 怎么把顶点的信息传递给边,边的信息传递给顶点,

先把顶点的信息和边的信息进行一个汇聚得到的向量进入到MLP 当中做一个更新,将得到的更新向量也就是边的信息传递给顶点的信息,两个信息进入到顶点信息的MLP 当中做更新,然后得到最后的输出。

 上面是两种不同方法的更新,会得到不一样的结果。

 两种方法可以交换进行。

全局信息怎么做?再图的顶点之间比较远,之间的消息传递的很慢的时候,解决的方案就是加入了一个master node的方法,这个master node是一个虚拟的点,并且和所有的点进行相连,跟所有的边相连,(顶点和边的相连是一个很抽象的东西)那这个很抽象的东西就是U ,他和所有的边相连,和所有的顶点(V)相连,所以想要把顶点的信息汇聚给边的时候,U也会汇聚过来。同样的,当汇聚顶点的时候,也会把Y和他相连的E(边)连接过来。

上面的讲解:对三类属性都得到了相应的向量,再做预测的时候,可以只用本身的向量,可以把相邻的那些边的向量拿过来,或者是把全局的向量拿来用,只要是和我本身相关的东西都可以拿来做预测。对于不同类别的属性可以加在一起或者是合并都是可以的。基于消息传递的图神经网络是怎么做的就完成了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值