Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks翻译

Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks

ABSTRACT

问题:训练大规模的GCN仍然具有挑战性,当前基于SGD的算法的计算成本随着GCN层数的增长呈指数增长。

方法:Cluster-GCN算法,利用图的聚类结构,适用于基于奇异值分解的训练。

原理:每次对由图聚类算法识别的密集子图相关联的节点块进行采样,并且限制该子图的邻域搜索。

Cluster-GCN works as the following: at each step, it samples a block of nodes that associate with a dense subgraph identified by a graph clustering algorithm, and restricts the neighborhood search within this subgraph.

结果:提高了内存和计算效率,同时达到与之前算法相当的测试精度。在数据集上训练3层的GCN,Cluster-GCN比之前最先进的VR-GCN更快(1523秒vs 1961秒),并且使用更少的内存(2.2GB vs 11.2GB)。训练4层GCN时,算法可以在36分钟左右完成,而现有的GCN训练算法都因内存不足而无法训练。此外Cluster-GCN允许在内存和时间都少的情况下训练更深的GCN,从而提高了预测精度-使用5层GCN,在PPI数据集上进行测试F1 score为99.36,而之前的最佳结果为98.71。

数据集:创建了新的Amazon2M数据,包含200万个节点和6100万条边,比之前最大的公开数据集Reddit大5倍以上。

INTRODUCTION

对于给定的graph,GCN使用图卷积运算逐层获得节点embeddings,在每层上,一个节点的embeddings是通过收集neighbors的embeddings,然后通过一层或者几层的线性变换和非线性激活得到。最后的一层的embeddings用于最终的任务。例如在节点分类任务中,最后一层的embeddings传递给分类器进行预测节点标签,从而以端到端的方式训练GCN参数。

由于GCN中的图卷积算子需要通过图中节点的作用(interaction)来传播embeddings,这使得训练非常具有挑战性。其他神经网络训练损失可可以完全分解为每个样本上的单个项(terms),而GCN的损失项(例如单个节点上的分类损失)依赖大量的其他节点,尤其是当GCN更加深层后,由于对其他节点的依赖型,GCN的训练速度非常慢,并且需要大量的内存—反向传播需要将计算图中的所有embeddings都储存在GPU内存中。

Previous GCN Training Algorithms:现有方法的优缺点:

三个标准(1)内存需求(2)每个训练epoch的时间(3)每个epoch的收敛速度,这三个因素是评估一个训练算法的关键,内存需求直接限制了算法的可扩展性,后两个因素决定了训练速度。N表示图中节点数,F表示embeddings维数,L表示层数来分析经典的GCN训练算法。

Full-batch gradient descent,为了计算梯度,需要储存所有的intermediate embeddings,导致了大量的内存需求,虽然每个epoch的时间非常efficient,但是梯度下降的收敛速度很慢,因为参数更新的慢,每个epoch只更新一次。

Mini-batch SGD,每次参数更新都是基于一个小批量梯度,这样可以减少内存需求,并且每个epoch可以进行多层更新,从而可以更快地收敛。然而Mini-batch SGD由于neighborhood

expansion problem引入了计算开销。计算损失在某个单节点层L,

VR-GCN提出使用方差减少技术来减少邻域抽样节点的大小,但它需要将所有节点的intermediate embeddings存储在内存中,同样导致内存需要过高。

本文利用图聚类结构提出了一种新的GCN训练算法,小批量算法的效率可以用embeddings利用率的概念来表示,它与节点之间的链接数目或者within-batch批量内的链接数目成正比,该发现促使我们使用图聚类算法来设计批量处理,该算法旨在构建节点分区construct partitions of nodes,使同一分区内的节点之间的图链接比不同分区内的节点之间的图链接数目更多。基于图聚类思想,我们提出了Cluster-GCN。进一步提出了a stochastic multi-clustering framework一个随机多聚类框架来提高Cluster-GCN的收敛性。算法节省了内存消耗,提高了计算能力,在内存方面,只需要储存当前batch的节点embeddings,在计算复杂度方面,算法实现了梯度下降法相同的epoch时间消耗,并且邻域搜索法更快。在收敛速度方面,算法与其他基于SGD的算法具有一定的竞争力。最后算法更容易实现,因为只计算矩阵乘法,不需要邻域抽样。

