A Gentle Introduction to Graph Neural Networks阅读笔记


  本文探索并解释了现代图神经网络。 我们将这项工作分为四个部分。 首先,我们看看什么样的数据很容易表示为图,以及一些常见的例子。 其次,我们探讨了图类型与其他类型数据的不同之处,以及我们在使用图时必须做出的一些专门选择。 第三,我们逐渐从简单的GNN 实现转向最先进的 GNN 实现。 第四也是最后一点,我们提供了一个 GNN playground,可以在其中玩真实的任务和数据集,以建立对 GNN 模型的每个组件如何对其做出的预测做出贡献的更强烈的直觉。

1 图定义

  文章中给出图的定义 A graph represents the relations (edges) between a collection of entities (nodes).即图表示实体(节点)集合之间的关系(边)。
在这里插入图片描述
其中 V V V表示顶点属性, E E E表示边属性, U U U表示全局属性。

2 可以表示成图的几种数据

2.1 图像

  我们通常将图像视为具有图像通道的矩形网格,将它们表示为数组(例如,244x244x3 浮点数)。 将图像视为具有规则结构的图的另一种方式,其中每个像素代表一个节点,并通过边缘连接到相邻像素。 每个非边界像素恰好有 8 个邻居,每个节点存储的信息是一个 3 维向量,表示该像素的 RGB 值。

  假设我们有一张图像,怎么把它表示成图呢?这里需要用到邻接矩阵A,以 5 × 5 5\times5 5×5共25个像素点为例,如下图所示。每一个非边界像素点都和周围八个像素点相连,因此邻接矩阵中这八个位置都为1。顶点像素点都和周围三个像素点相连,边界非顶点像素点和周围五个像素点相连。参考文献[1]中可以通过点击图像像素,查看图形表示如何变化。
在这里插入图片描述

2.2 文本

  文本可以被认为是一个序列,其中每一个词作为一个节点,每一个词和其下一个词之前有一条有向边。
在这里插入图片描述

2.3 其他数据

  接下来的示例中,每个节点的邻居数量是可变的(与图像和文本的固定邻居大小相反)。 除了图表,这些数据很难用任何其他方式表达。

2.3.1 分子

  分子是物质的组成部分,由 3D 空间中的原子和电子构成。 所有粒子都在相互作用,但是当一对原子彼此保持稳定距离时,我们说它们共享一个共价键。 不同的原子和键对具有不同的距离(例如单键、双键)。 将这个 3D 对象描述为图是一种非常方便且常见的表示,其中每一个原子可以表示为一个点,原子间键表示为边。 如下图是香料分子和咖啡因分子的图表示:
在这里插入图片描述
在这里插入图片描述

2.3.2 社交网络

  在社交网络中,我们将个人表示为节点,将他们间的关系表示为边。
在这里插入图片描述

2.3.3 引文图

  将论文抽象为节点,论文A引用了论文B,则有一条有向边A->B。

3 面向图数据的任务

  图上的预测任务一般分为三种类型:图级、节点级和边级。在图级任务中,我们预测整个图的属性。对于节点级任务,我们预测图中每个节点的一些属性。对于边级任务,我们希望预测图中边的属性或者是否存在这条边。

3.1 图级任务

  在图级任务中,我们的目标是预测整个图的属性。 例如,对于以图形表示的分子,我们可能想要预测该分子的气味,或者它是否会与与疾病有关的受体结合。
在这里插入图片描述

3.2 节点级任务

  节点级任务与预测图中每个节点的身份或角色有关。节点级预测问题的一个典型例子是 Zach 的空手道俱乐部,如下图所示,图中每个节点代表人,边代表人与人之间的产生联系。有两个管理员产生分歧,要预测每个人“效忠”哪个管理员的问题。
在这里插入图片描述

3.3 边级任务

  边级预测任务的一个例子是图像场景理解。给定一些节点,我们希望预测这些节点中的哪些共享一条边或该边的权值是什么。
在这里插入图片描述

