图神经网络 GNN

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

图的基本内容

图的基本知识

图的基本元素

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

每个顶点、边和整张图都可以用一个向量来表示,在这个例子中,顶点的向量有六个值,柱体的高矮就表示该值的大小,每条边用一个长为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

普通卷积 VS 图卷积

在这里插入图片描述

半监督学习

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

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

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

在这里插入图片描述

GCN传播公式

softmax是作多分类常用的激活函数

在这里插入图片描述

GCN的计算

图中基本组成

在这里插入图片描述

特征计算方法

在这里插入图片描述

邻接矩阵的变换

在这里插入图片描述

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述

GCN变换原理解读

如下图所示,假设绿色框中的人是个富人,红色框中的人是个穷人,他们只是小时候认识,穷人只认识富人,而富人认识很多人。

如果只对行做归一化,由于穷人只认识富人,所以其度为1,则其在进行特征重构的时候很大一部分信息会来自于富人,这样的模型大概率会认为穷人和富人是同一种人。显然,这是不合理的

所以,我们需要同时对行和列都进行归一化,这样不仅只考虑富人对穷人的关系,还考虑了穷人对富人的关系。

简单来说,对行做归一化考虑到了,富人对穷人来说很重要;对列作归一化,考虑到了穷人对富人可能没那么重要(因为富人的度很大,穷人的度很小,富人很可能不记得穷人了),这样相对更加合理。

在这里插入图片描述

GCN层数

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

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述

参考资料

A Gentle Introduction to Graph Neural Networks

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

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

图神经网络7日打卡营

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

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

猜你喜欢

转载自blog.csdn.net/qq_41990294/article/details/133514788