BACKGROUND

任意两个节点i和j之间的边表示它们的相似度,邻接矩阵A是一个N*N的稀疏矩阵,如果i和j之间有边相连接,则aij=1,否则为0,每个节点都有F维的特征向量,X(N*F)表示所有N个节点的特征矩阵。L层的GCN由L个图卷积层构成,每个图卷积通过混合mixing上一层节点邻居在图中的embeddings来构造每个节点的embedding。

A’是归一化正则邻接矩阵,X(l)是第l层的embedding并且X(0)=X,假设所有层的特征大小都相同(F1=F2=  F),激活函数为ReLU,半监督节点分类使用GCN时,目标是通过最小化损失函数来学习(1)的权重矩阵。

其中y(l)包括所有含标签的节点,zi的ground-truth标签是yi,表示节点i的预测。通常使用交叉熵损失函数。

PROPOSED ALGORITHM

在本文中将使用数目b=B表示一个batch的索引,并且每步SGD都会计算梯度估计进行更新

在epoch方面收敛速度变快,但是SGD将引入GCN训练的另一个计算开销,这使得每个epoch时间比full batch下降慢很多。

mini-batch SGD为什么每个epoch的时间变长了?

当考虑某个节点相关的梯度计算时,需要得到节点的embedding,当前节点的embedding取决于其邻居节点的embeddings,并且我们还需要邻居节点的邻居节点的embeddings,假设GCN有L+1层,为了得到节点的梯度,需要从许多节点中为一个节点聚合特征。

Embedding利用率可以反映计算效率。使用Embedding利用率来表征计算效率。如果节点在第l层的Embedding被反复利用u次用于计算第l+1层的嵌入计算则说节点的Embedding利用率是u。图1左图说明了邻域扩展问题,相反full batch梯度下降的Embedding利用率最大。

为了使mini-batch SGD工作,之前的方法限制邻域扩展大小的方法,但是并不能提高Embedding利用率,GraphSAGE统一采用固定大小的邻域集合,而不是使用全邻域集合。FastGCN提出了一种重要的采样策略来改进梯度计算,VR-GCN提出了储存所有N个节点和L层之前的Embedding的方法,并在未采样的邻居中重新使用。尽管储存所有Embedding的内存使用很高,但是这个策略非常有用。

图1传统的图卷积方法与提出的聚类方法的邻域扩展差异,红色是起始起点。传统的图卷积存在指数邻域扩张的问题,而我们的方法可以避免。

Vanilla Cluster-GCN

在mini-batch SGD更新中可以设计一个batch和相应的子图来最大化Embedding利用率?

通过将Embedding利用的概念和聚类目标联系起来。

在每个batch中计算一组节点B从第1层到第L层的Embedding,由于每一层计算都使用相同的子图,为了最大化Embedding利用率,通过它我们将SGD更新的效率与图聚类算法联系起来。

Cluster-GCN

对于一个图,将其节点划分为c组:V=[V1,V2,V3,….Vc],其中Vt表示第t个子图中的节点,因此有c个子图

ξ由Vt节点的之间的链接组成,对节点进行重组后,将邻接矩阵划分为c2个子矩阵

每个矩阵的对角块Att是一个|Vt|*|Vt|邻接矩阵,包含在Gt内的链接,是图的邻接矩阵;Ast包含两个子图节点Vs和Vt的链接,∆是A中所有非对角线块组成的矩阵,同样,我们可以将特征矩阵和标签划分为[X1,· · · ,Xc]和[Y1,· · · ,Yc],其中Xt和Yt分别由节点的特征和标签组成。

使用对角线块近似的好处就是可以将GCN的目标函数划分为不同的batches(clusters)。令表示的规范化形式,最终的Embedding矩阵为

由于,由于的对角形式,损失函数也可以进行划分

