GNN

图神经网络简介

简介

GNN在十几年前就提出了,谷歌团队在2021年增强了它。图表示的是实体之间的关系。V:vertex顶点,E:edge边,U:Global整个图,信息叫做attributes。

顶点可以用embedding来表示(长度为5),同样道理可以用另外一个向量来表示边(长度为8)。

图分为有向图和无向图,比如视频平台上的订阅关系。我们可以把一张图片表示为图。

中间这张图叫做邻接矩阵。表示每个点是否能到达每个点。文本也可以被表示为一个有向图

问题

有三个基本类型的图,我图级别的,节点级别的,边级别。

graph level

比如找寻图中是否存在环,并将存在的和不存在的环进行分类。

例子中给的比较简单,可以直接编写代码完成。

vertex level

比如俩个老师分裂了,所有的学生要选择老师AB。也就是判断点和点的连线。

edge level

这个是预测属性的任务,给定图预测图的边。

在机器学习中使用图的挑战

图有四种信息,分别是节点,边,全局信息,连接性。连接性可以用邻接矩阵表示大小为N x N。但是这样的话大小可能会非常大,会变成一个稀疏矩阵。

邻接矩阵编码相同的连通性。图中俩个矩阵可以等价的进行表示。四个顶点可以表示为如下邻接矩阵

我们可以用如下方式进行表示

其中节点数组的索引代表着当前节点,节点的值代表节点的类型,边同理。邻接列表中存储着它们的相关性(俩个值都是索引)。

GNN

GNN是对图上所有的属性(节点,边,全局上下文)进行的可以优化的变换,这个变化可以保存图的语义。这篇文章用的是信息传递的神经网络。GNN的输入和输出都是图。GNN不修改图的连接性。

最简单的GNN例子为,对于顶点向量,全局向量,边向量分别构造多层感知机。然后对这三个属性进行更新。但是其他的是没有变化的。

比如我们可以对顶点做分类,就是直接对每个顶点进行Softmax就可以进行分类任务了。当然不管有多少顶点,都是共享一个全连接层。(所有的边共享一个,节点共享一个,全局上下文共享一个)。

这个方式也可以用来初始化。

假设我们想对顶点做预测,但是没有顶点的向量。我们会用pooling。拿出附近的点和全局向量加起来做pooling。同理如果没有边的向量只有顶点的向量,可以通过附近的顶点进行相加然后赤化。如果没有全局向量,就将整个图顶点的向量加起来池化。

给定输入图,然后给一系列的GNN层,每个层有三个MLP,最后输出得到保持图结构但是属性发生变化的输出。缺失信息的话就加汇聚层。但是这三个属性之间缺乏交互,导致最后输出可能不能捕捉图中的信息。

改进

基于信息传递

假设要对顶点的向量进行更新,信息传递中我们要做一件额外的事情,我们把它的向量,和它邻居的向量加起来送进MLP

这个操作和卷积有点类似,但是只做加而不是加权和。

边和顶点信息传递

将边连接的俩个顶点的信息传递给边。如果维度不一样的话可以投影到相同维度。同样的,顶点也可以把自己的边加起来。图中先把顶点的信息给边,然后把边的信息给顶点再更新

理论上顶点更新到边或者边更新到顶点都可以。可以让顶点和边都互相进行汇聚,这样就有俩个信息了。但是向量可能会宽一点。

那么如何更新全局向量呢?这里就可以将全局上下文抽象成一个master node。然后将这个node看做和所有的顶点相连,和所有的边相连(抽象的)。

图中为这些信息相互更新。这样三类属性都学到了其他的向量。这里有点类似于attention机制,但是我我们本身就知道图的连线。

超参数

一个是图神经网络的层树,另一个是汇聚的方式,可以作品平均,可以做求和,可以做max。顶点数量,边的数量,embedding 的大小

效果

图中为不同参数对模型AUC的影响

讨论

顶点之间可以有多重边,有向边,无向边。因为在网络比较深时,最后一个节点可能能看到整个图的信息。这对于计算代价可能是不可承受的(存了很多中间结果)。可以每次采样一个小图下来。

第一个随机采样一些点然后找点最近的邻居。第二个是做随机游走。然后最多随机游走多少部。第三个是随机走几步。然后找出随机走的邻居(结合钱俩个)。第四个是取一个点把它的k个紧邻给取出来。

如何把顶点的邻居合并成一个规则的张量呢,然后做小批量梯度下降呢。(不知道

目前没有发现一个赤化操作是比其他的更好的。当关注一个节点,在k层之后,更

Last modification:January 29, 2025
如果觉得我的文章对你有用,请随意赞赏