谱域GCN的一些基础知识总结

目录

    • 1 谱域GCN
      • 1.1 GNN 和 GCN 有什么不同?
      • 1.2 为什么GCN中要引入拉普拉斯矩阵?
      • 1.3 为什么拉普拉斯矩阵要正则化?
      • 1.4 为什么要对拉普拉斯矩阵进行特征分解?
      • 1.5 空域GCN是不是就完全不需要考虑拉普拉斯矩阵及其特征分解了?如果不用的话,那是为什么不用呢?
      • 1.6 谱域GCN传播公式中,哪里体现了傅里叶变换、拉普拉斯矩阵、拉普拉斯矩阵的特征值分解?(or 谱域GCN的卷积怎么卷的?是一种怎样的数学运算?梯度下降反向传播体现在哪里?)
      • 1.7 终于明白了谱域GCN的傅里叶变换、拉普拉斯矩阵、特征值体现在哪。。
      • 1.8 谱域和空域的“卷积”到底是怎么卷的?是一种怎样的数学运算?各自的梯度下降反向传播体现在哪里?
      • 1.9 谱域和空域各自的优缺点?各自擅长什么场景、处理哪类问题?
    • 2 参考资料/学习资料

1 谱域GCN

1.1 GNN 和 GCN 有什么不同?

​ 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等就是采取了不同方法来学习这个节点表示罢了。

1.2 为什么GCN中要引入拉普拉斯矩阵?

在调研总结完全部知识后,最终对该问题进行如下4步的why - because的梳理:
在谱域研究图,需要对图进行傅里叶变换将图投影到傅里叶域
→ 一个域之所以称为“域”,起码得有一组正交基,使得该域的各个位置/各种状态都可以由这组正交基的线性组合来表示
→ 拉普拉斯矩阵的特征向量恰好可以组成一组正交基
→ 使得傅里叶域中的图的任意向量/任意状态,都可以用这组正交基来表示,亦即 可以用矩阵形式来表示图的傅里叶变换了

先介绍一下拉普拉斯矩阵:
对于图 G = ( V , E ) G=(V, E) G=(V,E) ,其拉普拉斯矩阵 L = D − A L=D-A L=DA,其中 D D D 是顶点的度矩阵, A A A 是图的邻接矩阵。拉普拉斯矩阵包含了图的节点个数信息、节点的度信息、节点的连接信息,可以很全面地概述一张图所包含的各类信息。

谱域GCN的一些基础知识总结_第1张图片
常用的拉普拉斯矩阵有三种:
L = D − A L=D-A L=DA 普通形式的拉普拉斯矩阵
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=D21LD21=ID21AD21 正则化且对称的拉普拉斯矩阵
L r w = D − 1 L = I − D − 1 A L^{rw}=D^{-1}L=I-D^{-1}A Lrw=D1L=ID1A 随机游走正则化的拉普拉斯矩阵
那么问题来了,**为什么拉普拉斯矩阵要进行正则化呢?**→ 见“2.3 为什么拉普拉斯矩阵要正则化

至于为什么GCN要用到拉普拉斯矩阵呢,因为拉普拉斯矩阵是对称矩阵,可以进行特征分解。

​ 那么问题又来了,为什么我们需要一个「能够被特征分解」的矩阵呢(或者说为什么我们需要一个「能够被特征分解」的拉普拉斯矩阵呢)?→见“2.4 为什么要对拉普拉斯矩阵进行特征分解

1.3 为什么拉普拉斯矩阵要正则化?

​ 先给出结论:可以将拉普拉斯矩阵的正则化看作是对原始邻接矩阵的一种「横、纵向正则化」

​ 一般来说,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

1.4 为什么要对拉普拉斯矩阵进行特征分解?

​ 先给出结论:由于卷积在傅里叶域的计算相对简单,因此我们要将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版

1.5 空域GCN是不是就完全不需要考虑拉普拉斯矩阵及其特征分解了?如果不用的话,那是为什么不用呢?

