图神经网络(Graph Neural Networks)的简单介绍

574 阅读12分钟

前言

本文是根据 Distill 上的一篇文章 "A Gentle Introduction to Graph Neural Networks" 对 图神经网络(Graph Neural Networks, GNN) 的基础概念进行归纳总结(文章的引用地址在 distill.pub/2021/gnn-in… )。Distill 是 Google 和 OpenAi 合作建立的一个现代的交互、视觉化的实验性质的期刊平台,面向现有以及新的机器学习研究成果。值得称道的是,这个平台建立的理念是尽量利用 JavaScript,使用交互图片的形式,帮助读者更快的理解文章内容,效果斐然。但是,编辑往往针对一篇期刊要花 40-50 个小时的时间来修改校对文章和在网页嵌入交互图片,所以在 2021 年 9 月发表了最后一篇关于理解 图卷积神经网络(Graph Convolution Network, GCN) 的文章之后,该网站再也没有更新了。。。。。。

背景

图神经网络(GNN)的概念最早可以追溯到 2009 年,它的模型简介以及相关证明由 Franco Scarselli 和 Marco Gor 等人在文献中首次提出。首先要澄清一点,除非特别指明,本文中提到的图均指图论中的 图(Graph),而不是我们一般理解的 图片(Image)。它是一种由若干个 结点(Node) 以及连接两个结点的 边(Edge) 所构成的图形,用于刻画不同结点之间的关系。如下图所示就是一个很好的例子,图中所示的 V E U 我们在后面具体解释。

gnn_00.png

最初大家关心图神经网络的原因是那个时候社交媒体蓬勃发展,社交关系网就是一种典型的图。它以每个独立的人为结点,人和人之间的关系作为边,构建出一张大的图结构。后来,人们开始不关注图神经网络了,原因是大家发现图这种数据结构相较文本、语音或者图片来说太过于复杂,处理起来非常繁杂。当时还有像序列转录,图像分类这种更加容易得到成果的人工智能任务可以研究,所以图神经网络在 00 年代到 10 年代逐步淡出了人们的视野。但是,现在由于 Transformer 加入战局,在一定程度上杀死比赛,人们一时间找不到更好的研(guan)究(shui)对象,所以又回头开始研究图神经网络了。最新的研究确实对图神经网络的能力(capabilities)和表达力(expressive power)进行了增强,并且发现图神经网络开始落地在一些实际的应用上,比如药理探究(antibacterial discovery),物理模拟(physics simulations),虚假新闻检测(fake news detection),交通预测(traffic prediction)以及图神经网络的主场,推荐系统(recommendation systems)。

这篇文章主要讲了四件事情。第一,他们发现了什么种类的数据可以表示为一张图,并提出一些常用的例子;第二,他们发现了图这种数据结构和其他的数据结构有什么不一样的地方,有什么特殊的点让我们一定要用图神经网络而不是其他类似卷积神经网络这种更常见的网络结构;第三,他们构建了一个图神经网络的基本架构,解释每个模块的含义以及功能;第四,他们给读者提供了一个针对图神经网络的 playground,用交互的方式帮助读者更加深刻的理解图神经网络,以及各个参数对其的影响,这块推荐大家去链接的网站亲自操作一下,不愧是要花 50 个小时校对的文章,确实精美。

基础概念

首先,作者解释什么是 图(Graph)。图就是表示一些 实体(Entities) 之间的 关系(Relations),每个实体就是一个 结点(Node),每段关系就是一条 边(Edge)。如上图所示,V 代表 Vertex 也叫 Node,指代结点;E 代表 Edge 也叫 Link,指代边;U 代表 Global 或者叫 Master Node,代表的是全局属性或者一个大的结点。图中的 attributes 表示我们不仅关注的是这个图的结构,我们同时也关注点、边和全局属性所包含的信息,如下图所示。

gnn_01.png