4 使用图数据的挑战

  图上的信息有四种:节点属性、边属性、全局属性以及连接性。在使用神经网络对图进行处理前,我们得先将图表示成神经网络能够处理的数据类型。节点属性、边属性、全局属性都可以处理成向量从而与神经网络输入数据兼容,那么图的连接性怎么表示呢?最容易想到的就是邻接矩阵:相连为1否则为0。但是这暴露出两个缺点:

   是对于一些大型网络,其节点数可能上百万,并且每个节点的边数变化可能会很大,比如某些节点连接了几万条边,有些节点只连接了一条边,这样邻接矩阵将会非常稀疏,虽然我们可以利用压缩的办法来对这些稀疏矩阵进行存储,但稀疏矩阵的计算一直都是一个难题。

   是对于同一个图,我们将矩阵中任何行或列之间进行交换:虽然两个邻接矩阵看起来不一样,但二者表示的却是同一个图。也就是说,不同的邻接矩阵,可以表示相同的连接性!这意味着如果我设计了一个神经网络,在上述两个不同的矩阵输入后我得保证神经网络的输出是一样的。

  对于这两个缺点,一个有效的解决方式是邻接表:
在这里插入图片描述
  上图有8个顶点,7条边。对于每个顶点或者每条边的特征我们用一个标量(一般为向量)来表示,全局特征也用一个标量(一般为向量)来表示。对于连接性,不再用邻接矩阵来表示,而是用邻接列表来表示。

  使用邻接列表来表示连接性的两个好处:
  1. 对于稀疏矩阵来说,使用邻接列表存储显然更加节省空间。
  2. 不存在两个不一样的邻接列表表示同一张图。

5. Graph Neural Networks

  在经历了将数据转为graph以及将graph进行表示后,我们就能使用GNN来对图进行处理了。GNN 是对图的所有属性(节点、边、全局上下文)的可优化转换,它保留了图的对称性(置换不变性)。这些GNN模型类型接受图作为输入,将信息加载到其节点、边和全局上下文中,并逐步转换这些嵌入,而不改变输入的连接性图形。

5.1 The simplest GNN

  使用我们上面构建的图的数字表示(使用向量而不是标量),我们现在可以构建 GNN。 我们将从最简单的 GNN 架构开始,我们在其中学习所有图属性(节点、边、全局)的新嵌入,但尚未使用图的连通性。

  为简单起见,前面的图使用标量来表示图属性; 在实践中,特征向量或嵌入更有用。这个 GNN 在图的每个组件上使用单独的多层感知器 (MLP), 称之为 GNN 层。 对于每个节点向量,我们应用 MLP 并返回一个学习的节点向量。 我们对每条边做同样的事情,学习每个边的嵌入,对于全局上下文向量,学习整个图的单个嵌入。与神经网络模块或层一样,我们可以将这些 GNN 层堆叠在一起。
在这里插入图片描述
  因为 GNN 不会更新输入图的连通性,所以我们可以用与输入图相同的邻接表和相同数量的特征向量来描述 GNN 的输出图。 但是,输出图更新了嵌入,因为 GNN 更新了每个节点、边和全局上下文表示。

5.2 Pooling

  对于一个简单的二分类问题,我们需要对每个节点进行分类,在我们得到每个节点的状态向量后,我们可以搭建一个输出为2的全连接层,然后再经过一个Softmax,就能进行二分类了。多分类问题类似,只要将全连接层的输出改为n即可。如下图所示:
在这里插入图片描述
  将经过最后一层后输出的节点状态向量 V n V_n Vn与一个全连接层相连,就能进行分类任务了。值得一提的是,这里所有节点都是共用一个全连接层,也就是所有节点共享同一个全连接层的参数。

  以上是最简单的一种情况,但我们不得不考虑另外一种情况:如果我们没有一个节点的向量表示,但我们仍想对该节点进行预测该怎么办? 答案是Pooling,Pooling在CNN中已经有过接触。如下图所示:
在这里插入图片描述
如果我们没有正下方那个节点的向量表示,此时我们就可以把与该节点相连的两条边的状态向量以及全局状态向量相加,得到这个节点的状态向量,然后再经过全连接层进行预测。

  类似地,如果没有某条边的状态向量,只有节点的状态向量,如下所示:
在这里插入图片描述
此时我们就可以把这条边上的两个节点的向量相加得到该边的向量,然后再进行预测。

  又比如我们只有节点信息,没有全局信息,而我们想对图的全局标签进行预测:
在这里插入图片描述
此时同样可以将图中所有顶点的向量加起来,得到一个全局表示,然后再进行预测。

因此,无论缺少哪一种信息,我们最终都能通过Pooling操作来汇聚已有的信息,进而得到我们想要的信息。

  具体来讲,上面描述的GNN可以通过下图概括:
