GCN可以说是一种特殊的GCN,区别在于聚合邻居节点信息时的聚合方法。GNN和GCN都是要将邻居节点的信息聚合到自身节点i的,然后与自身节点i的信息加权融合后再做变换,但不同的是,GNN采集节点i的邻居节点A、B、C信息时,各隐藏层对A、B、C的系数a、b、c都是一样的,但GCN中每层隐藏层的系数是可变的——“GNN相当于使用了相同层的GCN”。
还有一种说法是,「GNN的思路很简单:为了编码图的结构信息,每个节点可以由低维状态向量表示。即GNN的目标是为每个节点学习一个节点表示 」(这种说法把GNN说的更简单了,相当于GNN只是提出了“要将图的结构信息进行编码”这一想法。)GNN是为了给节点学习一个节点表示,而GCN、GAT等就是采取了不同方法来学习这个节点表示罢了。
在调研总结完全部知识后,最终对该问题进行如下4步的why - because的梳理:
在谱域研究图,需要对图进行傅里叶变换将图投影到傅里叶域
→ 一个域之所以称为“域”,起码得有一组正交基,使得该域的各个位置/各种状态都可以由这组正交基的线性组合来表示
→ 拉普拉斯矩阵的特征向量恰好可以组成一组正交基
→ 使得傅里叶域中的图的任意向量/任意状态,都可以用这组正交基来表示,亦即 可以用矩阵形式来表示图的傅里叶变换了
先介绍一下拉普拉斯矩阵:
对于图 G = ( V , E ) G=(V, E) G=(V,E) ,其拉普拉斯矩阵 L = D − A L=D-A L=D−A,其中 D D D 是顶点的度矩阵, A A A 是图的邻接矩阵。拉普拉斯矩阵包含了图的节点个数信息、节点的度信息、节点的连接信息,可以很全面地概述一张图所包含的各类信息。
常用的拉普拉斯矩阵有三种:
L = D − A L=D-A L=D−A 普通形式的拉普拉斯矩阵
L s y s = D − 1 2 L D − 1 2 = I − D − 1 2 A D − 1 2 L^{sys}=D^{-\frac{1}{2}}LD^{-\frac{1}{2}}=I-D^{-\frac{1}{2}}AD^{-\frac{1}{2}} Lsys=D−21LD−21=I−D−21AD−21 正则化且对称的拉普拉斯矩阵
L r w = D − 1 L = I − D − 1 A L^{rw}=D^{-1}L=I-D^{-1}A Lrw=D−1L=I−D−1A 随机游走正则化的拉普拉斯矩阵
那么问题来了,**为什么拉普拉斯矩阵要进行正则化呢?**→ 见“2.3 为什么拉普拉斯矩阵要正则化”
至于为什么GCN要用到拉普拉斯矩阵呢,因为拉普拉斯矩阵是对称矩阵,可以进行特征分解。
那么问题又来了,为什么我们需要一个「能够被特征分解」的矩阵呢(或者说为什么我们需要一个「能够被特征分解」的拉普拉斯矩阵呢)?→见“2.4 为什么要对拉普拉斯矩阵进行特征分解”
先给出结论:可以将拉普拉斯矩阵的正则化看作是对原始邻接矩阵的一种「横、纵向正则化」。
一般来说,GNN有一下三种正则化的形式(或者说,从代码的层面来理解有三种形式;因为对整个邻接矩阵A的正则化是拆分为了横向正则化和纵向正则化):
1)节点features的正则化。与其他NN训练前要将特征们正则化一样的原理;
2)对于带权图,需要横向正则化。比如一张带权图,节点表示金融的客户,边表示客户之间的交易金额。那不同节点之间边的weight可能差异很大,可能导致难c收敛。但对于整个问题来说,edge weights的绝对大小不重要,相对大小才重要。横向正则化在其他NN中也常见。
3)纵向正则化,这是graph比较“独有”的操作了。纵向标准化实际上是希望将节点的邻居节点对其的“贡献”进行标准化。比如说脉脉上的用户之间的关注关系就是天然的同构图,假设我们要做节点分类判定某个用户A是不是算法工程师,并且假设A仅仅和另一个算法工程师B以及10个猎头有关注的关系,直观上,猎头对用户A的节点类别的判定的贡献应该是很小的,因为猎头往往会和算法,开发,测试,产品等不同类型的用户有关联关系,他们对于用户A的“忠诚关联度”是很低的,而对于算法工程师B而言,假设他仅仅和A有关联, 那么明显,B对A的“忠诚关联度”是很高的,B的node features以及B和A的关联关系在对A进行节点分类的时候应该是更重要的。
那么,纵向标准化就较好的考虑到了上面的问题,思想很简单,假设节点1和节点2有一个权重为1的edge相连,节点2和其他1000个节点也有关联,那么节点2对于节点1的贡献度为1/1000,即用edge weights除以节点1的度(有权图上用加权度)。
参考:https://zhuanlan.zhihu.com/p/412337460
此处补充一些关于**「拉普拉斯矩阵的性质」**的基础知识:
1)拉普拉斯矩阵是半正定的(特征值都≥0);
2)最小的特征值是0,并且最小特征值0对应的特征向量为全1向量;
3)特征值中0出现的次数就是图连通区域的个数。
继续补充一些**「半正定矩阵」**的性质:
1)半正定矩阵的特征值≥0;
2)半正定矩阵是对称矩阵,对称矩阵一定有n个线性无关的特征向量;
3)对称矩阵不同特征值对应的特征向量相互正交(正交:两特征向量做内积,结果为0),这些正交的特征向量构成的矩阵为正交矩阵,对于正交矩阵 U U U,有 U U T = E UU^T=E UUT=E。
先给出结论:由于卷积在傅里叶域的计算相对简单,因此我们要将graph由空域变换到谱域(傅里叶域),而在这一变换过程中,需要找到graph的连续正交基以对应于傅里叶变换的基,因此要使用拉普拉斯矩阵的特征向量。
此处再补充一些关于**「特征分解」**的基础知识:
特征分解 是将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法。只有对角矩阵、或是具有n个线性无关的特征向量的矩阵才能进行特征分解。
对于拉普拉斯矩阵 L L L,对其进行特征分解后得到特征值 λ = { λ 1 , λ 2 , . . . , λ n } \lambda=\{\lambda_1,\lambda_2,...,\lambda_n\} λ={λ1,λ2,...,λn}( λ \lambda λ为列向量,其中 λ i \lambda_i λi为实数),以及各特征值对应的特征向量组成的矩阵 η = { η 1 , η 2 , . . . , η n } \eta=\{\eta_1,\eta_2,...,\eta_n\} η={η1,η2,...,ηn}(其中 η i \eta_i ηi为特征向量,是列向量) ,则有 L η = λ η L\eta = \lambda\eta Lη=λη。
还有一种表示方法, Λ = d i a g { λ 1 , λ 2 , . . . , λ n } \Lambda=diag\{\lambda_1,\lambda_2,...,\lambda_n\} Λ=diag{λ1,λ2,...,λn}( Λ \Lambda Λ为对角矩阵,其中 λ i \lambda_i λi为实数), L = η Λ η − 1 = η Λ η T L=\eta\Lambda\eta^{-1}=\eta\Lambda\eta^T L=ηΛη−1=ηΛηT。(因为对于正交矩阵 η \eta η,有 η η T = E = η η − 1 \eta\eta^T=E=\eta\eta^{-1} ηηT=E=ηη−1, η T = η − 1 \eta^T=\eta^{-1} ηT=η−1)
对拉普拉斯矩阵进行特征分解后,会得到n个线性无关的特征向量,特征向量两两正交。全部的特征向量组成正交矩阵 η \eta η, η \eta η构成空间中的一组正交基。
重点结论:『这组正交基构成了graph傅里叶变换的基,graph傅里叶变换将graph的输入信号投影到该正交基构成的正交空间。也就相当于把graph上定义的任何向量,表示成了 L L L的特征向量的线性组合。』
『拉普拉斯矩阵的特征值是傅里叶变换的频率。』
参考:https://blog.csdn.net/yyl424525/article/details/100058264超全的百科博文,讲的全面详细,值得多看!
同一个博主写的:https://blog.csdn.net/yyl424525/article/details/100634211 GCN代码分析-Tensorflow版
是的,空域GCN不需要考虑拉普拉斯矩阵(Q:因为L包含D和A,所以需要再考虑一下,究竟是不需要考虑L?还是说需要L,但不需要L的特征分解?)
因为拉普拉斯矩阵本来就是因为我们想在谱域处理图,而引入的。在空域,用拓扑关系能更好地做运算;在谱域,用拉普拉斯矩阵的全部特征向量组成的那组正交基能更好地做运算。
补充知识:
我们常说GCN分为频域的和空域的,实际应该说GCN的“卷积核”是分为频域的和空域的。前者基于拉普拉斯矩阵,后者与节点操作有关。
(1)传统的傅里叶变换 → graph上的傅里叶变换:
「把传统的傅里叶变换迁移到graph上来,核心工作其实就是把拉普拉斯算子的特征函数 e − i ω t e^{-i\omega t} e−iωt变为graph对应的拉普拉斯矩阵的特征向量」
对一个连续的周期函数 f ( x ) f(x) f(x)进行传统的傅里叶变换后,得到 F ( ω ) F(\omega) F(ω):
F ( ω ) = G [ f ( x ) ] = ∫ − ∞ + ∞ f ( x ) e − i ω x d ω F(\omega)=G[f(x)]=\int_{-∞}^{+∞}{f(x)e^{-i\omega x}}d\omega F(ω)=G[f(x)]=∫−∞+∞f(x)e−iωxdω
其逆傅里叶变换为:
( 待 补 充 ) (待补充) (待补充)
对一个离散的周期性变换的信号 x n x_n xn来说,对其进行传统的傅里叶变换后的结果 X k X_k Xk为:
X k = ∑ n = 0 N − 1 x n e − i 2 π N k n X_k=\sum_{n=0}^{N-1}{x_ne^{-i\frac{2\pi}{N}kn}} Xk=∑n=0N−1xne−iN2πkn
其逆傅里叶变换为:
x n = ∑ x = 0 N − 1 X k e i 2 π N k n x_n=\sum_{x=0}^{N-1}{X_ke^{i\frac{2\pi}{N}kn}} xn=∑x=0N−1XkeiN2πkn
传统傅里叶变换 | graph傅里叶变换 | |
---|---|---|
傅里叶变换基 | e − 2 π i x v e^{-2\pi i x v} e−2πixv | U T U^{T} UT |
逆傅里叶变换基 | e 2 π i x v e^{2\pi i x v} e2πixv | U U U |
维度 | ∞ | 点的个数 n n n |
在实数域定义graph的傅里叶变换:
F ( λ l ) = f _ h a t ( λ l ) = ∑ i = 1 N f ( i ) u l ( i ) F(\lambda_l)=f\_hat(\lambda_l)=\sum_{i=1}^{N}{f(i)u_l(i)} F(λl)=f_hat(λl)=∑i=1Nf(i)ul(i)
利用矩阵乘法将上述式子推广到矩阵形式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYut5gMw-1634521367851)(/Users/a00/Library/Application Support/typora-user-images/image-20211016200907545.png)]
最终得到 f f f 在graph上的傅里叶变换的矩阵形式为:
f _ h a t = U T f f\_hat=U^Tf f_hat=UTf
(2)graph上的傅里叶变换 → 图卷积:
卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积。对两函数 f f f 和 g g g 的的卷积,就是对这两函数各自进行傅里叶变换后得到的结果相乘,再对该结果进行傅里叶逆变换。
!!!!重点来了,谱域GCN的“卷积”就体现在——卷积定理。!!!!
我们想将图上的N维向量 f f f(可以表示某个节点的特征)与卷积核 g g g 做内积运算(即卷积运算),此处用⊙来表示内积/卷积运算
→ 的内积/卷积运算实际是很麻烦的,但当引入傅里叶变换和傅里叶逆变换这一中间桥梁后,就能简化运算:
f ⊙ g = F − 1 { F ( f ) ⊙ F ( g ) } = F − 1 { f _ h a t ⊙ g _ h a t } f⊙g=F^{-1}\{F(f)⊙F(g)\}=F^{-1}\{f\_hat⊙g\_hat\} f⊙g=F−1{F(f)⊙F(g)}=F−1{f_hat⊙g_hat} ( F F F表示傅里叶变换操作)
→ 引入傅里叶变换和傅里叶逆变换,就需要用到该图的拉普拉斯矩阵的特征值及特征向量,特征向量作为构建傅里叶域的基,特征值作为傅里叶变换的频率。
GCN的傅里叶变换,做到了将图从空域投影到傅里叶域;
求拉普拉斯矩阵的特征值及特征向量,特征向量构成了傅里叶域的一组基,特征值对应了graph傅里叶变换后的频率。
至于为什么“特征值能表示频率”:在由graph确定的 n 维空间中,越小的特征值 λ l \lambda_l λl表明它对应的特征向量(也就是基) u l u_l ul上的分量、“信息”越少,那当然就是可以忽略的低频部分了。
数学中的卷积多为连续的,而算法的卷积多为离散的;严格意义上说,数学上的卷积和算法上的卷积是两种不同的运算。
数学中的“卷积核”都是给定的或已知的,但CNN/GCN中的“卷积核”不是给定的,而是要训练的参数。
参考:https://www.zhihu.com/question/489755001
空域的卷积,实际就是简单地对中心节点i的各邻居节点的信息进行采样聚合,以更新节点i自身的参数。“卷积核”的设置体现在:如何选取被采样的邻居节点?各邻居节点的采样权重是多少?反向传播可以体现在:我们定义一个类似“模块度”概念的衡量标准,在每轮反向传播的参数优化过程中,不断提高衡量标准的值,使得结果更优化。
至于谱域的卷积如何卷、梯度下降的反向传播体现在哪里,见“2.6”
(待补充)
关于GCN的两篇超全博文:
https://blog.csdn.net/yyl424525/article/details/100058264 - 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
https://www.cnblogs.com/nxf-rabbit75/p/11306198.html#auto-id-10 - GCN总结
之前一直想不通许多谱域GCN的数学知识,这次把自己不懂的问题都整理出来梳理了一遍,终于算是懂了。如有错误请指出~