如图所示,embedding 代表点、边、全局分别用长度为 6、8、5 的向量来表示。我们如何用这些点、边、全局带来的信息表示成向量以及这些向量能否用数据来进行学习,都是图神经网络需要关注的重点。此外,图的种类一般分为两种,一种是 无向图(Undirected),另外一种是 有向图(Directed)。它们的区别由边(Edge)是否具有方向进行区分,如下图所示。举个例子,在微信上你和我都是好友,你有我的好友,我有你的好友,我们的关系就是双向或者叫无向;而在微博上我关注了你,而你没有关注我,我们的关系就是有向的。

gnn_02.png

Graphs and where to find them

我们下面就是表示如何把一个图片表示成一个图结构。这个图片高 224 个像素(pixel),宽 224 个像素,一共有三个通道,RGB,一般我们会把它表示成一个三维的张量(Tensor)。一般我们在做卷积神经网络的时候只考虑这个三维张量,但是转念一想,这个三维张量也可以看作是一张图,只要考虑像素和像素之间的连接关系。下图最左的图表示一张图片(Image);中间是一个 邻接矩阵(Adjacency Matrix),如果我们有 n 个像素,也就是 n 个结点的话,这个邻接矩阵的大小就是 n x n,因为它代表就是每个点和每个点之间的连接关系。举个例子,25 个像素组成一个 5 x 5 的矩阵,那么邻接矩阵大小就应该是 25 x 25,像素有连接关系置 1,无连接关系置 0;最右图就是对应的图(Graph),即每个像素代表的结点和像素之间之间的连接关系代表的边。如图所示,中心的这个 2-2 就有 8 个邻居。

gnn_03.png

此外,文本(Text)也可以表示成为一个图结构。如下图所示,文本可以看作是一条序列,我们把每个词看作是一个结点,每个词和下一个词之间有一条有向边。

gnn_04.png

除了图片和文本以外,很多类似分子结构(Molcules)、社会关系(Social Network)等都可以表示为图的结构,这里就不一一赘述了。

What types of problems have graph

当我们将数据转换为图结构之后,我们可以定义三种不同类型的预测任务,分别是:图层级(Graph-level)点层级(Node-level)边层级(Edge-level)

Graph-level task

gnn_05.png

在图层面的预测任务,大多是区分图的类别,例如上图。我们需要在 4 个不同的图当中区分,哪一个图拥有一个环结构,哪一个图拥有两个环结构。当然,这个例子举得比较简单,可能用编程语言把路径走一遍就能区分了,用不到机器学习,但是在更复杂的任务中,应用图神经网络是个不错的选择。

Node-level task

gnn_06.png

在点层级的预测任务,大多是区别点和点之间的关系网络。例如上图,我们有两个队长,分别是 John. A 和 Mr. Hi,我们要区分他们分别带领的队员有哪些,并且他们之间的关系是怎么样的。灰蓝色的点群代表 John. A 的队伍,红色的点群代表 Mr. Hi 的队伍。

Edge-level task

gnn_07.png

gnn_08.png

最后一个是边层级的任务,他给的例子是一个跆拳道比赛现场的图片。通过语义分割将背景和人物都拿出来之后,然后表明人物之间以及人物和背景之间的关系如何。我们已经有结点的属性了,然后我们需要学习结点之间的边的属性是什么,比如两个人在对战或者说他们都站在擂台上或者说观众在看二人比赛。

The challenges of using graphs in machine learning

在机器学习中,我们最关心的一件事情就是如何表示图结构并将其与神经网络兼容。图上一般附着四种信息,结点(Nodes)边(Edges)全局信息(Global-Context) 和图的 连接性(Connectivity)。结点、边和全局信息都可以用向量进行表示,但是关键在于如何表示图的连接性。当然,我们可以用之前提到的邻接矩阵表示,但是如果一个图的结点成千上万或者上亿的话,那么一个 n x n 的邻接矩阵将会是无比巨大的,这会带来一些挑战。