在这里插入图片描述
  我们将原始graph通过一个个GNN层(每一层都有三个MLP,分别对三种状态进行转换),然后,无论是顶点、边还是全局,都通过同一个全连接层进行输出预测。

  上述这种最简单的GNN存在着一个很明显的缺陷:我们在GNN层对节点或者边进行更新时,每层内所有节点共用一个MLP,所有边共用一个MLP,此时我们并没有考虑连接信息,也就是说我们在对节点更新时没有考虑与该节点相连的其余节点或者边,更新边时没有考虑与该边相连的节点。

  简单来说,我们在更新时没有将图的结构信息考虑进去。

5.3 消息传递

  可以通过在 GNN 层中使用池化来进行更复杂的预测,以使我们学习的嵌入了解图的连通性。 我们可以使用消息传递来做到这一点,其中相邻节点或边交换信息并影响彼此更新的嵌入。

  消息传递分三个步骤进行:
  1. 对于图中的每个节点,收集所有相邻节点的嵌入(或消息)。
  2. 通过聚合函数(如 sum)聚合所有消息。
  3. 所有汇集的消息都通过一个更新函数传递,通常是一个学习的神经网络。

  正如池可以应用于节点或边一样,消息传递可以发生在节点或边之间。

  这些步骤是利用图表连接性的关键。 我们将在 GNN 层中构建更精细的消息传递变体,从而产生具有增强表现力和功能的 GNN 模型。
在这里插入图片描述
当然上图这种更新方式并没有太复杂,只是将该节点的向量与其相连节点的向量相加。

  考虑一种更为复杂的情况: 我们的数据集并不总是包含所有类型的信息(节点、边和全局上下文)。 当我们想对节点进行预测,但我们的数据集只有边信息时,我们在上面展示了如何使用池化将信息从边到节点,但仅限于模型的最后预测步骤。 我们可以使用消息传递在 GNN 层内的节点和边之间共享信息。
在这里插入图片描述
  在进行边的更新时,我们可以将与该边相连的两个顶点的向量加入到该边的向量中(如果维度不同则需要变换,目前还不清楚如何组合它们,一种方法是学习从边空间到节点空间的线性映射),然后再对该边进行更新。同样,对于某一个节点的更新,我们也可以将与该节点相连的边的向量加入到该节点中,然后再对该节点进行更新。

  节点和边之间的消息传递存在一个选择:
在这里插入图片描述
可以先把边的信息传递给顶点,顶点更新后,再将更新后的顶点信息传递给边,边再更新(上图左),或者相反(上图右)。

  还有一种办法是交替传递:
在这里插入图片描述
我们可以同时进行两种操作:将边的信息给节点,然后节点的信息也给边。此时的节点和边都包含了各自的信息,然后再进行一次传递,将二者的信息互相传递,随后再用两个MLP对节点和边进行更新。

5.4 全局表示

  到目前为止,我们描述的网络存在一个缺陷:即我们多次应用消息传递,图中彼此相距很远的节点也可能永远无法有效地相互传递信息。对于一个节点,如果我们有 k 层,则信息将最多传播 k 步。对于预测任务依赖于相距很远的节点或节点组的情况,这可能是一个问题。一种解决方案是让所有节点能够相互传递信息。不幸的是,对于大型图,这很快就会变得计算成本高昂(尽管这种称为“虚拟边”的方法已用于诸如分子之类的小型图)。

  这个问题的一种解决方案是使用图 ( U U U) 的全局表示,它有时被称为主节点或上下文向量。假设这个全局上下文向量连接到网络中的所有其他节点和边,并且可以充当它们之间的桥梁以传递信息,从而为整个图建立表示。

  因此在进行顶点或者边的更新时,如果我们加上全局表示&U&,就能保证所有顶点(边)间都能传递信息。

