cs224w(图机器学习)2021冬季课程学习笔记21 Scaling Up GNNs to Large Graphs

诸神缄默不语-个人CSDN博文目录
cs224w(图机器学习)2021冬季课程学习笔记集合

YouTube视频观看地址1 视频观看地址2 视频观看地址3 视频观看地址4


本章主要内容
本章首先介绍了GNN在实践中遇到的难以应用到大图上的问题,指出了scale up GNN这一课题的研究重要性。
接下来介绍了三种解决这一问题的方法:GraphSAGE模型1的neighbor sampling,Cluster-GCN模型2和简化GNN模型(SGC模型3)。


1. 介绍scale up GNN问题

  1. 图数据在当代ML研究中应用广泛,在很多领域中都出现了可供研究的大型图数据。

    推荐系统,推荐商品(链接预测),分类用户/物品(节点分类):
    在这里插入图片描述

    社交网络,好友推荐(边级别),用户属性预测(节点级别):
    在这里插入图片描述

    学术图,论文分类(节点分类),作者协作预测、文献引用预测(链接预测):
    在这里插入图片描述

    知识图谱(KG),KG completion,推理:
    在这里插入图片描述
  2. 这些图的共同点有二:
    第一,大规模。节点数从10M到10B,边数从100M到100B。
    第二,任务都分为节点级别(用户/物品/论文分类)和边级别(推荐、completion)。
    本节课就将介绍如何scale up GNNs到大型图上。
    在这里插入图片描述
  3. scale up GNN 的难点在于:
    在传统大型数据集上的ML模型的训练方法:
    目标:最小化平均损失函数 l ( θ ) = 1 N ∑ i = 1 N − 1 l i ( θ ) \mathcal{l}(\mathbf{\theta})=\dfrac{1}{N}\sum\limits_{i=1}^{N-1}\mathcal{l}_i(\mathbf{\theta}) l(θ)=N1i=1N1li(θ)(其中 θ \mathbf{\theta} θ 是模型参数, l i ( θ ) \mathcal{l}_i(\mathbf{\theta}) li(θ) 是第 i i i 个数据点的损失函数)。
    我们使用随机梯度下降stochastic gradient descent(SGD)方法:随机抽样 M M M ( < < N ) (<<N) (<<N) 个数据(mini-batches),计算 M M M 个节点上的 l s u b ( θ ) \mathcal{l}_{sub}(\mathbf{\theta}) lsub(θ),用SGD更新模型: θ ← θ − ∇ l s u b ( θ ) \mathbf{\theta}\leftarrow\mathbf{\theta}-\nabla \mathcal{l}_{sub}(\mathbf{\theta}) θθlsub(θ)
    在这里插入图片描述
    如果我们想直接将标准SGD应用于GNN的话,我们就会遇到问题:
    在mini-batch时,我们独立随机抽样 M M M ( < < N ) (<<N) (<<N) 个节点,会出现如图所示的情况,抽样到的节点彼此孤立。由于GNN就是靠聚集邻居特征生成节点嵌入的,在mini-batch中无法获取邻居节点,因此这样的标准SGD无法有效训练GNNs。
    在这里插入图片描述
    因此我们会使用naïve full-batch:
    如图所示,对整张图上的所有节点同时生成嵌入:加载全部的图结构和特征,对每一层GNN用前一层嵌入计算所有节点的嵌入(message-passing),计算损失函数,应用梯度下降来更新参数。
    在这里插入图片描述
    但full-batch应用不适用于大型图,因为我们想要使用GPU来加速训练,但GPU的memory严重受限(仅有10GB-20GB),整个图结构和特征信息无法加载到GPU上。
    如图所示,CPU运算慢,memory大(1TB-10TB);GPU运算快,memory受限(10GB-20GB)。
    在这里插入图片描述
  4. 本节课我们介绍三种scale up GNN的方法来解决这个问题,这三种方法分为两类:
    第一类是在每一mini-batch中在小的子图上运行message-passing,每次只需要把子图加载到GPU上:GraphSAGE的neighbor sampling1 和Cluster-GCN2
    第二类是将GNN简化为特征预处理操作(可以在CPU上有效运行):Simplified GCN3
    在这里插入图片描述