当然,邻接矩阵是一个典型的稀疏矩阵,并且值只有两种,一种是 0,一种是 1,因为连接只有两种不同的状态,要么连接,要么断开。我们可以通过稀疏矩阵压缩的方式存储它,但是涉及到高效处理稀疏矩阵确实是一个比较困难的事情。除此之外,还存在另外一个问题。邻接矩阵的行和列交换并不会影响它表达的含义,但是在图片(Image)的角度看来,它们是完全不同的两张图片,如何让结点在邻接矩阵的表达不受到排序的影响也是一个挑战。

gnn_09.png

为了解决提到的挑战,研究者发明了一种稀疏矩阵存储格式用来存储图的信息。如下图所示,需要关注的是第三个名为 邻接列表(Adjacency List) 的向量。邻接列表的向量长度和边的向量长度一致,它的第 i 项表示的是第 i 条边连接的是哪两个结点。边的顺序可以任意打乱,只要改变对应的邻接列表就可以完整的保存图的信息。

gnn_10.png

Graph Neural Network

GNN 是一个对图上的全部信息(点,边,全局信息)进行一个可优化的变换,这个变换的过程可以保持图的 对称性(Symmetries),对称性的意思是无论如何改变结点的排序都不会影响图的结构完整。文章作者使用一个名为 信息传递神经网络(Message Passing Neural Network) 的框架构建 GNN。这个 GNN 应该输入是图(Graph In)输出也是图(Graph Out),它优化的是图的属性,而不改变图的连接性。

The simplest GNN

gnn_11.png

如上图所示,这是一个最简单的 GNN 网络结构。其中的关键是中间的 Graph Independent Layer,中间指代的三个函数分别是三个 MLP,分别对结点(Nodes)、边(Edges)和全局信息(Global-Context)进行处理,并且它们输入和输出的大小要求一样。因为每个 MLP 对每种属性分别进行处理,并没有考虑它们的连接性,所以无论对整个结点做任何排序也好,都不会改变输出图的完整结构。

GNN predictions by pooling information

当我们得到最后一层的结果的时候,我们该如何得到预测的结果呢?例如之前提到的在点层面的预测任务,如何区分队员属于队长 John. A 还是 Mr. Hi 呢?这是一个简单的二分类问题,我们只需要在每个队员表示的向量后面加一个输出度为 2 的全连接层,然后再加一个 softmax 函数就会得到需要的输出了。如果要做 n 分类的话就加一个输出度为 n 的全连接层,然后再加一个 softmax 就行了。如下图所示,中间的函数 C 代表全连接层,经过全连接层输出点的分类。这里注意,所有的点在全连接层共用一个 MLP,所有的边在全连接层也共用一个 MLP,全局信息只有一个也占用一个 MLP。

gnn_12.png

当我们需要预测的时候缺乏某个结点的信息的时候,我们用到了 汇聚(pooling) 技术。如下图所示,对除了结点信息以外的信息进行汇总,并取平均值。最后加一个全连接层进行输出。

gnn_13.png

下图是一个典型的端到端的预测任务,使用的就是上述 GNN 模型。这个完整的流程就是输入一个图,经过 GNN 多层结构得到一个优化过后但是结构不变的图,最后针对不同的预测任务加对应的层级,最后得到预测结果。

gnn_14.png

Passing message between parts of the graph

相较之前的操作,我们开始做得更复杂一点。如下图所示,我们除了处理某个点的信息,我们同时还将它的点的向量信息和它的邻居的点的向量信息进行一个 pooling 操作,然后对其进行一个更新。最左的图我们称为汇聚步,中间被称为更新步,最右是更新过后的信息。这个操作和卷积有点像,只是说卷积核的每个权重都一致。如此一来,就可以完成整个图的比较长距离的一个信息的传递过程。

gnn_15.png

Adding global representations

当要处理的图比较大而且连接没有那么紧密的时候,导致一个信息从一点走到另外一点需要走很长的步。作者提出一个解决方案就是设置一个 master node 或者说 context vector。它连接所有网络中的 nodes 和 edges,并且可以作为一个信息之间沟通的桥梁传递信息,构建整个图的表达。 这个操作又有点借鉴了特征注意力机制(featurize-wise attention mechanism)的设计理念。

gnn_16.png

论述完毕!!