前面讲了 Spectral-GNN Graph Neural Networks (GNN)(二):Spectral-GNN 引言和导入 的引言和导入。这一篇主要介绍这一类最经典的一条模型主线:GCN。
参考链接:
如何理解 Graph Convolutional Network(GCN)?-- Johnny Richards 的回答
如何理解 Graph Convolutional Network(GCN)?-- superbrother 的回答
了解 GCN 之前必须对离散卷积(或者说 CNN 中的卷积)有一个明确的认识:离散卷积本质就是一种加权求和。
CNN 中的卷积本质就是利用一个共享参数的过滤器(filter),通过计算中心像素点以及相邻像素点的加权和来构成 feature map 实现空间特征的提取,当然加权和系数就是卷积核的权重系数。那么卷积核的系数如何确定的呢?是随机化初值,然后根据误差函数通过反向传播梯度下降进行迭代优化。这是一个关键点,卷积核的参数通过优化才能实现特征提取的作用,GCN 的理论很大一部分工作就是为了引入可以优化的卷积参数。
这里提一句:这里的卷积是指深度学习(CNN)中的卷积,与数学中定义的卷积运算严格意义上是有区别的。最直观的就是:是否进行翻转,然后再进行对应元素的加权求和。
CNN处理的图像或者视频数据中像素点(pixel)是排列成成很整齐的矩阵(也就是很多论文中所提到的Euclidean Structure),与之相对应,科学研究中还有很多 Non Euclidean Structure 的数据,如社交网络、信息网络等。
为什么要研究 GCN 呢?
GCN 的本质目的就是用来提取拓扑图的空间特征,那么实现这个目标只有这一种途径吗?当然不是,在vertex domain (spatial domain) 和 spectral domain 实现目标是两种最主流的方式。
vertex domain (spatial domain)是非常直观的一种方式。就是聚合邻居节点的信息来更新本节点的特征,具体的实现可以参考本系列第一篇论文 Spatial-GNN Graph Neural Networks (GNN)(一):Spatial - GNN 。
spectral domain 就是 GCN 的理论基础了。这种思路就是希望借助图谱的理论来实现拓扑图上的卷积操作。从整个研究的时间进程来看:首先研究 GSP(graph signal processing)的学者定义了 graph 上的Fourier Transformation,进而定义了 graph 上的 convolution,最后与深度学习结合提出了Graph Convolutional Network。
上面讲到 GCN 就是借助图谱理论来实现拓扑图上的卷积操作。
Spectral Graph Theory 可以参考 wiki 百科 Spectral Graph Theory,简单的概括就是借助于图的拉普拉斯矩阵的特征值和特征向量来研究图的性质。
这个可以参考上一篇论文,拉普拉斯矩阵的作用和原理。Graph Neural Networks (GNN)(二):Spectral-GNN 引言和导入。
对于图 G = ( V , E ) G=(V, E) G=(V,E),其 Laplacian 矩阵的定义为 L = D − A L=D-A L=D−A,其中 L L L 是拉普拉斯矩阵, D D D 是顶点的度矩阵(一个对角矩阵),对角线元素依次为各顶点的度, A A A 是图的邻接矩阵。
这里要说明的是:常用的拉普拉斯矩阵实际有三种:
拉普拉斯矩阵矩阵有很多良好的性质:
1.拉普拉斯矩阵是对称矩阵,可以进行特征分解(谱分解),这就和 GCN 的 spectral domain 对应上了。
2. 拉普拉斯矩阵只在中心顶点和一阶相连的顶点上(1-hop neighbor)有非 0 元素,其余之处均为 0。
3. 通过拉普拉斯算子与拉普拉斯矩阵进行类比。图拉普拉斯矩阵,如果把它看作线性变换的话,它起的作用与数学分析中的拉普拉斯算子是一样的。也就是说拉普拉斯矩阵就是图上的拉普拉斯算子,或者说是离散的拉普拉斯算子。
GCN 的核心基于拉普拉斯矩阵的谱分解,文献中对于这部分内容没有讲解太多,初学者可能会遇到不少误区,所以先了解一下特征分解。
矩阵的谱分解,特征分解,对角化都是同一个概念。
不是所有的矩阵都可以特征分解,其充要条件为 n 阶方阵存在 n 个线性无关的特征向量。但是拉普拉斯矩阵是半正定对称矩阵,(半正定矩阵本身就是对称矩阵,此处这样写为了和下面的性质对应,避免混淆),有如下三个性质:
由上可以知道拉普拉斯矩阵一定可以谱分解,且分解后有特殊的形式。对于拉普拉斯矩阵的谱分解为:
L = U ( λ 1 ⋱ λ n ) U − 1 L=U\left(\begin{array}{ccc}\lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n}\end{array}\right) U^{-1} L=U⎝⎛λ1⋱λn⎠⎞U−1
其中 U = ( u 1 → , u 2 → , ⋯ , u n → ) U=(\overrightarrow{u_{1}}, \overrightarrow{u_{2}}, \cdots, \overrightarrow{u_{n}}) U=(u1,u2,⋯,un) 是列向量为单位特征向量的矩阵,其中 u l → \overrightarrow{u_{l}} ul 是列向量。 ( λ 1 ⋱ λ n ) \left(\begin{array}{ccc}\lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n}\end{array}\right) ⎝⎛λ1⋱λn⎠⎞ 是 n 个特征值构成的对角矩阵。其中 U U U 是正交矩阵,即 U U T = E U U^{T}=E UUT=E。所以特征分解也可写成:
L = U ( λ 1 ⋱ λ n ) U − 1 = U ( λ 1 ⋱ λ n ) U T L=U\left(\begin{array}{ccc}\lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n}\end{array}\right) U^{-1} =U\left(\begin{array}{ccc}\lambda_{1} & & \\ & \ddots & \\ & & \lambda_{n}\end{array}\right) U^{T} L=U⎝⎛λ1⋱λn⎠⎞U−1=U⎝⎛λ1⋱λn⎠⎞UT
文献中都是最后导出的这个公式,但大家不要误解,特征分解最右边的是特征矩阵的逆,只是拉普拉斯矩阵的性质才可以写成特征矩阵的转置。
把传统的傅里叶变换以及卷积迁移到 Graph 上来,核心工作其实就是把拉普拉斯算子的特征函数 e − i ω t e^{-i \omega t} e−iωt 变为 Graph 对应的拉普拉斯矩阵的特征向量。
传统的傅里叶变换定义为: F ( ω ) = F [ f ( t ) ] = ∫ f ( t ) e − i ω t d t F(\omega)=\mathcal{F}[f(t)]=\int f(t) e^{-i \omega t} d t F(ω)=F[f(t)]=∫f(t)e−iωtdt,信号 f ( t ) f(t) f(t) 与基函数 e − i ω t e^{-i \omega t} e−iωt 的积分。那么为什么用 e − i ω t e^{-i \omega t} e−iωt 作为基函数呢? 数学上看, e − i ω t e^{-i \omega t} e−iωt 是拉普拉斯算子的特征函数(满足特征方程), ω \omega ω 就和特征值有关。
广义的特征方程: A V = λ V A V=\lambda V AV=λV,其中 A A A 是一种变换, V V V 是特征向量或者特征函数, λ \lambda λ 是特征值。 e − i ω t e^{-i \omega t} e−iωt 满足 Δ e − i ω t = ∂ 2 ∂ t 2 e − i ω t = − ω 2 e − i ω t \Delta e^{-i \omega t}=\frac{\partial^{2}}{\partial t^{2}} e^{-i \omega t}=-\omega^{2} e^{-i \omega t} Δe−iωt=∂t2∂2e−iωt=−ω2e−iωt,当然 e − i ω t e^{-i \omega t} e−iωt 就是变换 Δ \Delta Δ 的特征函数, ω \omega ω 就和特征值密切相关。
处理 Graph 问题的时候,用到拉普拉斯矩阵(拉普拉斯矩阵就是离散拉普拉斯算子),自然就去找拉普拉斯矩阵的特征向量了。 L L L 是拉普拉斯矩阵, V V V 是其特征向量,自然满足: L V = λ V L V=\lambda V LV=λV。
离散卷积就是一种内积形式: F ( λ l ) = f ^ ( λ l ) = ∑ i = 1 N f ( i ) u l ∗ ( i ) F\left(\lambda_{l}\right)=\hat{f}\left(\lambda_{l}\right)=\sum_{i=1}^{N} f(i) u_{l}^{*}(i) F(λl)=f^(λl)=∑i=1Nf(i)ul∗(i), f f f 是 Graph 上的 N 维向量, f ( i ) f(i) f(i) 与 Graph 的顶点一一对应, v l ( i ) v_{l}(i) vl(i) 表示第 l l l 个特征向量的第 i i i 个分量。那么特征值(频率) λ l \lambda_{l} λl 下的 f f f 的 Graph 傅里叶变换就是与 λ l \lambda_{l} λl 对应的特征向量 u l u_{l} ul 进行内积运算。上述的内积运算是在复数空间中定义的,所以采用了 u l ∗ ( i ) u_{l}^{*}(i) ul∗(i),也就是特征向量 u l u_{l} ul 的共轭。
利用卷积乘法将 Graph 上的傅里叶变换推广到卷积形式:
( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ) = ( u 1 ( 1 ) u 1 ( 2 ) … u 1 ( N ) u 2 ( 1 ) u 2 ( 2 ) … u 2 ( N ) ⋮ ⋮ ⋱ ⋮ u N ( 1 ) u N ( 2 ) … u N ( N ) ) ( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) \left(\begin{array}{c}\hat{f}\left(\lambda_{1}\right) \\ \hat{f}\left(\lambda_{2}\right) \\ \vdots \\ \hat{f}\left(\lambda_{N}\right)\end{array}\right)=\left(\begin{array}{cccc}u_{1}(1) & u_{1}(2) & \dots & u_{1}(N) \\ u_{2}(1) & u_{2}(2) & \dots & u_{2}(N) \\ \vdots & \vdots & \ddots & \vdots \\ u_{N}(1) & u_{N}(2) & \dots & u_{N}(N)\end{array}\right)\left(\begin{array}{c}f(1) \\ f(2) \\ \vdots \\ f(N)\end{array}\right) ⎝⎜⎜⎜⎛f^(λ1)f^(λ2)⋮f^(λN)⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛u1(1)u2(1)⋮uN(1)u1(2)u2(2)⋮uN(2)……⋱…u1(N)u2(N)⋮uN(N)⎠⎟⎟⎟⎞⎝⎜⎜⎜⎛f(1)f(2)⋮f(N)⎠⎟⎟⎟⎞
即 f f f 在 Graph 傅里叶变换的矩阵形式为:
f ^ = U T f \hat{f}=U^{T} f f^=UTf
Graph 上的傅里叶逆变换: 类似的传统的傅里叶逆变换是对频率 ω \omega ω 求积分: F − 1 [ F ( ω ) ] = 1 2 Π ∫ F ( ω ) e i ω t d ω \mathcal{F}^{-1}[F(\omega)]=\frac{1}{2 \Pi} \int F(\omega) e^{i \omega t} d \omega F−1[F(ω)]=2Π1∫F(ω)eiωtdω,迁移到 Graph 上变为对特征值 λ l \lambda_{l} λl 求和: f ( i ) = ∑ l = 1 N f ^ ( λ l ) u l ( i ) f(i)=\sum_{l=1}^{N} \hat{f}\left(\lambda_{l}\right) u_{l}(i) f(i)=∑l=1Nf^(λl)ul(i),利用矩阵乘法将Graph上的傅里叶逆变换推广到矩阵形式:
( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) = ( u 1 ( 1 ) u 2 ( 1 ) … u N ( 1 ) u 1 ( 2 ) u 2 ( 2 ) … u N ( 2 ) ⋮ ⋮ ⋱ ⋮ u 1 ( N ) u 2 ( N ) … u N ( N ) ) ( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ N ) ) \left(\begin{array}{c}f(1) \\ f(2) \\ \vdots \\ f(N)\end{array}\right)=\left(\begin{array}{cccc}u_{1}(1) & u_{2}(1) & \dots & u_{N}(1) \\ u_{1}(2) & u_{2}(2) & \dots & u_{N}(2) \\ \vdots & \vdots & \ddots & \vdots \\ u_{1}(N) & u_{2}(N) & \dots & u_{N}(N)\end{array}\right)\left(\begin{array}{c}\hat{f}\left(\lambda_{1}\right) \\ \hat{f}\left(\lambda_{2}\right) \\ \vdots \\ \hat{f}\left(\lambda_{N}\right)\end{array}\right) ⎝⎜⎜⎜⎛f(1)f(2)⋮f(N)⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛u1(1)u1(2)⋮u1(N)u2(1)u2(2)⋮u2(N)……⋱…uN(1)uN(2)⋮uN(N)⎠⎟⎟⎟⎞⎝⎜⎜⎜⎛f^(λ1)f^(λ2)⋮f^(λN)⎠⎟⎟⎟⎞
即 f f f 在 Graph 傅里叶逆变换的矩阵形式为:
f = U f ^ f=U \hat{f} f=Uf^
在上面的基础上,利用卷积定理类比来将卷积运算,推广到 Graph 上。
卷积定理:函数卷积的傅里叶变换是函数傅立叶变换的乘积,即对于函数 f ( t ) f(t) f(t) 与 h ( t ) h(t) h(t) 两者的卷积就是其函数傅立叶变换乘积的逆变换。
f ∗ h = F − 1 [ f ^ ( ω ) h ^ ( ω ) ] = 1 2 Π ∫ f ^ ( ω ) h ^ ( ω ) e i ω t d ω f * h=\mathcal{F}^{-1}[\hat{f}(\omega) \hat{h}(\omega)]=\frac{1}{2 \Pi} \int \hat{f}(\omega) \hat{h}(\omega) e^{i \omega t} d \omega f∗h=F−1[f^(ω)h^(ω)]=2Π1∫f^(ω)h^(ω)eiωtdω
类比到 Graph 上并把傅里叶变换的定义带入, f f f 与卷积核 h h h 在 Graph 上的卷积可按照下列步骤求出:
1. f f f 的傅里叶变换为: f ^ = U T f \hat{f}=U^{T} f f^=UTf。
2. 卷积核 h h h 的傅里叶变换写成对角矩阵的形式就是: ( h ^ ( λ 1 ) ⋱ h ^ ( λ n ) ) \left(\begin{array}{ccc}\hat{h}\left(\lambda_{1}\right) & & \\ & \ddots & \\ & & \hat{h}\left(\lambda_{n}\right)\end{array}\right) ⎝⎛h^(λ1)⋱h^(λn)⎠⎞, h ^ ( λ l ) = ∑ i = 1 N h ( i ) u l ∗ ( i ) \hat{h}\left(\lambda_{l}\right)=\sum_{i=1}^{N} h(i) u_{l}^{*}(i) h^(λl)=∑i=1Nh(i)ul∗(i),是根据需要设计的卷积核 h h h 在 Graph 上的傅里叶变换。
3. 两者的傅立叶变换乘积即为: ( h ^ ( λ 1 ) ⋱ h ^ ( λ n ) ) U T f \left(\begin{array}{ccc}\hat{h}\left(\lambda_{1}\right) & & \\ & \ddots & \\ & & \hat{h}\left(\lambda_{n}\right)\end{array}\right) U^{T} f ⎝⎛h^(λ1)⋱h^(λn)⎠⎞UTf
4. 再乘以 U U U 求两者傅立叶变换乘积的逆变换,则求出卷积: ( f ∗ h ) G = U ( h ^ ( λ 1 ) ⋱ h ^ ( λ n ) ) U T f (f * h)_{G}=U\left(\begin{array}{ccc}\hat{h}\left(\lambda_{1}\right) & & \\ & \ddots & \\ & & \hat{h}\left(\lambda_{n}\right)\end{array}\right) U^{T} f (f∗h)G=U⎝⎛h^(λ1)⋱h^(λn)⎠⎞UTf
注:很多论文中的Graph卷积公式为: ( f ∗ h ) G = U ( ( U T h ) ⊙ ( U T f ) ) (f * h)_{G}=U\left(\left(U^{T} h\right) \odot\left(U^{T} f\right)\right) (f∗h)G=U((UTh)⊙(UTf)),其中 ⊙ \odot ⊙ 表示 Hadamard product(哈达马积),对于两个维度相同的向量、矩阵、张量进行对应位置的逐元素乘积运算。其实两者是完全等价的。
傅里叶变换一个本质理解就是:把任意一个函数表示成了若干个正交函数(由 sin, cos 构成)的线性组合。 通过上一节中的公式 f = U f ^ f=U \hat{f} f=Uf^ 看出 graph傅里叶变换也把graph 上定义的任意向量 f f f 表示成了拉普拉斯矩阵特征向量的线性组合,即: f = f ^ ( λ 1 ) u 1 + f ^ ( λ 2 ) u 2 + ⋯ + f ^ ( λ n ) u n f=\hat{f}\left(\lambda_{1}\right) u_{1}+\hat{f}\left(\lambda_{2}\right) u_{2}+\cdots+\hat{f}\left(\lambda_{n}\right) u_{n} f=f^(λ1)u1+f^(λ2)u2+⋯+f^(λn)un。那么:为什么 graph 上任意的向量 f f f 都可以表示成这样的线性组合?原因在于 ( u 1 → , u 2 → , ⋯ , u n → ) (\overrightarrow{u_{1}}, \overrightarrow{u_{2}}, \cdots, \overrightarrow{u_{n}}) (u1,u2,⋯,un) 是 graph 上 n n n 维空间中的 n n n 个线性无关的正交向量,由线性代数的知识可以知道: n n n 维空间中 n n n 个线性无关的向量可以构成空间的一组基,而且拉普拉斯矩阵的特征向量还是一组正交基。
在 graph 空间上无法可视化展示“频率”这个概念,那么从特征方程上来抽象理解。将拉普拉斯矩阵 L L L 的 n n n 个非负特征向量,从小到大排列为 λ 1 ≤ λ 2 ≤ ⋯ ≤ λ n \lambda_{1} \leq \lambda_{2} \leq \cdots \leq \lambda_{n} λ1≤λ2≤⋯≤λn,而且最小的特征值 λ 1 = 0 \lambda_{1}=0 λ1=0,因为 n n n 维的全 1 向量的特征值为 0(由 L L L 的定义可以得出): L ( 1 1 ⋮ 1 ) = 0 L\left(\begin{array}{c}1 \\ 1 \\ \vdots \\ 1\end{array}\right)=0 L⎝⎜⎜⎜⎛11⋮1⎠⎟⎟⎟⎞=0。
从特征方程的数学理解来看: L u = λ u L u=\lambda u Lu=λu,在由Graph确定的 n n n 维空间中,越小的特征值 λ l \lambda_{l} λl 表明:拉普拉斯矩阵 L L L 其所对应的基 u l u_{l} ul 上的分量、“信息”越少,那么当然就是可以忽略的低频部分了。
其实图像压缩就是这个原理,把像素矩阵特征分解后,把小的特征值(低频部分)全部变成 0;PCA 降维也是同样的,把协方差矩阵特征分解后,按从大到小取出前K个特征值对应的特征向量作为新的“坐标轴”。
Deep learning 中的 Graph Convolution 直接看上去会和上面推导出的图卷积公式有很大的不同,但是万变不离其宗,推导的本源是:
( f ∗ h ) G = U ( h ^ ( λ 1 ) ⋱ h ^ ( λ n ) ) U T f (f * h)_{G}=U\left(\begin{array}{ccc}\hat{h}\left(\lambda_{1}\right) & & \\ & \ddots & \\ & & \hat{h}\left(\lambda_{n}\right)\end{array}\right) U^{T} f (f∗h)G=U⎝⎛h^(λ1)⋱h^(λn)⎠⎞UTf
本篇博客最开始已经解释得很清楚:Deep learning 中的 Convolution 就是要设计含有 trainable 共享参数的 kernel,从上式看很直观:graph convolution 中的卷积参数就是 diag ( h ^ ( λ l ) ) \operatorname{diag}\left(\hat{h}\left(\lambda_{l}\right)\right) diag(h^(λl))
Spectral Networks and Locally Connected Networks on Graphs 中简单粗暴地把 diag ( h ^ ( λ l ) ) \operatorname{diag}\left(\hat{h}\left(\lambda_{l}\right)\right) diag(h^(λl)) 变成了卷积核 diag ( θ l ) \operatorname{diag}\left(\theta_{l}\right) diag(θl),也就是:
y output = σ ( U g θ ( Λ ) U T x ) y_{\text {output}}=\sigma\left(U g_{\theta}(\Lambda) U^{T} x\right) youtput=σ(Ugθ(Λ)UTx)。
(为避免混淆,本文中称 g θ ( Λ ) g_{\theta}(\Lambda) gθ(Λ) 是卷积核, U g θ ( Λ ) U T U g_{\theta}(\Lambda) U^{T} Ugθ(Λ)UT 的运算结果为卷积运算矩阵)。
g θ ( Λ ) = ( θ 1 ⋱ θ n ) g_{\theta}(\Lambda)=\left(\begin{array}{ccc}\theta_{1} & & \\ & \ddots & \\ & & \theta_{n}\end{array}\right) gθ(Λ)=⎝⎛θ1⋱θn⎠⎞
这就是标准的第一代 GCN 中的 layer 了,其中 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 是激活函数, Θ = ( θ 1 , θ 2 , ⋯ , θ n ) \Theta=\left(\theta_{1}, \theta_{2}, \cdots, \theta_{n}\right) Θ=(θ1,θ2,⋯,θn) 就跟神经网络中的 weight 一样是任意的参数,通过初始化赋值然后利用误差反向传播进行调整, x x x 就是 graph 上对应于每个顶点的 feature vector(由特数据集提取特征构成的向量)。
第一代的参数方法存在着一些弊端:主要在于:
Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering 把 h ^ ( λ l ) \hat{h}\left(\lambda_{l}\right) h^(λl) 巧妙地设计成了 ∑ i = 0 K α j λ l j \sum_{i=0}^{K} \alpha_{j} \lambda_{l}^{j} ∑i=0Kαjλlj,也就是:
y output = σ ( U g θ ( Λ ) U T x ) y_{\text {output}}=\sigma\left(U g_{\theta}(\Lambda) U^{T} x\right) youtput=σ(Ugθ(Λ)UTx)
g θ ( Λ ) = ( ∑ j = 0 K α j λ 1 j ⋱ ∑ j = 0 K α j λ n j ) g_{\theta}(\Lambda)=\left(\begin{array}{ccc}\sum_{j=0}^{K} \alpha_{j} \lambda_{1}^{j} & & \\ & \ddots & \\ & & \sum_{j=0}^{K} \alpha_{j} \lambda_{n}^{j}\end{array}\right) gθ(Λ)=⎝⎜⎛∑j=0Kαjλ1j⋱∑j=0Kαjλnj⎠⎟⎞
上面的公式仿佛还什么都看不出来,下面利用矩阵乘法进行变换,来一探究竟。
( ∑ j = 0 K α j λ 1 j ⋱ ∑ j = 0 K α j λ n j ) = ∑ j = 0 K α j Λ j \left(\begin{array}{ccc}\sum_{j=0}^{K} \alpha_{j} \lambda_{1}^{j} & & \\ & \ddots & \\ & & \sum_{j=0}^{K} \alpha_{j} \lambda_{n}^{j}\end{array}\right)=\sum_{j=0}^{K} \alpha_{j} \Lambda^{j} ⎝⎜⎛∑j=0Kαjλ1j⋱∑j=0Kαjλnj⎠⎟⎞=∑j=0KαjΛj
进而推导出:
U ∑ j = 0 K α j Λ j U T = ∑ j = 0 K α j U Λ j U T = ∑ j = 0 K α j L j 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} U∑j=0KαjΛjUT=∑j=0KαjUΛjUT=∑j=0KαjLj
其中: L 2 = U Λ U T U Λ U T = U Λ 2 U T L^{2}=U \Lambda U^{T} U \Lambda U^{T}=U \Lambda^{2} U^{T} L2=UΛUTUΛUT=UΛ2UT 且 U T U = E U^{T} U=E UTU=E
于是: y output = σ ( ∑ j = 0 K − 1 α j L j x ) y_{\text {output}}=\sigma\left(\sum_{j=0}^{K-1} \alpha_{j} L^{j} x\right) youtput=σ(∑j=0K−1αjLjx) 其中 ( α 0 , α 1 , ⋯ , α K − 1 ) \left(\alpha_{0}, \alpha_{1}, \cdots, \alpha_{K-1}\right) (α0,α1,⋯,αK−1) 是任意的参数,通过初始化赋值然后利用误差反向传播进行调整。
这样设计的卷积核的好处:
更直观的: K = 1 K = 1 K=1 就是对每个顶点上一阶 neighbor 的 feature 进行加权求和,如下图所示:
同理, K = 2 K = 2 K=2 的情形如下所示:
注:上图只是以一个顶点作为实例,GCN 每一次卷积对所有的顶点都完成了图示的操作。
这里是不是发现和 Spatial GNN 很相似啊,是的。其实所有 GNN 本质都是一样的,只是出发点不同,最后殊途同归。
Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering 利用Chebyshev多项式代替卷积核,就可以得到下式:
g θ ( Λ ) = ∑ k = 0 K − 1 β k T k ( Λ ~ ) g_{\theta}(\Lambda)=\sum_{k=0}^{K-1} \beta_{k} T_{k}(\tilde{\Lambda}) gθ(Λ)=∑k=0K−1βkTk(Λ~)
其中, T k ( ⋅ ) T_{k}(\cdot) Tk(⋅) 是 k k k 阶的 Chebyshev 多项式, β k \beta_{k} βk 是对应的系数 ( ( ( 也就是训续中迭代更新的参数)。 Λ ~ \tilde{\Lambda} Λ~ 是 re-scaled 的特征值对角矩阵, 进行这个 shift 变换的原因是Chebyshev 多项式的输入要在 [-1,1] 之间,具体操作是: Λ ~ = 2 Λ / λ max − I \tilde{\Lambda}=2 \Lambda / \lambda_{\max }-I Λ~=2Λ/λmax−I, λ m a x \lambda_{m a x} λmax 是最大的特征值。最后得到的 GCN 层就是:
y = σ ( ∑ k = 0 K − 1 β k T k ( U Λ ~ U T ) x ) y=\sigma\left(\sum_{k=0}^{K-1} \beta_{k} T_{k}\left(U \tilde{\Lambda} U^{T}\right) x\right) y=σ(∑k=0K−1βkTk(UΛ~UT)x)
因为 L = U Λ U T L=U \Lambda U^{T} L=UΛUT,代入可以得:
y = σ ( ∑ k = 0 K − 1 β k T k ( L ~ ) x ) y=\sigma\left(\sum_{k=0}^{K-1} \beta_{k} T_{k}(\tilde{L}) x\right) y=σ(∑k=0K−1βkTk(L~)x)
其中, L ~ = 2 L / λ m a x − I \tilde{L}=2 L / \lambda_{max}-I L~=2L/λmax−I 。这样变换的好处在于:计算过程无需再进行特征向量分解。
在实际运算过程中,可以利用 Chebyshev 多项式的性质,进行递推:
T k ( L ~ ) = 2 L ~ T k − 1 ( L ~ ) − T k − 2 ( L ~ ) T_{k}(\tilde{L})=2 \tilde{L} T_{k-1}(\tilde{L})-T_{k-2}(\tilde{L}) Tk(L~)=2L~Tk−1(L~)−Tk−2(L~)
T 0 ( L ~ ) = I , T 1 ( L ~ ) = L ~ T_{0}(\tilde{L})=I, T_{1}(\tilde{L})=\tilde{L} T0(L~)=I,T1(L~)=L~
这样 filter 操作的复杂度为: O ( K ∣ E ∣ ) ≪ O ( n 2 ) \mathcal{O}(K|\mathcal{E}|) \ll \mathcal{O}\left(n^{2}\right) O(K∣E∣)≪O(n2),其中 ∣ E ∣ |\mathcal{E}| ∣E∣ 是边数。
Semi-Supervised Classification with Graph Convolutional Networks 进一步简化: K = 1 K = 1 K=1
y ≈ ∑ k = 0 1 θ k ′ T k ( L ~ ) x = θ 0 ′ x + θ 1 ′ ( L − I ) x = θ 0 ′ x − θ 1 ′ D − 1 / 2 A D − 1 / 2 x \begin{aligned} y & \approx \sum_{k=0}^{1} \theta_{k}^{\prime} T_{k}(\tilde{L}) \mathbf{x} \\ &=\theta_{0}^{\prime} \mathbf{x}+\theta_{1}^{\prime}(\mathbf{L}-\mathbf{I}) \mathbf{x} \\ &=\theta_{0}^{\prime} \mathbf{x}-\theta_{1}^{\prime} \mathbf{D}^{-1 / 2} \mathbf{A} \mathbf{D}^{-1 / 2} \mathbf{x} \end{aligned} y≈k=0∑1θk′Tk(L~)x=θ0′x+θ1′(L−I)x=θ0′x−θ1′D−1/2AD−1/2x
因为 θ \theta θ 是个filter 的 parameter, 所以可以 θ = θ 0 ′ = − θ 1 ′ \theta=\theta_{0}^{\prime}=-\theta_{1}^{\prime} θ=θ0′=−θ1′ 那 么这个时候就变成了
y ≈ θ ( I + D − 1 / 2 A D − 1 / 2 ) x y \approx \theta\left(\mathbf{I}+\mathbf{D}^{-1 / 2} \mathbf{A} \mathbf{D}^{-1 / 2}\right) \mathbf{x} y≈θ(I+D−1/2AD−1/2)x
作者表示 I + D − 1 / 2 A D − 1 / 2 \mathbf{I}+\mathbf{D}^{-1 / 2} \mathbf{A} \mathbf{D}^{-1 / 2} I+D−1/2AD−1/2 的特征值范围为 [0, 2],重复多次使用这个操作算子会导致数值不稳定,因此作者使用了一种 renormalization trick:
I + D − 1 2 A D − 1 2 → D ~ − 1 2 A ~ D ~ − 1 2 I+D^{-\frac{1}{2}} A D^{-\frac{1}{2}} \rightarrow \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} I+D−21AD−21→D~−21A~D~−21
其中 A ~ = A + I N \tilde{A}=A+I_{N} A~=A+IN 以及 D ~ i i = ∑ j A ~ i j \tilde{D}_{i i}=\sum_{j} \tilde{A}_{i j} D~ii=∑jA~ij,因此最后的经典 GCN 就是:
y ≈ θ ( D ~ − 1 2 A ~ D ~ − 1 2 ) x y \approx \theta\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}\right) \mathbf{x} y≈θ(D~−21A~D~−21)x
令 A ^ = D ~ − 1 2 A ~ D ~ − 1 2 \hat{A}=\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} A^=D~−21A~D~−21,一个两层的经典 GCN 就是:
Z = f ( X , A ) = softmax ( A ^ ReLU ( A ^ X W ( 0 ) ) W ( 1 ) ) Z=f(X, A)=\operatorname{softmax}\left(\hat{A} \operatorname{ReLU}\left(\hat{A} X W^{(0)}\right) W^{(1)}\right) Z=f(X,A)=softmax(A^ReLU(A^XW(0))W(1))
X ∈ R N × C X \in \mathbb{R}^{N \times C} X∈RN×C 表明每个节点特征维度为 C C C,然后参数 W ∈ R C × F W \in \mathbb{R}^{C \times F} W∈RC×F,边数为 ∣ E ∣ |\mathcal{E}| ∣E∣,filter 算子的复杂度为: O ( ∣ E ∣ F C ) \mathcal{O}(|\mathcal{E}| F C) O(∣E∣FC)。
CNN中有两大核心思想:网络局部连接,卷积核参数共享。那么我们不禁会联想:这两点在 GCN 中是怎样的呢?以下图的 graph 结构为例来探究一下。
y = σ ( ∑ j = 0 K − 1 α j L j x ) y=\sigma\left(\sum_{j=0}^{K-1} \alpha_{j} L^{j} x\right) y=σ(∑j=0K−1αjLjx),很明显 α j \alpha_{j} αj 是可学习的参数,可以看到 α j \alpha_{j} αj 与 L j L^{j} Lj 保持一致,我们知道 L j L^{j} Lj 对应着 j j j 阶 neighbor,这意味着在同阶的邻居上参数共享(可以学习的参数相同),不同阶的邻居上参数不共享(可以学习的参数不同)。
优点:这样的共享方式是有“物理意义”的,因为我们知道 graph 通常本身是有 local stationary 性质的。也就是说随着 neighbor 阶数的增加,顶点间的相关性递减(相当于距离近的邻域内相关性强)。这种共享方式,本质上可以很容易实现上述性质。参数很少,如果是超大规模的图,可以利用这种方式。
缺点:参数太少了,只有 K K K 个,使得模型无法很好地实现在同阶的邻域上分配不同的权重给不同的邻居(也就是 GAT 论文里说的 enable specifying different weights to different nodes in a neighborhood)
H l + 1 = σ ( D ^ − 1 2 A ^ D ^ − 1 2 H l W l ) H^{l+1}=\sigma\left(\hat{D}^{-\frac{1}{2}} \hat{A} \hat{D}^{-\frac{1}{2}} H^{l} W^{l}\right) Hl+1=σ(D^−21A^D^−21HlWl)
H 0 = x H^{0}=x H0=x
其中 A A A 是 graph 的邻接短阵, A ^ = A + I \quad \hat{A}=A+I A^=A+I 是为了实现 self-accessible, D ^ \quad \hat{D} D^ 是 A ^ \hat{A} A^ 中每个顶点的度矩阵。运算 D ^ − 1 2 A ^ D ^ − 1 2 \hat{D}^{-\frac{1}{2}} \hat{A} \hat{D}^{-\frac{1}{2}} D^−21A^D^−21 是为了对 A ^ \hat{A} A^ 进行归一化, 防止在运算中出现数值不稳定的情况。
这个版本中, 记 Y l = D ^ − 1 2 A ^ D ^ − 1 2 H l Y^{l}=\hat{D}^{-\frac{1}{2}} \hat{A} \hat{D}^{-\frac{1}{2}} H^{l} Yl=D^−21A^D^−21Hl ,这个运算可以理解为实现了空间信息的聚合,类似于下图。其中第 0 层的输入,是原始的特征,以后每增加一层,就会多聚合一阶 neighbor 上的信息( l l l 层就对每个顶点融合了 l l l 阶邻域的信息) 。
很显然模型可学习的参数是 W l , Y l W l W^{l}, Y^{l} W^{l} Wl,YlWl 进行了线性变换, 我个人认为是实现了 feature augment。也就是说模型在每一层共享了用于特征增强的参数变化矩阵。很显然, 这个矩阵维度与顶点数目或者每个顶点的度无关, 于是说这是一个在同层内顶点上共享的参数矩阵。
优点:这样的共享方式, W l ^{l} l 的维度是可以进行调节的,与顶点的数目无关,使得模型可以用于大规模的 graph 数据集。另一方面这个模型可以完成图结构 train 在 test 上不一样的任务。
缺点:这个模型对于同阶的邻域上分配给不同的邻居的权重是完全相同的(也就是 GAT 论文里说的无法 enable specifying different weights to different nodes in a neighborhood)。这一点限制了模型对于空间信息的相关性的捕捉能力,这也是在很多任务上不如 GAT 的根本原因。
前面的理论推导都是关于无向图,如果是有向图问题,最大的区别就是邻接矩阵会变成非对称矩阵,这个时候不能直接定义拉普利矩阵及其谱分解(拉普拉斯矩阵本身是定义在无向图上的)。这个时候有两条思路解决问题:
值得说明的是:GAT 作者写道“It is worth noting that, as Kipf & Welling (2017) and Atwood & Towsley (2016), our work can also be reformulated as a particular instance of MoNet (Monti et al., 2016). ” 也就是说本质上这些模型都可以认为是在重新定义了图的邻接关系后,再进行基本的卷积运算。
y output = σ ( ∑ j = 0 K − 1 α j L j x ) y_{\text {output}}=\sigma\left(\sum_{j=0}^{K-1} \alpha_{j} L^{j} x\right) youtput=σ(∑j=0K−1αjLjx) 给出的卷积核中,含有拉普拉斯矩阵的 j j j 次幂,当 j j j 取值较大时,GCN学习到的特征可能会存在过度平滑现象,即每个顶点的输出特征都十分相似。这样就导致同一连通分量内的节点的表征会趋向于收敛到同一个值。从上一篇博客的热传导分析:GNN 实际是个热传导,所以如果导热率太高,时间太长,最终就是温度达到单一温度。所以要降低导热率,或者缩短传导时间,才能形成有局部特征的分布模式。