基于Cluster-GCN的分解形式(6)和(7),在每一步,我们对其中一个节点子集Vt进行采样然后根据的梯度进行SGD更新,仅需要子图Att,当前batch的Xt、Yt和模型,实现只需要向前和向后传播矩阵乘积((6)的一块),这样比以前基于SGD的训练方法中使用的邻域搜索过程更容易实现。

我们使用图聚类算法对图进行划分,Metis [8]和Graclus [4]等图聚类方法的目的是在图的节点上构造分区,使簇内链接多于簇间链接,从而更好地捕捉图的聚类和区域结构。这正是我们需要的,因为(1)如前文所述,对于每个batch而言,Embedding利用率等同于簇内链接。每个节点和它的neighbors一般在同一个cluster,因此在几次hops后,高概率的neighbors节点仍然在同一个cluster内。(2)因为我们使用了对角块A来近似代替A,且误差与簇间链接△成正比,所以我们需要找到一个分区来最小化簇间链接的数目。

我们在图1中演示了使用full Graph G的邻域扩展和使用clustering 分区,我们可以看到ckuster-GCN可以避免大量的邻域搜索,将注意力集中在每个cluster内的邻域上。在图2中,我们展示了两种不同的节点分区策略,随机分区和cluster分区。我们利用随机划分和METIS方法将图划分为10个分部分。然后是使用一个分区来执行SGD更新。可以看出,在相同的epochs下,使用clustering划分可以达到更高的精度。这表明使用图聚类是重要的,分区不应该随机生成。

时间和空间复杂性。在Vt中的每个节点都只链接到Vt中的其他节点,每个节点不需要在Att外进行外部邻域搜索。每个batch的计算将纯粹是矩阵乘积和一些元素操作,平均来说,每个batch仅需要计算embeddings,而这是与L呈线性关系而不是指数关系。在空间复杂度中,我们只需要加载b个样本并且将其存储在每层,导致内存用于储存embeddings。本文算法比之前算法内存的效率更高。

表2 图的随机划分与clustering划分(小批量SGD训练)对比。clustering划分带来了更好的性能(F1 score),因为它删除的分区链接更少。这三个数据都是公共的GCN数据集。我们将在实验部分解释PPI数据。Cora有2708个节点和13,264条边,而Pubmed有19,717个节点和108,365条边。

图2 基于label分布的熵值直方图。我们在每个batch中分别使用随机划分和clustering划分。大多数clustering划分batch的label熵都很低,表明每个batch中的label分布是倾斜skewed的。相比之下,随机划分将导致batch中更大的label熵值。在本例中,我们使用300个cluters来划分Reddit数据集。因此我们的算法只需要将一个子图加载到GPU内存中,而不是整个图(尽管图的大小通常不是内存瓶颈)。表1总结了详细的时间和内存复杂度。

3.2随机多重分区Stochastic Multiple Partitions

Cluster-GCN存在的两个问题:

  1. 图被分割后,一些链接(等式(4)中的△)被移除,性能可能会受到影响。
  2. 图聚类算法倾向于将相似的节点聚集在一起。因此聚类的分布可能不同于原始数据集,导致在执行SGD更新时对整个梯度的有偏估计。

在图2中,我们使用Reddit数据集演示了一个具有不平衡标签分布的例子,该数据具有由Metis形成的聚类,我们根据每个类别标签分布计算其熵值,与随机划分相比,我们可以看到使用聚类方法的熵更小,这表明类别的label分布偏向于一些特殊label。这增加了不同batch之间的差异性,并可能影响SGD的收敛性。

图3 提出的随机多分区方案。在每个epoch时,随机抽取q个clusters(本例中q=2)和其他的类间类别进行链接,形成一个新的batch,图中相同的颜色在同一个batch中。

图4 选择一个cluster与选择多个clusters的比较。前者使用300个分区,后者使用1500并随机选择5个形成一个batch,x轴代表epoch,y轴表示F1 score。

