学习笔记:GCN

发布时间 2023-10-01 17:22:45作者: white514

本文第一部分摘抄自一篇知乎上的回答如何理解 Graph Convolutional Network(GCN)?,第二部分是对Kipf这篇GCN论文的学习笔记。

目前还没必要都那么细,就“不求甚解”,只知道咋用吧。

1 不止Kipf的GCN

Kipf在2017年发S的EMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS并不是第一篇GCN论文,他也是在前人肩膀上取得的成果。下面从0开始记录GCN的诞生。

1.1 传统卷积

CNN中的卷积,也就是离散卷积,本质是一种加权求和:通过中心像素点与相邻像素点的加权和来实现特征提取,加权系数就是卷积核参数。

1.2 提取图结构(Graph)的方式

一种是空间维度,对每个节点分别计算它们的相邻节点
一种是图谱维度,从邻接矩阵的角度,转化为“频域”问题

1.3 为什么用拉普拉斯矩阵

拉普拉斯矩阵有三种:

  • Combinatorial Laplacian:\(L=D-A\)
  • Symmetric normalized Laplacian:\(L^{sys}=D^{-1/2}LD^{-1/2}\)
  • Random walk normalized Laplacian:\(L^{rw}=D^{-1}L\)
    GCN上常用的是\(L^{sys}\),其中\(D\)是度矩阵(对角矩阵),\(A\)是邻接矩阵。

