首页 > 其他分享 >学习笔记:GCN

学习笔记:GCN

时间:2023-10-01 17:22:05浏览次数:32  
标签:frac 卷积 矩阵 笔记 GCN 学习 tilde theta Lambda

本文第一部分摘抄自一篇知乎上的回答如何理解 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)?

标签:frac,卷积,矩阵,笔记,GCN,学习,tilde,theta,Lambda
From: https://www.cnblogs.com/white514/p/17739021.html

相关文章

  • CS231N Assignment1 SVM 笔记(更新中)
    svm.ipynb为SVM实现一个完全矢量化的损失函数为其解析梯度实现完全矢量化表达式使用数值梯度检查您的实现使用验证集调整学习率和正则化使用 SGD优化损失函数可视化最终学习权重第一部分1.一些配置和库的导入#Runsomesetupcodeforthisnotebook.importrand......
  • salesforce零基础学习(一百三十二)Flow新功能: Custom Error
    本篇参考:https://help.salesforce.com/s/articleView?id=sf.flow_ref_elements_custom_error.htm&type=5https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm我们针对这些次salesforce的releasenote可以看出来,sa......
  • 动手学深度学习_4 多层感知机
    frompixiv多层感知机原理隐藏层严格一点来讲:我们需要隐藏层是因为线性是一个很强的假设,线性模型在有些情况会不适用或者出错。一个形象的例子:就如同上面图片中展示的XOR问题,如果我们现在想要将绿和红球分开,如果只用一条"线性",我们会发现我们是做不到的,起码要两条及以......
  • yzy第四次学习笔记
    第七章:文件操作文件操作级别硬件级别:硬件级别的文件操作包括:fdisk:将硬件、U盘或SDC盘分区。mkfs:格式化磁盘分区,为系统做好准备。fsck:检查和维修系统。碎片整理:压缩文件系统中的文件。操作系统内核中的文件系统函数:点击查看代码kumount(),kumount()
......
  • SpringCloud微服务学习笔记(二)【Feign,Gateway,Docker】
    Feign先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:•代码可读性差,编程体验不统一•参数复杂URL难以维护Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。基......
  • 20211105李宜时《信息安全系统设计与实现》第四周学习总结
    第七第八章学习笔记学习笔记:文件操作和系统调用文件操作级别文件操作通常可以分为三个级别:低级别文件操作:直接访问文件的二进制数据,通常由操作系统提供支持。文件I/O操作:使用高级别的API(如C的stdio库)来读取和写入文件。文件系统操作:使用文件系统调用访问和管理文件,如POSIX......
  • C语言学习记录---数组1
    BIT-4-数组一维数组的创建和初始化一维数组的使用一维数组在内存中的存储二维数组的创建和初始化二维数组的使用二维数组在内存中的存储数组越界数组作为函数参数数组的应用实例1:三子棋数组的应用实例2:扫雷游戏1.一维数组的创建和初始化。1.1数组的创建数组是一组相同类型元素......
  • 概率学习(Genshin中)
    几何分布\[P(x=k)=(1-a)^{k-1}a,k>0\]容易发现,\(E(x)=\dfrac{1}{a}\)。Min-Max容斥对于集合\(S\),有:\[\max(S)=\sum_{T\subseteqS,T\neq\emptyset}\min(T)(-1)^{|T|+1}\]依据期望的线性性,有:\[E(\max(S))=\sum_{T\subseteqS,T\neq\emptyset}E(\min(T))(-1)^{|......
  • FastAPI学习-26 并发 async / await
    前言有关路径操作函数的asyncdef语法以及异步代码、并发和并行的一些背景知识async和await关键字如果你正在使用第三方库,它们会告诉你使用await关键字来调用它们,就像这样:results=awaitsome_library()然后,通过asyncdef声明你的路径操作函数:@app.get('/')asy......
  • 模算数学习笔记
    最近正好在搞同余,写一下。同余定义设\(m\in\mathbb{Z^+}\),如果\(a,b\in\mathbbZ\)且\(m\mid(a-b)\),那么称\(a\)和\(b\)模\(m\)同余,记作\(a\equivb\pmodm\);否则称\(a\)模\(m\)不同余于\(b\),记作\(a\not\equivb\pmodm\)。称\(m\)为同余的模......