6. GNN playground

  我们在这里描述了广泛的 GNN 组件,但它们在实践中实际上有何不同?这个 GNN Playground 可让您了解这些不同的组件和架构如何有助于 GNN 学习实际任务的能力。

  我们的 Playground 展示了一个带有小分子图的图级预测任务。我们使用 Leffingwell Odor数据集,它由具有相关气味感知(标签)的分子组成。预测分子结构(图)与其气味的关系是一个跨越化学、物理学、神经科学和机器学习的 100 年历史问题。

  为了简化问题,我们只考虑每个分子一个二进制标签,对分子图是否闻起来“刺鼻”进行分类,由专业调香师标记。如果一个分子具有强烈、醒目的气味,我们就说它具有“刺鼻”气味。

  我们将每个分子表示为一个图,其中原子是包含对其原子身份(碳、氮、氧、氟)的 one-hot 编码的节点,而键是包含对其键类型(单、双、三)的 one-hot 编码的边或芳香)。

  我们针对这个问题的通用建模模板将使用顺序 GNN 层构建,然后是带有 sigmoid 激活的线性模型用于分类。我们 GNN 的设计空间有许多可以定制模型的超参数:

  1.GNN 层数,也称为深度。
  2.更新时每个属性的维度。更新函数是一个 1 层 MLP,具有一个 relu 激活函数和一个用于规范化激活的层范数。
  3.池化中使用的聚合函数:max、mean 或 sum。
  4.被更新的图属性,或消息传递的样式:节点、边和全局表示。我们通过布尔切换(开或关)控制这些。基线模型将是一个独立于图的 GNN(所有消息传递),它将最后的所有数据聚合到一个全局属性中。切换所有消息传递函数会产生一个 GraphNets 架构。
在这里插入图片描述

  由于这些是高维向量,我们通过主成分分析 (PCA) 将它们简化为 2D。 一个完美的模型将可见性分离标记的数据,但由于我们正在减少维度并且也有不完美的模型,这个边界可能更难看到。

7. 相关知识

7.1 其他类型的图

在这里插入图片描述
  这里主要介绍了两种其他类型的图:多重图和嵌套图。

  所谓多重图,就是指图中一对节点间可以有多种不同类型的边。 比如在社交网络中,两个节点(用户)之间的边,可以表示这两人是熟人、家人或者情侣。这种情况下,GNN可以通过为不同类型的边设置不同类型的消息传递方式来进行调整。

  所谓嵌套图,就是说图中的某一个节点可能就表示一个图。 比如在一个分子网络中,一个节点代表一个分子,如果一个分子能通过某种反应转换为另一个分子,则两个分子之间有一条边。在这个网络中,节点(分子)本身也是一个图(原子-原子)。在这种情况下,可以让GNN学习分子级别的表示反应级别的表示,并于训练期间在它们之间进行交替。

  此外,还有超图,超图的一条边可以连接到多个节点,而不仅仅是两个。

7.2 采样和批处理

  GNN存在邻居爆炸的问题,即:GNN会不断地聚合图中相邻节点的信息,第L层GNN中的每个目标节点都需要聚合原图中L层以前的所有节点信息。邻点爆炸式增长,使得GNN的minibatch训练极具挑战性。

  此外,由于彼此相邻的节点和边的数目不同,我们也不能使用恒定的批量大小。

  解决该问题的办法是从图中进行采样,得到一个子图,然后对子图进行处理。

  对一张图进行采样的四种方式如下图所示:
在这里插入图片描述

  • Random node sampling:先随机采样一些点(Sampled nodes),然后再采样它们的邻居。
  • Random walk sampling:做一些随机游走,从当前点的邻居节点中进行采样。
  • Random walk with neighborhood:结合前两种:先随机走一定长度,然后再采样它们的邻居。
  • Diffusion Sampling:取一个根节点,然后对它的一近邻、二近邻一直到K近邻进行采样,类似于一个BFS。

7.3 Inductive biases

  先说一说CNN的平移不变性:即使目标的外观发生了某种变化,但是利用CNN依然可以把它识别出来。即图像中的目标无论是被平移,被旋转,还是被缩放,都可以被成功地识别出来。

  而在GNN中,也具有图对称性:也就是排列无关性,即使交换了顶点的顺序,GNN对其的作用都保持不变。

7.4 不同的Pooling方式

  在GNN中,对节点和边的信息进行Pooling是关键操作,选择一个最优的Pooling方式是一个比较好的研究方向。

  常见的Pooling方式有max、mean和sum,没有哪一种Pooling方式绝对的好,作者对三者进行了比较:
在这里插入图片描述

参考

[1] A Gentle Introduction to Graph Neural Networks
[2] 图解GNN:A Gentle Introduction to Graph Neural Networks
[3] 李沐论文精读视频——A Gentle Introduction to Graph Neural Networks

猜你喜欢

转载自blog.csdn.net/qq_49323609/article/details/125685451