2. GraphSAGE Neighbor Sampling: Scaling up GNNs

  1. 计算图
    GNN通过聚合邻居生成节点嵌入,表现为计算图的形式(如右图所示):
    在这里插入图片描述
    可以观察到,一个2层GNN对节点0使用2跳邻居结构和特征生成嵌入:
    在这里插入图片描述
    可以泛化得到:K层GNN使用K跳邻居结构和特征生成嵌入。
    在这里插入图片描述
  2. 我们发现,为计算单一节点的嵌入,我们只需要其K跳邻居(以之定义计算图)。在一个mini-batch中给定M个不同的节点,我们可以用M个计算图来生成其嵌入(如图所示),这样就可以在GPU上计算了:在这里插入图片描述
  3. GNN随机训练
    我们现在就可以考虑用SGD策略训练K层GNN:
    1. 随机抽样 M M M ( < < N ) (<<N) (<<N) 个节点
    2. 对每个被抽样的节点 v v v,获取其K跳邻居,构建计算图,用以生成 v v v 的嵌入。
    3. 计算 M M M 个节点上的平均损失函数 l s u b ( θ ) \mathcal{l}_{sub}(\mathbf{\theta}) lsub(θ)
    4. 用SGD更新模型: θ ← θ − ∇ l s u b ( θ ) \mathbf{\theta}\leftarrow\mathbf{\theta}-\nabla \mathcal{l}_{sub}(\mathbf{\theta}) θθlsub(θ)
      在这里插入图片描述
  4. 随机训练的问题:
    对每个节点,我们都需要获取完整的K跳邻居并将其传入计算图中,我们需要聚合大量信息仅用于计算一个节点嵌入,这样计算开销过大。
    在这里插入图片描述
    更多细节:
     1. 计算图的大小会依层数K指数增长。如右图上面的图所示。
     2. 在遇到hub node(度数很高的节点)时计算图会爆炸,但在现实世界的图中往往大多数节点度数较低,少量节点度数极高,就是会存在这种hub node。如右图下面的图所示。
    下一步,我们就要让计算图更小。
    在这里插入图片描述
  5. neighbor sampling
    核心思想:每一跳随机抽样H个邻居,构建计算图。
    H=2时示例如图所示,从根节点到叶节点,每个节点抽样2个邻居作为子节点:
    在这里插入图片描述
    我们可以用这个经剪枝的计算图来更有效地计算节点嵌入。
    在这里插入图片描述
  6. 对K层GNN的neighbor sampling:
    对每个节点的计算图:对第k(k=1,2,…,K)层,对其k阶邻居随机抽样最多 H k H_k Hk 个节点,构成计算图。如图所示。
    K层GNN一个计算图最多有 ∏ k = 1 K H k \prod^K_{k=1}H_k k=1KHk 个叶节点(每一层都抽满)。
    在这里插入图片描述
  7. neighbor sampling注意事项
    1. 对sampling number H H H 的权衡:小 H H H 会使邻居聚合过程效率更高,但训练过程也会更不稳定(由于邻居聚合过程中variance会更大)。
    2. 计算用时:即使有了neighbor sampling,计算图的尺寸还是跟GNN层数K呈指数增长。
      在这里插入图片描述
    3. 如何抽样节点:
      1. 随机抽样:快,但常不是最优的(可能会抽样到很多“不重要的”节点)
      2. random walk with restarts4:
        自然世界中的图是scale free5 的,即绝大多数节点度数很低,少量节点度数很高。对这种图随机抽样,会抽样出很多低度数的叶节点。
        抽样重要节点的策略:
         1. 计算各节点自所求节点开始的random walk with restarts分值 R i R_i Ri
         2. 每一层抽样 H H H R i R_i Ri 最高(与原节点相关性最高的节点)的邻居节点 i i i
        在实践中,这种策略效果更好。
        在这里插入图片描述
  8. neighbor sampling总结
    1. 计算图由每个mini-batch中的每个点构建。
    2. 在neighbor sampling中,计算图为计算有效性而被剪枝/sub-sampled。此外也有增加模型鲁棒性的效果(因为提升了模型的随机性,有些类似于dropout)。
    3. 我们用被剪枝的计算图来生成节点嵌入。
    4. 尽管有了剪枝工作,计算图还是可能会很大,尤其在GNN的message-passing层增多时。这就需要batch size进一步减小(即剪枝更多),这使得结果variance更大、更不可靠。
      在这里插入图片描述

