随着机器学习、深度学习的发展,语音、图像、自然语言处理逐渐取得了很大的突破,然而语音、图像、文本都是很简单的序列或者网格数据,是很结构化的数据,深度学习很善于处理该种类型的数据(图1)。
然而现实世界中并不是所有的事物都可以表示成一个序列或者一个网格,例如社交网络、知识图谱、复杂的文件系统等(图2),也就是说很多事物都是非结构化的。
相比于简单的文本和图像,这种网络类型的非结构化的数据非常复杂,处理它的难点包括:
那么对于这类数据我们该如何建模呢?能否将深度学习进行扩展使得能够建模该类数据呢?这些问题促使了图神经网络的出现与发展。
图可以用 G = ( V , E ) G=(V, E) G=(V,E)来表示,
其中
图的种类主要包括有向图、无向图,再往下细分这两类又包括简单图、多重图、完全图
简单图:
①不存在重复边;②不存在顶点到自身的边
简单有向图(图左);简单无向图(图右)
多重图:
和简单图相对,图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联(即有自环)
完全有向图(图左);完全无向图(图右)
设有两个图G=(V, E)和G’=(V’, E’),若V’是V的子集, E’是E的子集,则称G’为G的子图,若满足V(G’)=V(G)的子图G’,则称其为G的生成子图。
指的是一个图中的每对顶点之间都存在至少一条路径,即从图中的任意一个顶点出发,都可以通过边的连通性到达图中的任何其他顶点。
连通图可以分为以下几种类型:
强连通图;无向连通图;强连通图;弱连通图
有向树:一个顶点的入度为0、其余顶点的入度均为1的有向图,称为有向树(右图)
非连通图(左图);生成森林(右图)
图中每个顶点的度定义为以该项点为一个端点的边的数目。
在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值。这种边上带有权值的图称为带权图,也称网
边数很少的图称为稀疏图,反之称为稠密图。稀疏和稠密本身是模糊的概念,稀疏图和稠密图常常是相对而言的。一般当图G满足 ∣ E ∣ < ∣ V ∣ l o g ∣ V ∣ |E| < |V|log|V| ∣E∣<∣V∣log∣V∣时,可以将G视为稀疏图;当图G满足 ∣ E ∣ |E| ∣E∣接近 ∣ V 2 ∣ |V^2| ∣V2∣时,可以将G视为稠密图
图的表示包括邻接表、邻接矩阵、边集数组、邻接多重表、十字链表、链式前向星等,每种图的表示都有不同的用处,需要根据实际需求选择。
其中,比较标准和常规的表示方法有,邻接表、邻接矩阵和边集数组,这三种表示法都即可以表示无向图,也可以表示有向图。特殊一点的包括邻接多重表、十字链表和链式前向星。
图的邻接矩阵(Adjacency Matrix) 存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息
下图是一个无向图和它的邻接矩阵
下图是一个有向图和它的邻接矩阵
下图是一个有向带权图和它的邻接矩阵
邻接表(链表)表示由一个包含V条链表的数组Adj所构成,每个结点都有一条链表,存储与其相连的节点
无向图的邻接表的实例如下图所示
有向图的邻接表的实例如下图所示
带权图的邻接表的实例如下图所示
使用一个数组来存边,数组中的每个元素都包含一条边的起点与终点(带边权的图还包含边权)。或者使用多个数组分别存起点,终点和边权。
邻接多重表中,无向图中的每一个顶点分配一个顶点结点,所有顶点结点构成一个顶点数组 a d j m u l t i L i s t [ n u m ] adjmultiList[num] adjmultiList[num]。另外每条边也分配一个边节点。
以下是顶点数组的展示:
以下是边节点的展示:
以下是邻接多重表实例的展示:
十字链表是为了便于求得图中顶点的度(出度和入度)而提出来的。它是综合邻接表和逆邻接表形式的一种链式存储结构。其存储方式和邻接多重表类似。
以下是顶点数组的展示:
以下是边节点的展示:
链式前向星是一种静态链表存储,用边集数组和邻接表相结合,可以快速访问一个顶点的所有邻接点,在算法竞赛中广泛使用。
目前,最先进的图神经网络分为四类,即递归图神经网络、卷积图神经网络、图自动编码器和时空图神经网络
递归图神经网络(Recurrent Graph Neural Networks, RecGNN)大多是图神经网络的先驱作品。RecGNN旨在学习具有递归神经结构的节点表示。他们假设图中的一个节点不断地与其邻居交换信息/消息,直到达到稳定的平衡,RecGNN在概念上很重要,并启发了后来对卷积图神经网络的研究。特别是,基于空间的卷积图神经网络就继承了消息传递的思想。
卷积图神经网络(Convolutional Graph Neural Networks, ConvGNNs)将卷积运算从网格数据推广到图数据。主要思想是通过聚合节点 v v v自身的特征 x v x_v xv和邻居的特征 x u x_u xu来生成节点v的表示,其中 u ∈ N ( v ) u∈N(v) u∈N(v)。与RecGNN不同,ConvGNN堆叠多个图卷积层来提取高级节点表示。ConvGNN在建立许多其他复杂的GNN模型中发挥着核心作用,可用于节点分类和图分类,如下图所示:
(右图)具有多个图卷积层的ConvGNN。图卷积层通过聚合来自其邻居的特征信息来封装每个节点的隐藏表示。在特征聚合之后,将非线性变换应用于结果输出。
通过堆叠多层,每个节点的最终隐藏表示从另一个邻域接收消息
(左图)图卷积层之后是池化层,以将图粗化成子图,使得粗化图上的节点表示表示表示更高的图级表示。读出层通过取子图的隐藏表示的和/均值来总结最终的图表示
图自动编码器(Graph Autoencoders, GAE)是一种无监督的学习框架,它将节点/图编码到潜在向量空间中,并根据编码的信息重建图数据。GAE用于学习网络嵌入和图生成分布。对于网络嵌入,GAE通过重构图的结构信息(如图的邻接矩阵)来学习潜在节点表示。对于图生成,一些方法一步一步地生成图的节点和边,而另一些方法一次输出图。下图展示了用于网络嵌入的GAE。
编码器使用图卷积层来获得每个节点的网络嵌入。解码器计算给定网络嵌入的成对距离。
在应用非线性激活函数之后,解码器重建图邻接矩阵。通过最小化真实邻接矩阵和重构邻接矩阵之间的差异来训练网络
时空图神经网络(Spatial-temporal Graph Neural Networks, STGNN)旨在从时空图中学习隐藏模式,这在交通速度预测、驾驶员机动预期和人类动作识别等各种应用中变得越来越重要。STGNN的关键思想是同时考虑空间依赖性和时间依赖性。当前的许多方法将图卷积与RNN或CNNs集成以捕获空间依赖性,从而对时间依赖性进行建模。下图展示了用于时空图预测的STGNN。
用于时空图预测的STGNN。图卷积层之后是1D-CNN层。图卷积层对A和X(t)进行运算以捕获空间相关性,而1D-CNN层沿时间轴X滑动以捕获时间相关性。
输出层是线性变换,为每个节点生成预测,例如其在下一时间步长的未来值。