为解决上述问题,提出了一种随机多重聚类stochastic multiple clustering approach来合并类间链接between-cluster links来减少batch之间的差异。首先将图分为p个clustersV1,…Vp,并且p相对大。当为SGD更新构建一个batch时,不仅考虑一个cluster,而是随机选择q个clusters,用t1….tq表示,并且将他们的节点包括到batch中。所选clusters之间的链接需要重新添加进来

通过这种方式,类间链接被重新合并,clusters的组会使得batch之间的差异更小。图3展示了我们的算法,对于每个epochs,clusters的不同组合被组成一个batch。图4中,我们发现将多个clusters作为一个batch可以提高收敛性。

3.3 Issues of training deeper GCNs

之前研究表明训练更深的GCNs似乎表明增加更多的层没有帮助。可能因为之前的数据量比较小。[9]中使用了类似残差网络的结构,修改(1)将第l层的隐藏表达传递到下一层。

我们提出了另外一种技术来提高深层神经元的训练,在原始GCN中,每个节点都会聚合上一层邻居节点的表达。但是附近的节点应该会比远处的节点由更多的贡献。我们提出,放大每个GCN层中使用的邻接矩阵的对角线部分。通过这种方式,我们在每个GCN层的信息聚合中对来自前一层的表达赋予了更多的权重,可以给A添加一个标识,

对所有的节点使用相同的权重而不管其邻居的数量是不合理的,当使用更多层时,数值会呈指数级的增长,因此可能出现数值不稳定,我们提出(9)的修改版本,首先向原始的A添加一个标志,

并且

 

4 EXPERIMENTS

Reddit数据集是我们迄今为止看到的最大的公共数据集,Amazon2M是自己收集的,比较的算法有

VRGCN,保留了所有节点之前的embeddings,并且只扩展到几个邻居进行加速训练,采样邻居的数量为2

GraphSAGE,对每个节点固定数目的邻居进行采样,表中S1=25,S2=10为默认的采样设置。

对于实验中使用的所有方法,Adam优化器的学习率0.01,dropout rate 为20%,weight decay为0。对于VRGCN和GraphSAGE,按原始论文算法将batch sizes设为512。对于Cluster-GCN,表4中列出了每个数据集每个batch的分区和clusters数目。

4.1 Training Performance for median size datasets 中等大小数据集的训练性能,图6为不同算法训练时间和准确率的对比,x轴为训练时间,单位为秒,y轴为F1 score

表5 不同数据集上内存使用情况的比较,括号内的数字为模型使用的隐藏单元的大小

在表5中,当增加层数时,cluster-GCN的内存使用并没有增加多少,因为,当增加一层时,引入的额外变量是权重矩阵W(l),与子图和节点特征相比,权重矩阵相对较小。cluster-GCN比VRGCN内存效率高很多。

4.2 Experimental results on Amazon2M

Amazon2M数据集,新的GCN数据集,超过200万个节点和6100万条边,图数据集中,每个节点都是一个产品,节点的链接表示两个产品是否一起购买。节点的特征通过主成分分析降维到100维来生成,使用top-level类类作为该产品/节点的标签。常见的类别表7所示。

当网络为2层时,达到相似的F1 score,VRGCN比cluster-GCN更快,但是再增加一层时,VRGCN比cluster-GCN更慢。VRGCN使用的内存比cluster-GCN更多(3层网络时多5倍)。

表9 使用不同层数GCN时,运行时间的比较,使用PPI,并且epochs为200。

我们研究使用更深的GCNs是否获得更好的准确性。在第4.3节中,我们讨论了修改邻接矩阵A的不同策略,以促进深层神经网络的训练。我们将对角增强技术应用于深度GCNs,并在PPI上运行实验。结果如表11所示。对于2到5层的情况,所有方法的准确性随着更多层的增加而增加,这表明更深的GCNs可能是有用的。然而,当使用7或8个GCN层时,前三种方法不能在200个纪元内收敛,并且获得了显著的精度损失。一个可能的原因是对更深的GCNs的优化变得更加困难。

 

猜你喜欢

转载自blog.csdn.net/ziqingnian/article/details/112792439