Cluster-GCN:子图划分,特别适合大规模的同质图数据

目录

  • 1. Cluster-GCN
    • 1.1.参考资料
    • 1.2.GCN面临的挑战:大规模训练
      • 1.2.1.训练原理→训练挑战
      • 1.2.2.GCN:Full-batch gradient descent
      • 1.2.3.GraphSAGE:Mini-batch SGD
      • 1.2.4.VR-GCN
    • 1.3.Cluster-GCN:基于图聚类结构且适合于基于SGD训练的GCN算法
      • 1.3.1.工作原理
      • 1.3.2. 优势
      • 1.3.3.对算法的测试

1. Cluster-GCN

聚类GCN:一种对大而深的图卷积网络训练的高效算法
发表时间: 2019年8月4日发表在KDD 2019上。

1.1.参考资料

论文链接:Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks
GitHub链接:ClusterGCN: A PyTorch implementation
DGL链接:DGLexamples
https://blog.csdn.net/yyl424525/article/details/100057907

1.2.GCN面临的挑战:大规模训练

目前基于SGD的算法,面临着:

  • 随GCN层数呈指数增长的高计算成本
  • 保存整个图形和每个节点的embedding到内存的巨大空间需求

1.2.1.训练原理→训练挑战

 对于一个图,GCN采用图卷积运算逐层地获取节点的embedding:在每一层,要获取一个节点的embedding,需要通过采集相邻节点的embedding,然后进行一层或几层线性变换和非线性激活。最后一层embedding将用于一些最终任务。例如,在节点分类问题中,最后一层embedding被传递给分类器来预测节点标签,从而可以对GCN的参数进行端到端的训练。
 由于GCN中的图卷积运算需要利用图中节点之间的交互来传播embeddings,这使得训练变得相当具有挑战性。不像其他神经网络,训练损失可以在每个样本上完美地分解为单独的项(decomposed into individual terms),GCN中的损失项(例如单个节点上的分类损失)依赖于大量的其他节点,尤其是当GCN变深时。由于节点依赖性,GCN的训练非常慢,需要大量的内存——反向传播需要将计算图上的所有embeddings存储在GPU内存中。

1.2.2.GCN:Full-batch gradient descent

  • 要计算整个梯度,它需要存储所有中间embeddings,导致O(NFL)内存需求,这是不可扩展的。
  • 虽然每个epoch的时间是有效的,但梯度下降的收敛速度较慢,因为每个epoch只更新一次参数。
  • memory: bad
  • time per epoch: good
  • convergence: bad

1.2.3.GraphSAGE:Mini-batch SGD

  • 每次更新只基于一个mini-batch的梯度,它可以减少内存需求,并在每个epoch执行多次更新,从而加快了收敛速度。
  • 但是,由于邻居扩展问题,mini-batch SGD在计算L层单个节点的损失时引入了大量的计算开销。它要求节点的邻居节点在L-1层的embeddings,这又要求邻居节点在L-2层的embeddings,和在下游层的递归embeddings。这将导致时间复杂度随GCN深度呈指数增长。
  • 尽管GraphSAGE提出了通过在层的反向传播过程中,使用固定大小的邻居样本;FastGCN提出了重要性抽样,但这些方法的开销仍然很大,并且在GCN深层会变得更糟。
  • memory: good
  • time per epoch: bad
  • convergence: good

1.2.4.VR-GCN

  • 采用variance减少技术来减小邻域采样节点的大小。
  • 尽管成功地减小了采样大小,但它需要将所有节点的所有中间的embeddings存储在内存中,从而导致O(NFL)O(NFL)内存需求。
  • 如果图形中的节点数量增加到数百万个,那么对于VR-GCN的内存需求可能太高,无法适应GPU。
  • memory: bad
  • time per epoch: good
  • convergence: good

1.3.Cluster-GCN:基于图聚类结构且适合于基于SGD训练的GCN算法

1.3.1.工作原理

目的: 构造节点的分区,使同一分区中的节点之间的图连接比不同分区中的节点之间的图连接更多。

