诸神缄默不语-个人CSDN博文目录
cs224w(图机器学习)2021冬季课程学习笔记集合
VX号“PolarisRisingWar”可直接搜索添加作者好友讨论。
更新日志:
2021.11.16 优化公式排版
YouTube视频观看地址1 视频观看地址2 视频观看地址3 视频观看地址4
本章主要内容:
本章首先介绍了GNN在实践中遇到的难以应用到大图上的问题,指出了scale up GNN这一课题的研究重要性。
接下来介绍了三种解决这一问题的方法:GraphSAGE模型1的neighbor sampling,Cluster-GCN模型2和简化GNN模型(SGC模型3)。
neighbor sampling的问题:
在full-batch GNN中,所有节点嵌入都是根据前一层嵌入同时计算出的:
对所有 v ∈ V v\in V v∈V: 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(l−1),AGGR({hu(l)}u∈N(v)))
(其中 h u ( l ) h_u^{(\mathcal{l})} hu(l) 是message环节)
如图所示,对每一层来说,只需要计算2×边数次message(与邻居互相传递一次信息)7;对K层GNN来说,只需要计算2K×边数次message。
GNN整体计算代价依边数和层数线性增长,这是很快的。
从full-batch GNN中,我们可以发现,layer-wise的节点嵌入更新可以复用前一层的嵌入,这样就显著减少了neighbor sampling中产生的计算冗余问题。但是,由于GPU memory所限,这种layer-wise的更新方式不适用于大型图。
subgraph sampling
核心思想:从整个大型图中抽样出一个小子图,在子图上用GPU运行有效的layer-wise节点嵌入更新。如图所示:
核心问题:什么子图适用于训练GNNs?
我们知道GNN通过边来传递信息,从而更新节点嵌入。因此,子图需要尽量多地保持原图中的边连接结构。通过这种方式,子图上的GNN就可以生成更接近于原图GNN的节点嵌入。
subgraph sampling: case study
举例来说,下图中右边的两种子图,左边的子图更适用于训练GNN:保持了必要的社区结构8、边连接模式,没有产生孤立点。
利用社区结构
现实世界的图会呈现出社区结构,一个大型图可以被解构为多个小社区。
将一个社区抽样为一个子图,每个子图就能保持必要的原图局部connectivity模式。
Cluster-GCN
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}) ∣VC∣1⋅∑v∈VC∇lv(θ))就会变得不可靠,会在不同node group上波动剧烈,即variance高。这会让SGD收敛变慢。
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可以在组间流动。
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=Vt1∪⋯∪Vtq
提取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,v∈Vaggr})
这样 E a g g r E_{aggr} Eaggr 就包含了组间的边。
时间复杂度对比
对于用K层GNN生成 M M M ( < < N ) (<
neighbor sampling(每层抽样 H H H 个节点):每个节点的K层计算图的尺寸是 H K H^K HK,M个节点的计算代价就是 M ⋅ H K M\cdot H^K M⋅HK
Cluster-GCN: 对M个节点induced的subgraph运行message passing,子图共包含 M ⋅ D a v g M\cdot D_{avg} M⋅Davg 条边,对子图运行K层message passing的计算代价最多为 K ⋅ M ⋅ D a v g K\cdot M\cdot D_{avg} K⋅M⋅Davg
总结:用K层GNN生成 M M M ( < < N ) (<
neighbor-sampling(每层抽样 H H H 个节点): M ⋅ H K M\cdot H^K M⋅HK
Cluster-GCN: K ⋅ M ⋅ D a v g K\cdot M\cdot D_{avg} K⋅M⋅Davg
假设 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的很多。
Cluster-GCN总结
本节课讲SGC模型,这个模型是通过去除非线性激活函数简化了GCN12模型。原论文3 证明经简化后在benchmark数据集上效果没有怎么变差。Simplified GCN证明是对模型设计很scalable的。
mean-pool的GCN:
给定图 G = ( V , E ) G=(V,E) G=(V,E) ,输入节点特征 X v X_v Xv( v ∈ V v\in V v∈V), 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,…,K−1} 层:对所有节点 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(Wk⋅∣N(v)∣1∑u∈N(v)hv(k))(其中粉色字为经训练得到的参数矩阵,蓝色字部分为mean-pooling)
最终得到节点嵌入: z v = h v ( K ) z_v=h_v^{(K)} zv=hv(K)
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~=D−1/2AD−1/2(这个版本在实证上比 D − 1 / 2 A D^{-1/2}A D−1/2A 效果更好)
上图中,第一个公式就是GCN以邻居聚合形式进行的定义,第二个公式就是GCN的矩阵形式,其中 W W W 参数从左边移到右边可以考虑一下就因为 H H H 是 h T h^T hT 的堆叠,所以矩阵形式要乘 W W W 的参数的话就要倒到右边并取转置……就,这个把 W W W 脑内拆解一下应该就可以理解。
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
Simplified GCN: Summary
Simplified GCN分成两步:
SGC与其他方法的比较
但事实上,在半监督学习节点分类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性质。
simplified GCN: summary
可参考我之前写的笔记。
原论文:
Inductive Representation Learning on Large Graphs
Hamilton et al. (2017) ↩︎ ↩︎
Cluster-GCN: An Efficient Algorithm for Training Deep and Large Graph Convolutional Networks
Chiang et al. KDD 2019 ↩︎ ↩︎
Simplifying Graph Convolutional Networks
Wu et al. ICML 2019 ↩︎ ↩︎ ↩︎
可参考我之前写的笔记:cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)_诸神缄默不语的博客-CSDN博客
具体的关于这个RWR的relevance score感觉可以参考这两篇文:Fast Random Walk with Restart and Its Applications 和 Supervised and extended restart in random walks for ranking and link prediction in networks。我是没有看的啦,我感觉暂时还无此需要。 ↩︎
scale free 无尺度网络
其典型特征是在网络中的大部分节点只和很少节点连接,而有极少的节点与非常多的节点连接。
可参考:无尺度网络 - 维基百科,自由的百科全书 ↩︎
Redundancy-Free Computation Graphs for Graph Neural Networks ↩︎
这种按照边来计算message的信息的逻辑好像就是PyG那种计算方式的逻辑……但是实话实说我没太搞懂,就是,我能理解吧,差不多能理解,但是具体的还不懂。以后再慢慢看吧。如果读者诸位能搞懂请告诉我一声。 ↩︎
关于社区发现问题,可参考我之前写的博文:cs224w(图机器学习)2021冬季课程学习笔记16 Community Detection in Networks_诸神缄默不语的博客-CSDN博客 ↩︎ ↩︎
vanilla有香子兰香味的; 香草味的; 普通的; 寻常的; 毫无特色的; ↩︎
subgraph, induced subgraph等概念可参考我之前写的笔记:cs224w(图机器学习)2021冬季课程学习笔记15 Frequent Subgraph Mining with GNNs_诸神缄默不语的博客-CSDN博客 ↩︎
A Fast and High Quality Multilevel Scheme for Partitioning Irregular Graphs
Karypis et al. SIAM 1998 ↩︎
可参考我之前写的笔记。
原论文:
Semi-Supervised Classification with Graph Convolutional Networks
Kipf & Welling ICLR 2017 ↩︎
就这个直观上可以理解为SGD每个mini-batch之间如果差异比较小、就每个mini-batch都能代表整体数据的话,应该就说SGD variance比较低。但是具体来说这个SGD variance是什么,我谷歌了一下感觉还是个比较复杂的话题,还有论文啥的……一时之间搞不懂,以后有缘再看吧。 ↩︎
homophily:据我简单谷歌,homophily应该是一种同类相聚的倾向,一种理论。
其他可以参考我之前写的这篇笔记:
cs224w(图机器学习)2021冬季课程学习笔记6 Message Passing and Node Classification_诸神缄默不语的博客-CSDN博客 ↩︎