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]