spectral-graph-theory-in-GCN

发布时间 2023-04-26 10:38:27作者: ticlab

GCN 中的谱图理论笔记

Datetime: 2023-04-26T09:36+08:00

Categories: MachineLearning

Tags: GNN

写毕设,发现自己没法绕过第一代 GCN 的谱图变换原理

我知道啥是傅里叶变化,但是我感觉不到那种新奇,或许这就是无法感觉到数学的美吧。

本文默认读者知道傅里叶变换,就数学分析/高等数学里的那一章。

参考了 【GNN】万字长文带你入门 GCN - 阿泽的文章 - 知乎,后来发现图神经网络基础二:谱图理论写得也完整。

why sin/cos

要理解 GCN 那一套傅里叶的逻辑,第一个问题是,为什么傅里叶变化选择了三角函数,或者说 sin/cos?

或许有人会说,sin/cos 正交嘛,那为什么正交,是巧合吗?

我认为可以类推到 \(\nabla^2\) 这个变换中,所谓亥姆霍兹方程:

\[\nabla^2 f = -k^2 f \]

sin/cos 就是答案之一,而如果把这个方程理解为 \(Ax = \lambda x\),A 是实对称矩阵,那么特征向量本身就是正交的。

总而言之,这样类比很巧,我也不知道为什么这么巧。

那么傅里叶分解就可以立即为输入函数 \(f\),分解到 \(\nabla^2\) 的基上。

input & output

第二个问题就是弄清楚图的变换的输入和输出是什么,
说到底,无权重图的结构就是一个邻接矩阵罢了,图上节点的值,如果考虑每一个节点就是一个标量,那么整个图的节点的值就是一个向量。

假设每个节点的值就是一个标量,这样不把节点的值考虑成向量的好处是,向量无非是多个「通道」,就像 RGB 通道一样。

图可以抽象为一个矩阵(邻接矩阵、度矩阵 whatever),query 图节点的值抽象为一个函数,这个函数的参数是节点,输出是节点的值,也就是一个标量,那么图可以表示为如下二元组:

\(<L, f>, f \in \{f: v \rightarrow \mathbb{R} \}\)

无向结构写成矩阵的形式会强行加上一个 index。如何理解,因为写邻接矩阵的时候,已经给图中的节点编号了,比如矩阵第一列第二行表示第一个节点和第二个节点之间是否有边。所以 \(f\) 本身也可以写成一个向量,\(f[i]\) 就是取第 i 个节点的值。

node<index>(<value>)

node1(3) -- node2(5)
|
|
node3(8)

那么 \(f\) 就是 \([3, 5, 8]\)

至于为什么选择 \(L\),文章[1]说是考虑变换为「扰动」,\(f[i]-f[j]\)

类比

第三个问题是理解类比:

把傅里叶变换理解为

函数在 \(\nabla^2\) 基上的变换,那么频域变换就可以理解为

\(f\)\(L\) 基上的变换。

所以我们去求 \(L\) 的特征值 \(u_i\),让 \(f\)\(u_i\) 做内积,得到变换后的结果。

卷积核

我认为这不是变换的重点,直接参考文章[1:1]


  1. 【GNN】万字长文带你入门 GCN - 阿泽的文章 - 知乎 ↩︎ ↩︎