深蓝学院-GNN课程笔记04-图神经网络
这个系列是深蓝学院图深度学习理论与实践的同步课程笔记。课程内容涉及图深度学习的基础理论与应用,本节主要介绍图神经网络的相关内容。
图神经网络
在前面的课程中我们介绍过图嵌入的发展过程,包括以数据降维为代表的第一代图嵌入技术以及以word2vec为基础的第二代图嵌入技术,而在本节课中我们将介绍以图神经网络(graph neural network, GNN)为代表的第三代图嵌入技术。

GNN旨在将深度神经网络的相关方法应用到图上。由于图不是规则的数据结构,在GNN中需要一些额外的操作包括侧重于节点的图滤波以及侧重于图整体的图池化。

谱图论
图滤波的基础是谱图论。在前面的课程中我们介绍过拉普拉斯矩阵描述了图上每个节点与它相邻节点之间的差异:
同时拉普拉斯矩阵还描述了图的频域性质,图上的傅里叶变换由拉普拉斯矩阵给出:
其中
图滤波
图谱滤波
最基本的图滤波方式是基于谱图论的图谱滤波。对于图信号
最后利用图逆傅里叶变换来重构图信号:

显然图谱滤波的核心是设计滤波器
Chebyshev Filter
为了降低计算复杂度,我们可以利用一个多项式来拟合
其中参数
在工程中更常用的方式是使用Chebyshev多项式来代替标准的多项式,这样使得训练过程更加稳定。Chebyshev多项式可以通过递归来定义:
由于Chebyshev多项式是定义在区间[-1, 1]上的,在使用它进行滤波时首先需要对频率进行缩放:
这样使用Chebyshev多项式进行图谱滤波可以表示为:
与传统图谱滤波相比使用Chebyshev多项式作为滤波器具有更少的参数、训练时无需矩阵特征值分解、同时训练过程也更加稳定。
GCN
在GCN中我们进一步只考虑一阶的Chebyshev多项式,同时假设
更进一步假设
令
对于包含多通道的图信号我们则需要将所有输入通道整合起来,此时的滤波过程可以表示为:
其中

记
对于给定的节点
注意到

图空域滤波
现代图神经网络大多是基于图空域滤波来实现的。类似于空域视角下的GCN,图空域滤波可以理解为图上每个节点收集了相邻节点的信息并重新整合得到新的信息。如GraphSage中每个节点从它的邻域中采样
聚合函数AGG可以选择求和、求平均甚至是LSTM等。
GAT则利用注意力机制为每个相邻节点的信息赋予了权重:
当图上存在边的信息时还可以利用该信息来设计滤波器。如ECC为不同类型的边设计了相应类型的参数矩阵:
其中
GGNN还提出使用GRU来整合邻域的信息:
PPNP提出了使用Personalized PageRank来进行消息传播,GCN、GraphSage和GAT都可以看成是PPNP的特例:
为了克服PPNP计算复杂、可拓展性差的缺陷,APPNP提出使用迭代的方式来逼近
可以证明当
图信号降噪
从图信号降噪的角度我们可以将上述所有的图神经网络同一到一个框架中。记原始图信号为
其中第一项
我们对
进一步令
如果我们使用梯度下降来求解这个图降噪问题,则可以建立迭代公式:
在
进行一步迭代可以得到:
令
如果我们假设降噪后每个节点与它邻域的相似度不同,则可以将优化目标修改为:
对节点
还是在
令
最后,我们把它们统一起来用同一个优化问题来表达:
其中
而对于GAT则可以取
对于不同类型的图神经网络,我们相当于选择相应的先验和求解方法来求解同一个降噪问题。
图池化
图池化是GNN中另一种重要的操作。类似于CNN中池化层对数据进行降维,我们可以利用图池化来缩减图的规模。

平面图池化
最基本的图池化方法是平面图池化,我们把整张图缩减到一个节点。常用的平面图池化包括均值池化或是最大值池化。

我们还可以在图上插入一个虚拟节点来进行池化。此时这个虚拟节点与图上的所有其他节点相连,然后在这个新图上训练一个GNN来获得节点嵌入。这个虚拟节点的嵌入即可作为原来整张图的池化结果。

除此之外,我们还可以把注意力机制引入到图池化中。此时我们需要为图上的每个节点计算一个注意力分数

层次图池化
平面图池化的一个局限在于池化后我们失去了图的结构信息,而在层次图池化中我们则是通过逐步的粗池化直到获得图的表示,因此可以保留不同层次下图的结构信息。
gPool是层次图池化的经典方法,它的思想是在图上选择一部分比较重要的节点来构造新图从而完成图池化。在选择节点时gPool使用了节点重要性分数

SAGPool的流程与gPool基本一致,但在计算重要性得分时使用了一个GCN来完成计算:

另一种层次图池化的方法是使用一个GNN来生成子图。在DiffPool中使用了2个GCN模型,其中一个用来生成分配矩阵

最后将这两个矩阵结合起来即可获得池化后的新图:

DiffPool在空域中进行池化,而EigenPool则是在谱域进行聚类从而实现图池化。EigenPool首先需要在图上进行谱聚类,从而得到一系列互不重叠的簇作为粗化图的超节点并利用这些超节点构造出新图

接着我们在每个子图上进行图傅里叶变换得到相应的傅里叶系数作为新图上节点的嵌入。一般情况下我们可以只保留每个子图上的前