拉普拉斯矩阵有很多良好的性质:

  • 是对阵并且半正定的,可以进行特征分解。
  • 一种解释说,\(L\)的特征向量,就相当于傅里叶变换中的\(e^{-i\omega x}\),第\(i\)行实际上反应了第\(i\)个节点在对其他所有节点产生扰动时所产生的增益累积
  • 表示了相邻关系
    (那为什么要偏向用Lsys呢 #不解 )

1.4 推广傅里叶变换

传统的[[傅里叶变换|傅里叶变换]]定义为:

\[F(\omega)=\mathcal{F}[f(t)]=\int_{}^{}f(t)e^{-i\omega t} dt \]

这里面\(F(\omega)\)是频域函数,\(f(t)\)是时域函数,\(e^{-i\omega t}\)是拉普拉斯算子的特征函数。

图的拉普拉斯算子就是拉普拉斯矩阵(缺一个证明 #不解 )。对拉普拉斯矩阵进行分解\(L=U\Lambda U^T\),这里\(\Lambda\)对角线上每个元素就是一个特征值,\(U\)上每一列就是一个特征向量,而这个特征向量就相当于傅里叶变换里的\(e^{-i\omega t}\)

仿照着,图上傅里叶变换为:\(F(\lambda_l)=\hat{f} (\lambda_l)=\sum_{i=1}^{N}{f(i) u_l^*(i)}\)
用矩阵的形式就是:\(\hat{f}=U^Tf\)

图上傅里叶逆变换为:\(f(i)=\sum_{l=1}^{N}{\hat{f}(\lambda_l) u_l(i)}\)
用矩阵的形式就是:\(f=U\hat{f}\)

1.5 推广卷积

卷积定理:函数卷积的傅里叶变换是函数傅立叶变换的乘积

\[f*h=\mathcal{F}^{-1}\left[ \hat{f}(\omega)\hat{h}(\omega) \right] \]

卷积核\(h\)的傅里叶变换写成对角矩阵的形式:\(\left(\begin{matrix}\hat h(\lambda_1) & \\&\ddots \\ &&\hat h(\lambda_n) \end{matrix}\right)\)
(为什么一定能写成对角矩阵的形式? #不解 )
那么谱域先进行傅里叶变换,再乘上卷积核,再进行傅里叶逆变换,这个过程就是:\((f*h)_G= U\hat hU^Tf\)
也可以写成:\((f*h)_G=U((U^Th)\odot(U^Tf))\),其中\(\odot\)是哈达马积

1.6 GCN简洁进化史

1.6.1 第一代GCN

Spectral Networks and Locally Connected Networks on Graphs直接摆出了最纯粹的图卷积:

\[y_{output}=\sigma \left(U g_\theta(\Lambda) U^T x \right) \]

其中\(g_\theta(\Lambda)\)是卷积核,\(\sigma(\cdot)\)是激活函数。它的缺点:

  • 每次传播要计算\(U\)\(diag(\theta_l )\)\(U^T\)的矩阵乘积,计算代价高
  • 卷积核不具有spatial localization
  • 卷积核需要\(n\)个参数

1.6.2 第二代GCN

Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering\(\hat h(\lambda_l)\)设计为\(\sum_{j=0}^K \alpha_j \lambda^j_l\),可以推出:\(U \sum_{j=0}^K \alpha_j \Lambda^j U^T =\sum_{j=0}^K \alpha_j U\Lambda^j U^T = \sum_{j=0}^K \alpha_j L^j\),这意味着图卷积简化为:

\[y_{output}=\sigma \left( \sum_{j=0}^{K-1} \alpha_j L^j x \right) \]

它的好处是:

  • 卷积核\(k\)个参数,远小于\(n\),参数复杂度降低了(不是同时意味着能力受到了限制吗,因为对每个邻居的改变的权重都相同了啊 #不解 )
  • 不需要做特征分解了
  • 卷积核具有spatial localization,\(K\)就是它的接受域

1.6.3 以Chebyshev多项式为卷积核

利用Chebyshev多项式作为卷积核是非常通用的形式
比如这篇文章第二部分的内容,通过对k=1的切比雪夫多项式的特殊处理,将传播过程变为:

\[H^{(l+1)}=\sigma\bigg(\tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}}H^{(l)}W^{(l)}\bigg) \]

这篇知乎上的文章后面还介绍了Local Connectivity、Parameter Sharing、可解释性、有向图问题、过渡平滑等内容,就不在这里列出来了。

2 Kipf的GCN

SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

作者:Thomas N.Kipf, Max Welling
论文地址:https://openreview.net/forum?id=SJU4ayYgl
代码地址(tensorflow):https://github.com/tkipf/gcn

2.1 谱图卷积

把图上的谱卷积定义为:

\[g_\theta\star x=Ug_\theta U^\top x \tag1 \]

\(U\)是正则化的图拉普拉斯\(L=I_N-D^{-\frac{1}{2}}AD^{-\frac{1}{2}}=U\Lambda U^\top\)的特征向量构成的矩阵,\(\Lambda\)是特征值组成的对角矩阵,\(U^\top x\)\(x\)的图傅里叶变换。可以把\(g_\theta\)理解成\(L\)的特征值的函数,如\(g_\theta(\Lambda)\)

由于矩阵分解计算量太大,因此使用切比雪夫多项式简化。
(矩阵分解复杂度好像是\(O(n^3)\)级别的)

\(n\)阶切比雪夫多项式:\(\cos n\theta=T_n(\cos\theta)\),即用关于\(\cos\theta\)\(n\)阶多项式来表示\(\cos n\theta\)
具有性质:\(T_0(x)=1,~T_1(x)=x,~T_k(x)=2xT_{k-1}(x)-T_{k-2}(x)\)

(此处省略证明:1.能用\(\cos\theta\)\(n\)阶多项式表示\(\cos n\theta\),且\(\cos^n\theta\)的系数为\(2^{n-1}\) ;2.递归式的推导)
\(g_\theta\)设置为

\[g_{\theta^{\prime}}(\Lambda)\approx\sum_{k=0}^K\theta_k^{\prime}T_k(\tilde{\Lambda}) \tag2 \]

这里的\(\tilde\Lambda=\frac{2}{\lambda_{max}}\Lambda-I_N\),保证了大小在[-1,1],满足了切比雪夫不等式的条件(即在\(\cos\)运算范围内)。\(\theta'_k\)是实数。
(为什么这里是约等于,是不是因为使用的不是\(\Lambda\),而是缩放过的\(\tilde\Lambda\)呢? #不解 )
将这个带入卷积式子中,得到:

\[g_{\theta'}\star x \approx U \left( \sum_{k=0}^K\theta_k^{\prime} T_k(\tilde{\Lambda}) \right) U^\top x \tag3 \]

简化为:

\[g_{\theta'}\star x \approx \sum_{k=0}^K\theta_k^{\prime} T_k(\tilde{L}) x \tag4 \]

其中\(\tilde L=\frac{2}{\lambda_{max}}L-I_N\),从而不再需要矩阵分解。\(\lambda_{max}\)可以用幂迭代法求,即利用\(v=L^mv_0\)求出近似的主特征向量,然后\(\lambda_{max}\approx v^TLv\)即可。
(3)简化为(4)是因为\(U \left( \sum_{k=0}^K\theta_k^{\prime} T_k(\tilde{\Lambda}) \right) U^\top =\sum_{k=0}^K\theta_k^{\prime} T_k(\tilde{U\Lambda U^\top})\),这个的证明用到了切比雪夫是多项式这一性质。注意,\(U\)是正交矩阵,具有性质:\(U^\top=U^{-1}\)

(4)是K局部的,即一个点的信息最多向外扩展到K远的邻点处。复杂度是O(|E|)的。因为\(U\Lambda^K U^\top\)即表示\(L^K\),邻接矩阵的K次幂,也就是K阶邻居的情况(路径数之类的)

( #不解 为什么是O(|E|)的,不需要算矩阵乘法吗?)

2.2 层级线性模型

令K=1,然后假定\(\lambda_{max}=2\),期待训练的参数能够修正这一设定,这样(4)就变成了:

\[g_{\theta'}\star x\approx\theta'_0x+\theta'_1\left(L-I_N\right)x=\theta'_0x-\theta'_1D^{-\frac{1}{2}}AD^{-\frac{1}{2}}x \tag5 \]

为了限制参数的数量以避免过拟合,我们可以改成这样:

\[g_\theta\star x\approx\theta\left(I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\right)x \tag6 \]

这里\(\theta=\theta_0'=-\theta_1'\)。这里\(I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\)的范围是[0,2]。多次重复这个操作会造成梯度消失/下降,因此使用这个重正则化技巧:\(I_N+D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\rightarrow\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}\),其中\(\tilde{A}=A+I_N,~\tilde{D}_{ii}=\sum_j\tilde{A}_{ij}\) 。最终得到的式子为:

\[Z=\tilde{D}^{-\frac12}\tilde{A}\tilde{D}^{-\frac12}X\Theta \tag7 \]

其中\(X\in\mathbb R^{N\times C}\)\(C\)是通道数(特征维度),\(\Theta\in\mathbb R^{C\times F}\)\(F\)是过滤器数。\(Z\in\mathbb R^{N\times F}\)是卷积信号矩阵。这个过滤操作的复杂度为\(\mathcal O(|\mathcal E|FC)\),其中\(\tilde AX\)能看做一个稀疏矩阵和稠密矩阵的乘积从而有效地计算(? #不解 )


参考文献:

  1. Chebyshev多项式作为GCN卷积核
  2. 证明(3)(4)等价
  3. 切比雪夫多项式的定义与推导
  4. 幂迭代法
  5. 知乎:如何理解 Graph Convolutional Network(GCN)?