1.深层图卷积网络
前面讲到,随着图卷积网络层数的叠加,其表达力反而会丢失,因为过深的图卷积网络会造成过平滑的现象。同时,在标准数据集上的实验结果似乎也可以佐证:在我们常用的Cora 等图数据集上,如图卷积网络的作者Kipf 建议的那样,图卷积网络一般两层就够用了,层数再多也不能对结果有很大的提升,反而会增加模型的复杂度。
那么,是不是深层图卷积网络就没有用武之地了呢?当然不是的。我们之所以没有看到深层图卷积网络的优势,一是没有找到好的训练方法,正如深层卷积神经网络也需要采用残差网络或稠密连接网络的结构消除梯度消失等问题一样,深层图卷积网络也需要一些特殊处理;二是我们常用的标准图数据不够大(除了过平滑的问题,深层图卷积网络在小数据上还面临着过拟合的问题),在更新、更大的图分类公开数据集上,一些深层图卷积网络模型 ( 如Deep图卷积网络)取得了非常明显的优势。另外,从信息传播的角度考虑,每一层图卷积网络相当于对一阶邻接节点传播信息,浅层图卷积网络没有办法把信息传播到相隔很远的节点上,因此合理地增加层数有助于图中相隔较远的节点之间的信息传递。
前面讲了两个解决过平滑问题的方法,一个方法是在浅层图卷积网络的基础上增加一个随机游走模型,使得信息可以传播到无穷远,然后把这两个模型用协同训练的方式结合;另一个方法是将图卷积网络与个性化PageRank联系起来,建立一个包含根节点信息的传播模型。
2.残差连接
一个很自然的想法是:将深层卷积神经网络上的残差连接模块迁移到图卷积网络中。残差连接是深度学习中一个广为人知的概念,它的主要作用是改善深层卷积神经网络训练时的梯度消失(当输入值非常大或非常小的时候,Sigmoid函数的梯度接近于0,这会导致在神经网络的深层中梯度更新非常缓慢,从而使得网络难以训练)、梯度爆炸(梯度爆炸是深度学习中常见的问题,尤其在训练深层神经网络时。它指的是在梯度下降过程中,由于多层网络层之间的梯度连乘,导致梯度值变得异常大,从而使得网络权重更新过大,造成模型训练不稳定,甚至导致模型失效)问题。同时,通过打破神经网络的对称性,提升神经网络的表达力。
假设我们在某一层有一个输入X, 期望的输出为H(X), 一个残差块可以表示为H(X)=F(X)+X, 其中F(X)被称为残差部分。它的含义是输入信号可以直接从任意一个低层传播到高层,反过来,梯度也可以从这些跨层的残差连接直接传回来,这样底层的梯度不会变得越来越小。在理想情况下,网络训练时会先经过浅层网络(X的部分)学习,浅层网络不能拟合的部分需要更深层的残差部分F(X)=H(X)-X 来学习,以保证残差网络至少和浅层网络的性能一样好。对应到图卷积网络中,过平滑的其中一个原因是节点自身的信息在传播过程中丢失。很显然,通过残差连接,节点的信息随着图卷积网络层数的增加,可以在传播的路径上一直保留。
假设每一层的节点状态是H¹, 经过一层图卷积网络之后,节点的嵌入是 z¹+¹=σ(AH'w¹), 改成残差模块后,我们把这一层的输出变为H¹+¹=H¹+z¹+1=σ(AH'w¹)+H¹。再输入到下一层。Kipf最早在介绍图卷积网络的论文中提出了使用残差连接的方式,他发现残差网络也只能在一定程度上缓解过平滑的问题,随着层数的增加, 图卷积网络的性能仍然会降低。
Chiang等人在介绍Cluster-GCN的论文中提出这种残差连接方式不够好是因为没有考虑到图卷积网络层数的影响。简而言之,节点对离得近的邻居的影响力应该更大。于是他们又对模型做了一些改进,给前一层的表示更多的权重:。在此之上,他们进一步考虑了邻接点的数量,提出了一个新的正则化方法:,其中。随后,又有一个简单但更有效的改进,不仅对残差部分做了小的改动,而且通过在图卷积网络的参数部分增加恒等映射来获取更好的效果。这个模型叫作GCNII(Graph Convolutional Networks via Initial residualand Identity mapping), 具有初始残差和恒等映射的图卷积网络),它的每层节点状态更新公式为:
3.JK-Net
JK-Net(Jumping Knowledge Networks,跳跃知识网络)是最早正式提出的深层图卷积网络模型框架。不同于残差连接的方法,它将图卷积网络的每一层出在最后聚合在一起,作为最终的输出。例如一个三层的JK-Net,Ag-gregate函数用来聚合各层输出,可以是拼接、最大池化或者LSTM。 假设每一层图卷积网络的输入为H¹, 输出为H¹+1=(A^Hlwl), 则以拼接方式的聚合函数为例,最终K层JK-Net的输出为:H=H¹||H²ll…||HK(上标)。
其中Ⅱ表示矩阵的拼接。事实上,JK-Net的拼接方式和卷积神经网络中的DenseNet 有点接近。也有人用DenseNet的稠密连接代替残差连接和JK-Net,直接用在深层图卷积网络上。稠密连接和JK-Net中的拼接稍有不同,它不只是在最后一层 拼接所有之前层的输出,而是在每一层都拼接前面所有层的输出。
4.DropEdge与 PairNorm
既然残差连接、稠密连接这些深层卷积神经网络上的法宝都被拿来用在了图卷积网络上,说不定 dropout、BatchNorm这些工具也都可以迁移到图卷积网络上。DropEdge就是dropout 在图神经网络上的扩展。我们知道,在训练过程中,dropout 会随机删除一些输入数据的特征,而DropEdge则随机删除邻接矩阵中的一些边。假设图的邻接矩阵A 有 N 条边,我们随机选取 Np条边进行删除(p是一个预设的概率值),然后用剩余的邻接矩阵代替原来的A 输入图卷积网络进行训练(当图卷积网络有多层时,每层删除的边可以不一样)。很巧,与DropEdge同一时间发表的Pair-Norm就是这样一种方法。假设每层图卷积网络的输出为x^=GCN(A,X), 则PairNorm的目的是使这些输出正则化后的 X 可以保持总的相互距离不变。 正则化的步骤分为两步,第一步是中心化:
第二步是重新拉伸:
拉伸后最终的输出仍然是中心化的:。
让图卷积网络变深的其中一个动机是使信息可以传得更远,也就是每个节点的信息可以影响到离得更远的邻居。
5.图的池化
池化(Pooling)是一个在传统卷积神经网络里常用的概念,简而言之,池化的作用就是某种形式的降采样。池化层通常接在卷积层后面,用来保留显著特征,降低特征维度,减少网络的参数数量,而这也在一定程度上控制了过拟合。换言之,池化为深度学习的对象提供了一种层次化表达的方法。 例如,在图像卷积中,常用的是平均化和最大化的池化,每一层池化作用在一个局域的接受野,只输出一个单独的平均值或最大值,这样在池化后就会得到图像的更粗粒度的模糊表示。
现在我们考虑怎么从节点的嵌入得到整个图的嵌入。很自然地,我们可以想到对所有节点做平均池化或最大池化,但这样操作会损失图的层级结构信息。在真的图数据中,图的结构通常是具有层级的。例如在社交网络中,相近的用户可以组成社区或朋友圈我们可以把图像中卷积网络的池化方式推广到图上。
(1)聚类与池化
在没有任何图神经网络知识储备的情况下,我们会怎么解决图上的池化问题?一个最简单的想法是模拟图像中的池化层。先定义一 个个邻域,然后只需要在每个邻域中做最大化或平均化取值。那么如何在图结构中定义邻域?
我们可以把每个点和它的邻接点集合当成一个池化邻域吗?从形式上讲当然是可以的。但是,这样并没有使图变小或减少参数量,也就是脱离了池化本身的目标。所以怎么做才合理呢?那就是对图进行分块/ 分层。
直观地讲,合理的分块要求相似的邻接点被分到一起,也就是聚类。如果要进行多层的池化,就相当于多粒度的图聚类。在多层池化时,每一层池化后,我们都得到了一个相对原图来说更粗粒度的压缩图,称为粗图(Coarse Graph),得到粗图的过程称为“粗化”(Graph Coar- sening)。图的“粗化”是一个在传统图分析领域经常用到的概念,在图神经网络的研究中也常常被称作“池化”。虽然谱聚类是一个很好的图聚类方法,但是在涉及多粒度、多层的图聚类时依然不够高效,因此在大图和多层池化的场景下, 我们可能需要选择更高效的图池化方法。切比雪夫网络就利用了Graclus多层聚类算法的粗化阶段来实现图的快速池化。
Graclus是通过最小化谱聚类的目标(如归一化切割)得到每一层的粗图的,它是一个贪心算法,因此具有很高的效率。具体到切比雪夫网络,在每一 层粗化过程中,每次选取一个没有标记的节点i 和它的一个未标记节点邻居j来最大化归一化切割Wij(1/di+1/dj),( 其中Wij是边的权重,di 和dj是节点的度)。然后这两个节点被标记,并合并成一个粗化节点。重复这样的选取过程,直到所有的节点都被探索过。这样,每一层可以得到一个近似于原来节点数1/2的新图,但并非所有的点都能找到对应的、一起粗化的邻居,所以存在 一些没有粗化的单节点。另外,考虑到那些粗化的节点并没有一个有意义的排序,如果直接进行池化,就需要一个额外的表来存取这些节点信息,造成了内存的浪费和低效,也影响平行计算的实现,而切比雪夫网络稍微做了改进,它利用Graclus的机制先把粗化过程做成一个二叉树,然后通过对最终的粗图进行节点排序并进行倒推,得到原图的节点排序,从而实现了一个类似普通卷积网络中的一维池化操作。
(2)可学习的池化: DiffPoo
图的粗化或池化通常作为预处理来帮助图神经网络得到图的最终表示,但是在深度学习时代,我们总是更倾向于实现端到端的系统,这样可以在很大程度上提升系统的可用性。图的粗化有很多方法,除了之前讲到的谱聚类和Graclus,常用的方法还有代数多重网格(Algebraic Multigrid,AMG)。代数多重网络属于解线性系统Ax=b 的多重网格方法。假设A 是一个对称矩阵A∈Rn×n, 一个最简单的代数多重网格算法可以通过如下步骤得到:
(1)用一个快速近似算法得到一个近似解x', 并假设残差为r=b-Ax'。
(2)找到一个矩阵S∈Rnxm, 计 算 的解y。
(3)得到一个更好的近似解x=x′+Sy。
(4)重复上述步骤直到残差足够小。
观察第二步,ST(转置)AS将线性系统从n维降到m 维,实际上就是对图做了粗化 ( 称为Galerkin粗化算子)。回到图数据中,对于一个邻接矩阵A, 它的粗化 表示为Ac=ST(转置)AS
对应地,图信号X 池化为Xc=STx。DiffPool是一个基于代数多重网格的池化方法。不同于传统的代数多重网络,DiffPool中 的S可以根据上层的图信息参数化,这样我们就得到了一个端到端可学习的池化图网络。在每一层L中,我们定义两个不同的图神经网络层,一个图神经网络用来嵌入,另一个图神经网络用来学习粗化矩阵S。
然后用类似代数多重网格的方法,得到下一层的邻接矩阵 A¹+1 和节点特征 xl+1 。这样,我们就实现了图的层次化表达。值得一提的是,在之前的池化 方法中(如基于聚类的方法),大多只考虑图结构本身而忽略了节点的属性信息,而DiffPool中的粗化矩阵S¹是基于图神经网络的,因此既包含了图结构的信息,也包含了节点属性信息。实验证实,DiffPool可以很好地学习到图的层次 信息,并且在图分类问题上有着很好的表现。
(3)Top-k池化和SAGPool
虽然 DiffPool取得了很好的效果,但它有一个明显的缺点:即使图本身是一个稀疏图,得到的S¹仍然是一个稠密矩阵,这样粗化后的图也会变得稠密, 因此在要处理的图很大的时候,消耗的内存和计算时间都是不可接受的。介绍一个更简洁的池化方法——Top-k池化,它直接选取k 个最重要的节点作为粗化节点,在图中只保留这些粗化节点之间的连接,因此粗化后的图是原图的一个子图。
Top-k池化在Graph U-Net中被提出。对于一个有4个节点的图,其中节点属性特征X¹∈R4×5,邻接矩阵A¹∈R4×4,输出一个只有2个节点的子图(包含节点xl+¹∈R²×5和邻接矩阵A¹+¹∈R²×2) 作为粗化的结果。其中p是一个可学习的向量参数,表示矩阵的元素乘。假设我们在第1层将图粗化到一个只有k 个节点的粗图上,则Top-k 池化的过程如下:
其 中 ,x¹ 为上一层的节点属性矩阵,A¹ 为上一层的邻接矩阵,1表示全1向量。我们先定义一个可学习的向量参数 pL, 把节点的属性矩阵映射到一个向量 y 上 ,y 的每一个元素代表每个节点的重要性。通过对y 进行排序,我们选取前k 个最重要的节点,它们的序号集合为idx。然后,我们通过这些序号选取一个包含最重要信息的子图,这个子图包含最重要的k 个节点X~¹, 以及它们之间所有的连接A¹+1,而其他的节点和边都被删除了。最后,我们根据节点的重要性y 对节点的属性赋予不同的权重,得到一个最终的输出xl+1。
在Top-k 池化中,我们用节点的属性 X¹ 和一个参数p¹得到节点的重要性, 没有考虑图的结构信息。SAGPool对Top-k池化进行了改进,把节点的重要性向量阐释为一个自注意力机制,而自注意力的分数则通过一层图卷积网络来计算,即
Top-k池化只保留了原图的一部分节点和边,因此注定比原图更稀疏,这就解决了DiffPool的复杂度问题。由于Top-k池化直接删掉了很多节点和边,理论上会损失很多信息;而DiffPool或其他代数多重网络的方法则是将所有的节点映射到新的粗化节点上,因此这些节点的信息在某种程度上保存在了粗化图中。然而,在实际的图分类实验中,我们发现这两种方法的差距并不是很大,这说明在大多数情况下,图中用来分类的信息本身就是冗余的,Top-k 池化选择的重要信息也足以帮助我们做出很好的分类。