​ 是的,空域GCN不需要考虑拉普拉斯矩阵(Q:因为L包含D和A,所以需要再考虑一下,究竟是不需要考虑L?还是说需要L,但不需要L的特征分解?)
​ 因为拉普拉斯矩阵本来就是因为我们想在谱域处理图,而引入的。在空域,用拓扑关系能更好地做运算;在谱域,用拉普拉斯矩阵的全部特征向量组成的那组正交基能更好地做运算。

​ 补充知识:
​ 我们常说GCN分为频域的和空域的,实际应该说GCN的“卷积核”是分为频域的和空域的。前者基于拉普拉斯矩阵,后者与节点操作有关。

1.6 谱域GCN传播公式中,哪里体现了傅里叶变换、拉普拉斯矩阵、拉普拉斯矩阵的特征值分解?(or 谱域GCN的卷积怎么卷的?是一种怎样的数学运算?梯度下降反向传播体现在哪里?)

(1)传统的傅里叶变换 → graph上的傅里叶变换:

「把传统的傅里叶变换迁移到graph上来,核心工作其实就是把拉普拉斯算子的特征函数 e − i ω t e^{-i\omega t} eiω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)eiω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=0N1xneiN2π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=0N1XkeiN2πkn

传统傅里叶变换 graph傅里叶变换
傅里叶变换基 e − 2 π i x v e^{-2\pi i x v} e2π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)

  • f f f是graph上的N维向量,可以表示某个点的特征向量,比如 f ( i ) f(i) f(i)表示第 i i i个节点的特征
  • u l ( i ) u_l(i) ul(i)表示第 l l l个特征值对应的特征向量的第 i i i个分量
  • f f f 的图傅里叶变换就是将其与 λ l \lambda_l λl对应的特征向量 u l u_l ul进行内积运算
  • λ \lambda λ 对应原始傅里叶变换中的频率 ω \omega ω
  • f _ h a t f\_hat f_hat 表示 f f f 的傅里叶变换

利用矩阵乘法将上述式子推广到矩阵形式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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\} fg=F1{F(f)F(g)}=F1{f_hatg_hat} ( F F F表示傅里叶变换操作)
→ 引入傅里叶变换和傅里叶逆变换,就需要用到该图的拉普拉斯矩阵的特征值及特征向量,特征向量作为构建傅里叶域的基,特征值作为傅里叶变换的频率。

1.7 终于明白了谱域GCN的傅里叶变换、拉普拉斯矩阵、特征值体现在哪。。

​ GCN的傅里叶变换,做到了将图从空域投影到傅里叶域;
​ 求拉普拉斯矩阵的特征值及特征向量,特征向量构成了傅里叶域的一组基,特征值对应了graph傅里叶变换后的频率。
​ 至于为什么“特征值能表示频率”:在由graph确定的 n 维空间中,越小的特征值 λ l \lambda_l λl表明它对应的特征向量(也就是基) u l u_l ul上的分量、“信息”越少,那当然就是可以忽略的低频部分了。

1.8 谱域和空域的“卷积”到底是怎么卷的?是一种怎样的数学运算?各自的梯度下降反向传播体现在哪里?

​ 数学中的卷积多为连续的,而算法的卷积多为离散的;严格意义上说,数学上的卷积和算法上的卷积是两种不同的运算。
​ 数学中的“卷积核”都是给定的或已知的,但CNN/GCN中的“卷积核”不是给定的,而是要训练的参数。

参考:https://www.zhihu.com/question/489755001

空域的卷积,实际就是简单地对中心节点i的各邻居节点的信息进行采样聚合,以更新节点i自身的参数。“卷积核”的设置体现在:如何选取被采样的邻居节点?各邻居节点的采样权重是多少?反向传播可以体现在:我们定义一个类似“模块度”概念的衡量标准,在每轮反向传播的参数优化过程中,不断提高衡量标准的值,使得结果更优化。

至于谱域的卷积如何卷、梯度下降的反向传播体现在哪里,见“2.6

1.9 谱域和空域各自的优缺点?各自擅长什么场景、处理哪类问题?

(待补充)

2 参考资料/学习资料

关于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的数学知识,这次把自己不懂的问题都整理出来梳理了一遍,终于算是懂了。如有错误请指出~

你可能感兴趣的:(GCN,gcn,拉普拉斯算法)