3. Cluster-GCN: Scaling up GNNs

  1. neighbor sampling的问题:

    1. 计算图的尺寸依GNN层数指数级增长。
    2. 计算是冗余的,尤其在mini-batch中的节点有很多共享邻居时:如图所示,A节点和B节点具有同样的邻居C和D,在不考虑抽样的情况下这两个节点将会具有相同的计算图、即相同的节点,但在neighbor sampling的运算中需要分别各计算一次,就做了重复的事。
      老师在课上提到HAGs6 这一篇是讲如何不用计算这些冗余嵌入的。当然这篇我也没看,列出来仅供有兴趣的读者参考。
      在这里插入图片描述
  2. 在full-batch GNN中,所有节点嵌入都是根据前一层嵌入同时计算出的:
    对所有 v ∈ V v\in V vV h v ( l ) = C O M B I N E ( h v ( l − 1 ) , A G G R ( { h u ( l ) } u ∈ N ( v ) ) ) h_v^{(\mathcal{l})}=COMBINE\bigg(h_v^{(\mathcal{l}-1)},AGGR\big(\{h_u^{(\mathcal{l})}\}_{u\in N(v)}\big)\bigg) hv(l)=COMBINE(hv(l1),AGGR({hu(l)}uN(v)))
    (其中 h u ( l ) h_u^{(\mathcal{l})} hu(l) 是message环节)

    如图所示,对每一层来说,只需要计算2×边数次message(与邻居互相传递一次信息)7;对K层GNN来说,只需要计算2K×边数次message。
    GNN整体计算代价依边数和层数线性增长,这是很快的。
    在这里插入图片描述

  3. 从full-batch GNN中,我们可以发现,layer-wise的节点嵌入更新可以复用前一层的嵌入,这样就显著减少了neighbor sampling中产生的计算冗余问题。但是,由于GPU memory所限,这种layer-wise的更新方式不适用于大型图。在这里插入图片描述

  4. subgraph sampling
    核心思想:从整个大型图中抽样出一个小子图,在子图上用GPU运行有效的layer-wise节点嵌入更新。如图所示:
    在这里插入图片描述
    核心问题:什么子图适用于训练GNNs?
    我们知道GNN通过边来传递信息,从而更新节点嵌入。因此,子图需要尽量多地保持原图中的边连接结构。通过这种方式,子图上的GNN就可以生成更接近于原图GNN的节点嵌入。
    在这里插入图片描述

  5. subgraph sampling: case study
    举例来说,下图中右边的两种子图,左边的子图更适用于训练GNN:保持了必要的社区结构8、边连接模式,没有产生孤立点。
    在这里插入图片描述

  6. 利用社区结构
    现实世界的图会呈现出社区结构,一个大型图可以被解构为多个小社区。
    将一个社区抽样为一个子图,每个子图就能保持必要的原图局部connectivity模式。
    在这里插入图片描述

  7. Cluster-GCN

    1. overview
      我们首先介绍 vanilla9 Cluster-GCN。
      Cluster-GCN分为两步:
      1. pre-processing: 给定一个大型图,将其分割为多个node group(如子图)。
      2. mini-batch training: 每次抽样一个node group,对其induced subgraph10应用GNN的message passing。
        如图所示:
        在这里插入图片描述
    2. pre-processing
      给定一个大型图 G = ( V , E ) G=(V,E) G=(V,E),将其节点 V V V 分割到 C C C 个组中: V 1 , … , V C V_1,\dots,V_C V1,,VC
      我们可以使用任何scalable的社区发现方法,如Louvain8 或METIS11 方法。
      V 1 , … , V C V_1,\dots,V_C V1,,VC induces C C C 个子图: G 1 , … , G C G_1,\dots,G_C G1,,GC
      (注意:group之间的边不被包含在这些子图中)
      在这里插入图片描述
    3. mini-batching training
      对每个mini-batch,随机抽样一个node group V C V_C VC,构建induced subgraph G C = ( V C , E C ) G_C=\big(V_C,E_C\big) GC=(VC,EC)
      如图所示:
      在这里插入图片描述
      G C G_C GC 上应用GNN的layer-wise节点更新,获取所有节点 v ∈ V C v\in V_C vVC 的嵌入 h v \mathbf{h}_v hv
      对每个节点求损失函数,对所有节点的损失函数求平均: l s u b ( θ ) = 1 ∣ V C ∣ ⋅ ∑ v ∈ V C l v ( θ ) \mathcal{l}_{sub}(\mathbf{\theta})=\dfrac{1}{|V_C|}\cdot\sum_{v\in V_C}\mathcal{l}_{v}(\mathbf{\theta}) lsub(θ)=VC1vVClv(θ)
      更新参数: θ ← θ − ∇ l s u b ( θ ) \mathbf{\theta}\leftarrow\mathbf{\theta}-\nabla \mathcal{l}_{sub}(\mathbf{\theta}) θθlsub(θ)
      在这里插入图片描述
  8. Cluster-GCN的问题
    如前文所述得到的induced subgraph移除了组间的链接,这使得其他组对该组的message会在message passing的过程中丢失,这会影响GNN的实现效果。
    如图所示:
    在这里插入图片描述
    图社区检测算法会将相似的节点分到一类中,这样被抽样的node group就会倾向于仅包含整个数据的一个很集中的部分。
    在这里插入图片描述
    被抽样的节点不够多样化,不够用以表示整个图结构:这样经被抽样节点得到的梯度( 1 ∣ V C ∣ ⋅ ∑ v ∈ V C ∇ l v ( θ ) \dfrac{1}{|V_C|}\cdot\sum_{v\in V_C}\nabla\mathcal{l}_{v}(\mathbf{\theta}) VC1vVClv(θ))就会变得不可靠,会在不同node group上波动剧烈,即variance高。这会让SGD收敛变慢。
    在这里插入图片描述

  9. advanced Cluster-GCN: overview
    对上述Clutser-GCN问题的解决方案:在每个mini-batch聚合多个node groups.
    将图划分为相对来说较小的节点组,在每个mini-batch中:抽样并聚合多个node groups,构建induced subgraph,剩下工作就和vanilla Cluster-GCN相同(计算节点嵌入、计算损失函数、更新参数)。
    在这里插入图片描述
    为什么这一策略有效:
    抽样多个node groups可以让被抽样节点更能代表全图节点,在梯度估算时variance更低。
    聚合多个node groups的induced subgraph包含了组间的边,message可以在组间流动。
    在这里插入图片描述

  10. advanced Cluster-GCN
    与vanilla Cluster-GCN相似,advanced Cluster-GCN分成两步:
    第一步:pre-processing
    给定一个大型图 G = ( V , E ) G=(V,E) G=(V,E),将其节点 V V V 分割到 C C C 个相对较小的组中: V 1 , … , V C V_1,\dots,V_C V1,,VC V 1 , … , V C V_1,\dots,V_C V1,,VC 需要够小,才能使它们可以多个聚合起来,聚合后的组还是不会过大)
    在这里插入图片描述
    第二步:mini-batch training
    对每个mini-batch,随机抽样一组 q q q 个node groups: { V t 1 , … , V t q } ⊂ { V 1 , … , V C } \{V_{t_1},\dots,V_{t_q}\}\subset\{V_1,\dots,V_C\} {Vt1,,Vtq}{V1,,VC}
    聚合所有被抽样node groups中的节点: V a g g r = V t 1 ∪ ⋯ ∪ V t q V_{aggr}=V_{t_1}\cup\cdots\cup V_{t_q} Vaggr=Vt1Vtq
    提取induced subgraph G a g g r = ( V a g g r , E a g g r ) G_{aggr}=\big(V_{aggr},E_{aggr}\big) Gaggr=(Vaggr,Eaggr)(其中 E a g g r = { ( u , v ) ∣ u , v ∈ V a g g r } E_{aggr}=\{(u,v)|u,v\in V_{aggr}\} Eaggr={(u,v)u,vVaggr}
    这样 E a g g r E_{aggr} Eaggr 就包含了组间的边。
    在这里插入图片描述

  11. 时间复杂度对比
    对于用K层GNN生成 M M M ( < < N ) (<<N) (<<N) ( N N N 是节点数)个节点嵌入:
    neighbor sampling(每层抽样 H H H 个节点):每个节点的K层计算图的尺寸是 H K H^K HK,M个节点的计算代价就是 M ⋅ H K M\cdot H^K MHK
    在这里插入图片描述
    Cluster-GCN: 对M个节点induced的subgraph运行message passing,子图共包含 M ⋅ D a v g M\cdot D_{avg} MDavg 条边,对子图运行K层message passing的计算代价最多为 K ⋅ M ⋅ D a v g K\cdot M\cdot D_{avg} KMDavg
    在这里插入图片描述
    总结:用K层GNN生成 M M M ( < < N ) (<<N) (<<N) ( N N N 是节点数)个节点嵌入的计算代价为:
    neighbor-sampling(每层抽样 H H H 个节点): M ⋅ H K M\cdot H^K MHK
    Cluster-GCN: K ⋅ M ⋅ D a v g K\cdot M\cdot D_{avg} KMDavg
    假设 H = D a v g 2 H=\dfrac{D_{avg}}{2} H=2Davg,即抽样一半邻居。这样的话,Cluster-GCN(计算代价: 2 M H K 2MHK 2MHK)就会远比neighbor sampling(计算代价: M H K MH^K MHK)更有效,因为Cluster-GCN依K线性增长而非指数增长。
    一般我们会让H比 D a v g 2 \dfrac{D_{avg}}{2} 2Davg 大,可能2-3倍平均度数这样。现实中一般GNN都不深(即K小),所以一般用neighbor sampling的很多。
    在这里插入图片描述

  12. Cluster-GCN总结

    1. Cluster-GCN首先将整体节点分割到小node groups中。
    2. 在每个mini-batch,抽样多个node groups然后聚合其节点。
    3. GNN在这些节点的induced subgraph上进行layer-wise的节点嵌入更新。
    4. Cluster-GCN比neighbor sampling计算效率更高,尤其当GNN层数大时。
    5. 但Cluster-GCN会导致梯度估计出现系统偏差(由于缺少社区间的边。以及当GNN层数加深时,在原图中是真的可以加深的(增大感受野),但在子图中就不行,加深了会弹回来,是虚假的加深)
      在这里插入图片描述

4. Scaling up by Simplifying GNNs

  1. 本节课讲SGC模型,这个模型是通过去除非线性激活函数简化了GCN12模型。原论文3 证明经简化后在benchmark数据集上效果没有怎么变差。Simplified GCN证明是对模型设计很scalable的。在这里插入图片描述

  2. mean-pool的GCN:
    给定图 G = ( V , E ) G=(V,E) G=(V,E) ,输入节点特征 X v X_v Xv v ∈ V v\in V vV), E E E 包含自环(即对所有节点 v v v,都有 ( v , v ) ∈ E (v,v)\in E (v,v)E)。
    设置输入节点嵌入为 h v ( 0 ) = X v h_v^{(0)}=X_v hv(0)=Xv
    k ∈ { 0 , … , K − 1 } k\in\{0,\dots,K-1\} k{0,,K1} 层:对所有节点 v v v,以如下公式聚合邻居信息: h v ( k + 1 ) = ReLU ( W k ⋅ 1 ∣ N ( v ) ∣ ∑ u ∈ N ( v ) h v ( k ) ) h_v^{(k+1)}=\text{ReLU}\big(\textcolor{pink}{W_k}\cdot\textcolor{blue}{\dfrac{1}{|N(v)|}\sum_{u\in N(v)}h_v^{(k)}}\big) hv(k+1)=ReLU(WkN(v)1uN(v)hv(k))(其中粉色字为经训练得到的参数矩阵,蓝色字部分为mean-pooling)
    最终得到节点嵌入: z v = h v ( K ) z_v=h_v^{(K)} zv=hv(K)
    在这里插入图片描述

  3. GCN的矩阵格式
    这一张图的解释可以参考我之前写的笔记:cs224w(图机器学习)2021冬季课程学习笔记7 Graph Neural Networks 1: GNN Model_诸神缄默不语的博客-CSDN博客 第三部分序号13。
    在这里插入图片描述
    以下给出了将GCN从向量形式(邻居聚合形式)转换为矩阵形式的公式:
    注意GCN用的是re-normalized版本 A ~ = D − 1 / 2 A D − 1 / 2 \tilde{A}=D^{-1/2}AD^{-1/2} A~=D1/2AD1/2(这个版本在实证上比 D − 1 / 2 A D^{-1/2}A D1/2A 效果更好)
    在这里插入图片描述
    上图中,第一个公式就是GCN以邻居聚合形式进行的定义,第二个公式就是GCN的矩阵形式,其中 W W W 参数从左边移到右边可以考虑一下就因为 H H H h T h^T hT 的堆叠,所以矩阵形式要乘 W W W 的参数的话就要倒到右边并取转置……就,这个把 W W W 脑内拆解一下应该就可以理解。

  4. Simplifying GCN
    移除掉GCN中的ReLU非线性激活函数,以简化GCN: H ( k + 1 ) = A ~ H ( k ) W k T H^{(k+1)}=\tilde{A}H^{(k)}W_k^T H(k+1)=A~H(k)WkT
    经如下图所示(应该还挺直观的)的迭代推理,易知 H ( K ) H^{(K)} H(K) 可以表示为 A ~ K X W T \tilde{A}^KXW^T A~KXWT 的形式。
    在这里插入图片描述
    其中 A ~ K X \tilde{A}^KX A~KX 不含有任何需要训练得到的参数,因此可以被pre-compute。这可以通过一系列稀疏矩阵向量乘法来加速计算过程,即用 A ~ \tilde{A} A~ 左乘 X X X K次。
    在这里插入图片描述
    X ~ = A ~ K X \tilde{X}=\tilde{A}^KX X~=A~KX,为一个pre-computed matrix,则simplifie GCN的最终嵌入就是: H ( K ) = X ~ W T H^{(K)}=\tilde{X}W^T H(K)=X~WT
    这就是一个对pre-computed matrix的线性转换。
    将矩阵形式转换回节点嵌入形式,即得到 h v ( K ) = W X ~ v h_v^{(K)}=W\tilde{X}_v hv(K)=WX~v(其中 X ~ v \tilde{X}_v X~v 是pre-computed节点 v v v 的特征向量),即节点 v v v 的嵌入仅依赖于它自己的pre-processed特征。
    在这里插入图片描述
    X ~ \tilde{X} X~ 计算完成后, M M M 个节点的嵌入就可以以依 M M M 线性增长的时间复杂度来生成:
    h v 1 ( K ) = W X ~ v 1 h_{v_1}^{(K)}=W\tilde{X}_{v_1} hv1(K)=WX~v1
    h v 2 ( K ) = W X ~ v 2 h_{v_2}^{(K)}=W\tilde{X}_{v_2} hv2(K)=WX~v2
    … \dots
    h v M ( K ) = W X ~ v M h_{v_M}^{(K)}=W\tilde{X}_{v_M} hvM(K)=WX~vM
    在这里插入图片描述

  5. Simplified GCN: Summary
    Simplified GCN分成两步:

    1. pre-processing step: precompute X ~ = A ~ K X \tilde{X}=\tilde{A}^KX X~=A~KX(可以在CPU上做)
    2. mini-batch training step:
      对每个mini-batch,随机抽样M个节点 { v 1 , v 2 , … , v M } \{v_1,v_2,\dots,v_M\} {v1,v2,,vM}
      计算其嵌入: h v 1 ( K ) = W X ~ v 1 , h v 2 ( K ) = W X ~ v 2 , … , h v M ( K ) = W X ~ v M h_{v_1}^{(K)}=W\tilde{X}_{v_1},h_{v_2}^{(K)}=W\tilde{X}_{v_2},\dots,h_{v_M}^{(K)}=W\tilde{X}_{v_M} hv1(K)=WX~v1,hv2(K)=WX~v2,,hvM(K)=WX~vM
      用该嵌入进行预测,计算M个数据点上的平均损失函数。
      应用SGD参数更新。
      在这里插入图片描述
  6. SGC与其他方法的比较

    1. 与neighbor sampling相比:SGC生成节点嵌入的效率更高(不需要对每个节点构建大计算图)
    2. 与Cluster-GCN相比:SGC的mini-batch节点可以从整体节点中完全随机地抽样,不需要从几个groups里面抽样。
      这样就可以减少训练过程中的SGD variance13
    3. 但这个模型的表现力也更低,因为生成节点嵌入的过程中没有非线性。
      在这里插入图片描述
      在这里插入图片描述
  7. 但事实上,在半监督学习节点分类benchmark上,simplified GCN和原始GNNs的表现力几乎相当,这是由于graph homophily14 的存在:
    很多节点分类任务的图数据都表现出homophily结构,即有边相连的节点对之间倾向于具有相同的标签。
    举例来说,在文献引用网络中的文献分类任务,引用文献往往是同类;在社交网络中给用户推荐电影的任务,社交网络中是朋友关系的用户往往倾向于喜欢相同的电影。
    在simplified GCN中,preprocessing阶段是用 A ~ \tilde{A} A~ 左乘 X X X K次,即pre-processed特征是迭代求其邻居节点特征平均值而得到的(如下图三),因此有边相连的节点倾向于有相似的pre-processed特征,这样模型就倾向于将有边相连的节点预测为同一标签,从而很好地对齐了很多节点分类benchmark数据集中的graph homophily性质。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  8. simplified GCN: summary

    1. simplified GCN去除了GCN中的非线性,并将其简化为对节点特征进行的简单pre-processing。
    2. 得到pre-processed特征后,就可以直接应用scalable mini-batch SGD直接优化参数。
    3. simplified GCN在节点分类benchmark中表现很好,这是因为特征pre-processing很好地对齐了现实世界预测任务中的graph homophily现象。
      在这里插入图片描述

  1. 可参考我之前写的笔记。
    原论文:
    Inductive Representation Learning on Large Graphs
    Hamilton et al. (2017) ↩︎ ↩︎

  2. Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks
    Chiang et al. KDD 2019 ↩︎ ↩︎

  3. Simplifying Graph Convolutional Networks
    Wu et al. ICML 2019 ↩︎ ↩︎ ↩︎

  4. 可参考我之前写的笔记:cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)_诸神缄默不语的博客-CSDN博客
    具体的关于这个RWR的relevance score感觉可以参考这两篇文:Fast Random Walk with Restart and Its ApplicationsSupervised and extended restart in random walks for ranking and link prediction in networks。我是没有看的啦,我感觉暂时还无此需要。 ↩︎

  5. scale free 无尺度网络
    其典型特征是在网络中的大部分节点只和很少节点连接,而有极少的节点与非常多的节点连接。
    可参考:无尺度网络 - 维基百科,自由的百科全书 ↩︎

  6. Redundancy-Free Computation Graphs for Graph Neural Networks ↩︎

  7. 这种按照边来计算message的信息的逻辑好像就是PyG那种计算方式的逻辑……但是实话实说我没太搞懂,就是,我能理解吧,差不多能理解,但是具体的还不懂。以后再慢慢看吧。如果读者诸位能搞懂请告诉我一声。 ↩︎

  8. 关于社区发现问题,可参考我之前写的博文:cs224w(图机器学习)2021冬季课程学习笔记16 Community Detection in Networks_诸神缄默不语的博客-CSDN博客 ↩︎ ↩︎

  9. vanilla有香子兰香味的; 香草味的; 普通的; 寻常的; 毫无特色的; ↩︎

  10. subgraph, induced subgraph等概念可参考我之前写的笔记:cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs_诸神缄默不语的博客-CSDN博客 ↩︎

  11. A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs
    Karypis et al. SIAM 1998 ↩︎

  12. 可参考我之前写的笔记。
    原论文:
    Semi-Supervised Classification with Graph Convolutional Networks
    Kipf & Welling ICLR 2017 ↩︎

  13. 就这个直观上可以理解为SGD每个mini-batch之间如果差异比较小、就每个mini-batch都能代表整体数据的话,应该就说SGD variance比较低。但是具体来说这个SGD variance是什么,我谷歌了一下感觉还是个比较复杂的话题,还有论文啥的……一时之间搞不懂,以后有缘再看吧。 ↩︎

  14. homophily:据我简单谷歌,homophily应该是一种同类相聚的倾向,一种理论。
    其他可以参考我之前写的这篇笔记:
    cs224w(图机器学习)2021冬季课程学习笔记6 Message Passing and Node Classification_诸神缄默不语的博客-CSDN博客 ↩︎

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值