该内容在论文中并没有涉及,但理解卷积和CNN对于GCN的理解有帮助,因为GCN是将CNN推广到新的数据结构:graph上面。
1.1与1.2的内容均来自视频:https://www.bilibili.com/video/BV1VV411478E/?spm_id_from=333.880.my_history.page.click&vd_source=9e34c29511733195fced9735e60f8683
卷积公式: ∫ 0 t f ( x ) g ( t − x ) d x \int _0^t f(x)g(t-x)dx ∫0tf(x)g(t−x)dx
f ( x ) f(x) f(x):在每一个时刻 x x x,都有 f ( x ) f(x) f(x)个蝴蝶煽动翅膀,如3
g ( y ) g(y) g(y):在一个蝴蝶煽动翅膀后, y y y时刻后,该蝴蝶煽动翅膀对引起飓风对影响为 g ( y ) g(y) g(y),如0.5
则在 x x x时刻的3只蝴蝶,经过了 y y y时刻,对 x + y x+y x+y时刻引起飓风的影响为 3 × 0.5 = 1.5 3 \times 0.5 = 1.5 3×0.5=1.5
假设t时刻发生了飓风,求 0 ~ t 0~t 0~t 时刻蝴蝶煽动翅膀对飓风的影响,则有公式: ∫ 0 t f ( x ) g ( t − x ) d x \int _0^t f(x)g(t-x)dx ∫0tf(x)g(t−x)dxy由此我们可以得到该问题中卷积的本质:累加过去对现在的影响
选取不同的卷积核,用卷积核乘3*3的像素矩阵做卷积,可以得到新的像素点,对图中所有的像素矩阵乘卷积核则可以得到新的图像。
其本质是:累加3*3个像素对目标像素的影响,得到目标像素。
由于graph不同于image,没有固定的结构,邻居的数量亦不相同,故将CNN推广到graph上时,GCN将对像素的卷积操作变成了对节点邻居的卷积操作,累加不同邻居对目标节点的影响,得到新的特征。
graph上的谱卷积公式:
g θ ⋆ x = U g θ U T x g_{\theta} \star x = U g_{\theta} U^T x gθ⋆x=UgθUTx
由于上式特征矩阵的乘法复杂度为 O ( N 2 ) O(N^2) O(N2),并且对于large graph是 L L L进行特征分解同样在计算上消耗巨大,所以要对 g θ ( Λ ) g_{\theta}(\Lambda) gθ(Λ)用切比雪夫多项式(Chebyshev polynomials)进行K阶近似:
g θ ′ ( Λ ) ≈ ∑ k = 0 K θ k ′ T k ( Λ ~ ) g_{\theta '}(\Lambda) ≈ \sum_{k=0}^{K}\theta ' _k T_k (\widetilde \Lambda) gθ′(Λ)≈k=0∑Kθk′Tk(Λ )
结合两个式子,得到总的谱图公式(复杂度为 O ( ∣ E ∣ ) O(|\mathcal{E}|) O(∣E∣),其中 E \mathcal{E} E为边的数量):
g θ ⋆ x ≈ ∑ k = 0 K θ k ′ T k ( L ~ ) x g_{\theta} \star x ≈ \sum_{k=0}^{K}\theta ' _k T_k (\widetilde L)x gθ⋆x≈k=0∑Kθk′Tk(L )x
设定参数:
这样,我们可以得到简化后的一阶近似线性公式:
g θ ⋆ x ≈ θ 0 ′ x + θ 1 ′ ( L − I N ) x = θ 0 ′ x − θ 1 ′ D − 1 2 A D − 1 2 x g_{\theta} \star x ≈ \theta_0'x + \theta_1'(L-I_N)x = \theta_0'x - \theta_1'D^{-\frac{1}{2}}AD^{-\frac{1}{2}}x gθ⋆x≈θ0′x+θ1′(L−IN)x=θ0′x−θ1′D−21AD−21x
通过限制参数数量来处理过拟合和减少每一层的计算量(如矩阵乘法),得到以下公式:
g θ ⋆ x ≈ θ ( I N + D − 1 2 A D − 1 2 ) x g_{\theta} \star x ≈ \theta(I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}})x gθ⋆x≈θ(IN+D−21AD−21)x
由于此时 I N + D − 1 2 A D − 1 2 I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}} IN+D−21AD−21的特征值取值范围为 [ 0 , 2 ] [0,2] [0,2],重复应用这种计算在神经网络中可能会导致数值不稳定和梯度爆炸/消失,所以进行了如下改变(对称规范化):
此时,可以得到新的公式(复杂度为 O ( ∣ E ∣ F C ) O(|\mathcal{E}|FC) O(∣E∣FC),其中 E \mathcal{E} E为边的数量, F F F为过滤器数量(即label的种数), C C C为每个节点的特征数量):
Z = D ~ − 1 2 A ~ D ~ − 1 2 X Θ Z = \widetilde D^{-\frac{1}{2}} \widetilde A \widetilde D^{-\frac{1}{2}} X \Theta Z=D −21A D −21XΘ
将上面的公式加上激活函数(作用:给模型加入非线性因素,解决线性模型的分类局限),我们可以得到GCN更新下一层节点信息的公式:
H ( l + 1 ) = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)}=σ(\widetilde D^{- \frac{1}{2}} \widetilde A \widetilde D^{- \frac{1}{2}} H^{(l)} W^{(l)} ) H(l+1)=σ(D −21A D −21H(l)W(l))
这一部分并没有出现在论文中,但给出了对称规范化式子处理数值不稳定和梯度爆炸/消失问题以外的更为直观的物理意义 ---- 削弱强邻居的影响
来自视频:https://www.bilibili.com/video/BV1Xy4y1i7sq/?spm_id_from=333.337.search-card.all.click&vd_source=9e34c29511733195fced9735e60f8683
首先, A ~ = A + I \widetilde A = A+I A =A+I的意义是给图上每个节点加上自环,这样在考虑节点邻居信息的同时会考虑节点本身的信息。
其次, D ~ − 1 2 A ~ D ~ − 1 2 \widetilde D^{- \frac{1}{2}} \widetilde A \widetilde D^{- \frac{1}{2}} D −21A D −21可以通过如下过程展开:
( D ~ − 1 2 A ~ D ~ − 1 2 H ) i = ( D ~ − 1 2 A ~ ) i D ~ − 1 2 H = ( ∑ k D ~ i k − 1 2 A ~ i ) D ~ − 1 2 H = D ~ i i − 1 2 ∑ j A ~ i j ∑ k D ~ j k − 1 2 H j = D ~ i i − 1 2 ∑ j A ~ i j D ~ j j − 1 2 H j = ∑ j 1 D ~ i i D ~ j j A ~ i j \begin{align*} (\widetilde D^{- \frac{1}{2}} \widetilde A \widetilde D^{- \frac{1}{2}}H)_i &= (\widetilde D^{- \frac{1}{2}} \widetilde A)_i \widetilde D^{- \frac{1}{2}}H \\ &= (\sum_k \widetilde D^{- \frac{1}{2}}_{ik} \widetilde A_i)\widetilde D^{- \frac{1}{2}}H \\ &= \widetilde D^{- \frac{1}{2}}_{ii} \sum_j \widetilde A_{ij} \sum_k \widetilde D^{- \frac{1}{2}}_{jk}H_j \\ &= \widetilde D^{- \frac{1}{2}}_{ii} \sum_j \widetilde A_{ij} \widetilde D^{- \frac{1}{2}}_{jj}H_j \\ &= \sum_j{\frac{1}{\sqrt{\widetilde D_{ii} \widetilde D_{jj}}} \widetilde A_{ij}} \end{align*} (D −21A D −21H)i=(D −21A )iD −21H=(k∑D ik−21A i)D −21H=D ii−21j∑A ijk∑D jk−21Hj=D ii−21j∑A ijD jj−21Hj=j∑D iiD jj1A ij
由此,我们得到了等式: D ~ − 1 2 A ~ D ~ − 1 2 = ∑ j 1 D ~ i i D ~ j j A ~ i j \widetilde D^{- \frac{1}{2}} \widetilde A \widetilde D^{- \frac{1}{2}} = \sum_j{\frac{1}{\sqrt{\widetilde D_{ii} \widetilde D_{jj}}} \widetilde A_{ij}} D −21A D −21=∑jD iiD jj1A ij,其意义为:对称规范化后的式子在加权累加节点 i 的邻居的时候,通过除以节点 i 和节点 j 的度的根号次来了削弱强邻居的影响。通过下图可以更好的理解:
在普通的GNN中,A会累加聚合B的信息,但实际A和B的差别很大:B有很多邻居,而A只认识B,显而易见B的影响力不等于A的影响力。GCN通过对称规范化缓减了这个问题,在累加的时候会除以AB度矩阵乘积的根号次来削弱强邻居的影响。
related work:前人已经对在图上运用神经网络有了尝试,但它们大部分不适用于large graph,或者对节点顺序有要求
作者代码:https://github.com/tkipf/gcn
源码解读:https://www.jianshu.com/p/bb38e9ca6347
简单实现(dgl,与源码方法略有不同,但更易理解):https://towardsdatascience.com/start-with-graph-convolutional-neural-networks-using-dgl-cf9becc570e1
原文描述:首先使用所有带标签的训练集数据训练一个本地的分类器,并用该本地分类器来指导未标记的节点的分类进行关系分类训练(本文对未标签的节点进行了10次迭代)
个人理解:首先先对所有有标签的数据进行训练,训练的时候会聚合无标签的节点(包括测试集和训练集中无标签的部分),然后再用训练完成的分类器对无标签的节点进行分类。
GCN的计算流程:
作者在文章的开始指名其他方法的loss设计如下:(该方法需要假设连接的节点倾向于拥有相同的标签,但实际上存在边不能代表两个节点具有相似性)
L = L o + λ L r e g L = L_o + \lambda L_{reg} L=Lo+λLreg
超参数的设定:
不同模型的准确率对比:
不同传播方法的准确率对比:
GPU vs CPU
疑问来源: 在梳理GCN的时候,对GCN如何做分类产生了疑问。在训练的时候邻接矩阵中包含了所有节点(包括训练集和测试集)的信息,那么在训练的过程中,训练集中的未标签数据和测试集的数据是不是起到了一样的作用?
解答:
https://blog.csdn.net/u012762410/article/details/127213748
https://datascience.stackexchange.com/questions/73654/what-is-difference-between-transductive-and-inductive-in-gnn
GNN中transductive和inductive learning
GCN是transductive learning。在正向传播的过程中,会训练所有节点(包括训练集中的未标签数据和测试集)的特征,而在反向传播的时候,对于第二层网络,会用带标签的节点计算loss进行反向传播,对于第一层网络,则不用关注标签的问题,用后一层传播来的数据进行计算即可。