执行: 在每个步骤中,它对一个与通过用图聚类算法来区分的密集子图相关联的一组节点进行采样,并限制该子图中的邻居搜索。这种简单且有效的策略可以显著提高内存和计算效率,同时能够达到与以前算法相当的测试精度。

  1. 对于一个图G,可以把它的节点分成c个组: V = [ V 1 , . . . , V c ] V=[V_1,...,V_c] V=[V1,...,Vc]。因此,就可以得到c个子图 G = [ G 1 , . . . , G c ] G=[G_1,...,G_c] G=[G1,...,Gc],每个 E t E_t Et只包含在 V t V_t Vt中的节点之间的边。
  2. 将特征矩阵X和训练标签Y根据分区 [ V 1 , . . . , V c ] [V_1,...,V_c] [V1,...,Vc]分组为 [ X 1 , . . . , X c ] [X_1,...,X_c] [X1,...,Xc] [ Y 1 , . . . , Y c ] [Y_1,...,Y_c] [Y1,...,Yc]。其中, X t X_t Xt Y t Y_t Yt分别由 V t V_t Vt中节点的特征和标签组成。
  3. 对节点进行重组后,邻接矩阵被划分为 c 2 c^2 c2个子矩阵,即对角块 A t t A_{tt} Att,是一个包含的边在子图 G t G_t Gt内的 ∣ V t ∣ × ∣ V t ∣ ∣Vt∣×∣Vt∣ Vt×Vt维的邻接矩阵​。
  4. 块对角近似:目标函数和损失函数可以分解成不同的batches (clusters)。最终embedding矩阵由bar A的块对角形式表示。
  5. 在每一步中,对一个聚类 V t V_t Vt进行采样,然后根据块损失函数的梯度进行SGD更新,这只需要当前batch上的子图 A t t , X t , Y t A_{tt},X_t,Y_t Att,Xt,Yt和模型 { W ( l ) } l L \{{W^{(l)}}\}^L_l {W(l)}lL 。实现只需要矩阵乘积的正向和反向传播,这比以前基于SGD的训练方法中使用的邻域搜索过程更容易实现。

使用了图聚类算法来划分图

随机多聚类框架(stochastic multi-clustering framework):提高Cluster-GCN的收敛性。 先用一个较大的p,把图分割成p个簇 。然后对于SGD的更新重新构建一个batch B,而不是只考虑一个簇。随机地选择q个簇 ,并把它们的节点包含到这个batch B中。此外,在选择的簇之间的连接被添加回去。通过这种方式,在簇之间的连接就会被重新合并。这种簇的组合使batch之间的差异(variance)更小。

随机多聚类框架解决下述问题:

  • 图被分割后,一些连接边可能被删除。因此,性能可能会受到影响。
  • 图聚类算法往往将相似的节点聚集在一起,因此聚类的分布可能不同于原始数据集,从而导致在执行SGD更新时对 full gradient的估计有偏差。
  • 与随机分割相比,簇的标签分布偏向于某些特定的标签,这增加了不同batch的差异(variance),并可能影响SGD的收敛性。

对角增强(diagonal enhancement):标准化(normalization)策略。有助于构建深度GCN并实现最先进的(SOTA)性能。

在最初的GCN设置中,每个节点从上一层聚合其相邻节点的表示。然而,在深度GCN的设置下,该策略可能不适用,因为它不考虑层数。直观地说,附近的邻居贡献的应该比远处的节点多。因此,作者提出了一种更好地解决这个问题的技术,其思想是放大每个GCN层中使用的邻接矩阵A的对角部分。通过这种方式,在每个GCN层的聚合中对上一层的表示施加更多的权重。

1.3.2. 优势

  • 内存:只需要将节点的embeddings存储在当前batch中,即O(bFL),batch大小为b。这明显优于VR-GCN和full gradient decent,略优于其他基于SGD的方法。
  • 计算复杂度:这种基于梯度下降的算法每个epoch时间开销与邻居搜索方法差不多,但比邻居搜索方法快得多。
  • 收敛速度:这种算法与其他基于SGD的方法是有竞争力的。
  • 易于实现:只计算矩阵乘法而不需要进行邻居采样。
  • memory: good
  • time per epoch: good
  • convergence: good

1.3.3.对算法的测试

  • 作者创建了Amazon2M数据集:200万个节点,6100万个边。比以前最大的公开可用数据集(Reddit)大5倍多。
  • 训练三层GCN,Cluster-GCN比以前最先进的VR-GCN(1523秒 vs 1961秒)更快,并且使用的内存更少(2.2GB vs 11.2GB)。
  • 训练4层GCN,Cluster-GCN可以在36分钟内完成,而所有现有的GCN训练算法由于内存不足而无法训练。
  • Cluster-GCN允许在短时间和内存开销的情况下训练更深入的GCN,从而提高了使用5层Cluster-GCN的预测精度。
  • 在PPI数据集上实现了最先进的test F1 score 99.36,而之前的最佳结果在1是98.71。

  1. GaAN: Gated Attention Networks for Learning on Large and Spatiotemporal Graphs ↩︎

你可能感兴趣的:(python,算法,python,神经网络,机器学习,人工智能)