本文第一部分摘抄自一篇知乎上的回答如何理解 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的切比雪夫多项式的特殊处理,将传播过程变为:
这篇知乎上的文章后面还介绍了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\)设置为
这里的\(\tilde\Lambda=\frac{2}{\lambda_{max}}\Lambda-I_N\),保证了大小在[-1,1],满足了切比雪夫不等式的条件(即在\(\cos\)运算范围内)。\(\theta'_k\)是实数。
(为什么这里是约等于,是不是因为使用的不是\(\Lambda\),而是缩放过的\(\tilde\Lambda\)呢? #不解 )
将这个带入卷积式子中,得到:
简化为:
\[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\)能看做一个稀疏矩阵和稠密矩阵的乘积从而有效地计算(? #不解 )
参考文献:
标签:frac,卷积,矩阵,笔记,GCN,学习,tilde,theta,Lambda From: https://www.cnblogs.com/white514/p/17739021.html