GCN
- CNN中的卷积本质上就是共享参数的过滤器,可以较为有效地提取空间特征
而很多其他的研究中还有很多非欧拉结构的数据
- 1.CNN无法处理非欧拉结构的数据,传统的离散卷积在Non Euclidean Structure的数据上无法保持平移不变性
- 2.希望在拓扑图上有效地提取空间特征来进行机器学习
- 3.广义上来讲任何数据在赋范空间内都可以建立拓扑关联,因此GCN有很大的应用空间
提取拓扑图空间特征的两种方式
-
(1)vertex domain
- 把顶点相邻的点找出来
- 问题就变成:怎么确定相邻点,怎么确定感受野,确定感受野怎么处理包含不同数目的相邻点的特征
- 相关的文章Convolutional Neural Networks for Graphs
-
(2)spectral domai
- 希望用图谱的理论来实现卷积操作
拉普拉斯矩阵
定义一个图的Laplacian矩阵 L = D − A L=D-A L=D−A
- L表示拉普拉斯矩阵
- D是顶点的度矩阵(对角矩阵,对角线上为图顶点的度)
- A是图的邻接矩阵
常用的Laplacian矩阵有三种
-
1. L = D − A L=D-A L=D−A
-
2. L s y s = D − 1 / 2 L D − 1 / 2 L^{sys}=D^{-1/2}LD^{-1/2} Lsys=D−1/2LD−1/2,很多GCN使用
-
3. L r w = D − 1 L L^{rw}=D^{-1}L Lrw=D−1L
-
矩阵的谱分解、特征分解、对角化是同一个概念,充要条件是n阶方阵存在n个线性无关的特征向量
- 这里的特征值可以表示为频率
- 由Graph确定的n维空间中,越小的特征值 λ l \lambda_l λl表明:拉普拉斯矩阵L其所对应的基 u l u_l ul上的分量信息越少,类似PCA降维里的原理
- 这里的特征值可以表示为频率
拉普拉斯算子与其关系
- 代数里拉普拉斯算子是一个二阶微分算子
nabla算子
∇
=
∂
∂
x
i
⃗
+
∂
∂
y
j
⃗
+
∂
∂
z
k
⃗
\nabla = \frac{\partial}{\partial x}\vec i+\frac{\partial}{\partial y}\vec j+\frac{\partial}{\partial z}\vec k
∇=∂x∂i+∂y∂j+∂z∂k
拉普拉斯算子
Δ
f
=
∂
2
∂
x
2
i
⃗
+
∂
2
∂
y
2
j
⃗
+
∂
2
∂
z
2
k
⃗
\Delta f = \frac{\partial^2}{\partial x^2}\vec i+\frac{\partial^2}{\partial y^2}\vec j+\frac{\partial^2}{\partial z^2}\vec k
Δf=∂x2∂2i+∂y2∂2j+∂z2∂2k
以二维的离散函数为例
Δ
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
=
f
(
x
+
1
,
y
)
+
f
(
x
−
1
,
y
)
+
f
(
x
,
y
+
1
)
+
f
(
x
,
y
−
1
)
−
4
f
(
x
,
y
)
\Delta f = \frac{\partial^2 f}{\partial x^2}+\frac{\partial^2 f}{\partial y^2}\\ = f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
Δf=∂x2∂2f+∂y2∂2f=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
- 所以拉普拉斯算子可以计算一个点到它所有自由度上微小扰动的增益
将2维推广到n维,即是在一张图中计算某点邻域的扰动
设对节点i的增益:
Δ
f
i
=
∑
j
∈
N
i
(
f
i
−
f
j
)
\Delta f_i = \sum_{j\in N_i}(f_i-f_j)
Δfi=∑j∈Ni(fi−fj)
带边权则有
Δ
f
i
=
∑
j
∈
N
i
w
i
j
(
f
i
−
f
j
)
=
∑
j
∈
N
w
i
j
f
i
−
∑
j
∈
N
w
i
j
f
j
=
d
i
f
i
−
w
i
:
f
\Delta f_i = \sum_{j\in N_i}w_{ij}(f_i-f_j)\\ =\sum_{j\in N}w_{ij}f_i-\sum_{j\in N}w_{ij}f_j\\ =d_if_i-w_{i:}f
Δfi=j∈Ni∑wij(fi−fj)=j∈N∑wijfi−j∈N∑wijfj=difi−wi:f
- 这里 d i d_i di是点i的度
- w i : = ( w i 1 , . . . , w i N ) w_{i:}=(w_{i1},...,w_{i_N}) wi:=(wi1,...,wiN)是N维行向量, f = ( f 1 f 2 ⋮ f N ) f=\begin{pmatrix}f_1\\f_2\\ \vdots \\f_N\end{pmatrix} f=⎝⎜⎜⎜⎛f1f2⋮fN⎠⎟⎟⎟⎞是N维列向量
对所有的N个节点
Δ
f
=
(
Δ
f
1
Δ
f
2
⋮
Δ
f
N
)
=
(
d
1
f
1
−
w
1
:
f
⋮
d
N
f
N
−
w
N
:
f
)
=
(
d
1
⋱
d
N
)
f
−
(
w
1
:
⋮
w
N
:
f
)
=
d
i
a
g
(
d
i
)
f
−
W
f
=
(
D
−
W
)
f
=
L
f
\Delta f = \begin{pmatrix}\Delta_{f_1}\\\Delta_{f_2}\\ \vdots \\\Delta_{f_N}\end{pmatrix}= \begin{pmatrix}d_1f_1-w_{1:}f\\ \vdots \\d_Nf_N-w_{N:}f\end{pmatrix}\\ =\left( \begin{array}{ccc} d_1 & \\ & \ddots & & \\ & & & d_N \\ \end{array} \right)f- \begin{pmatrix}w_{1:}\\ \vdots \\w_{N:}f\\\end{pmatrix}\\ =diag(d_i)f-Wf\\ =(D-W)f\\ =Lf
Δf=⎝⎜⎜⎜⎛Δf1Δf2⋮ΔfN⎠⎟⎟⎟⎞=⎝⎜⎛d1f1−w1:f⋮dNfN−wN:f⎠⎟⎞=⎝⎛d1⋱dN⎠⎞f−⎝⎜⎛w1:⋮wN:f⎠⎟⎞=diag(di)f−Wf=(D−W)f=Lf
- 由此可得拉普拉斯矩阵
图拉普拉斯反映了当我们在节点 i上施加一个势,这个势以哪个方向能够多顺畅的流向其他节点
- 谱聚类中的拉普拉斯矩阵可以理解为对图的一种矩阵表示形式
傅立叶变换
将一个在空域上定义的函数分解成频域上若干频率成分
- 用一组sin,cos的函数来逼近一个周期函数
由于博主的专业不学复变、模电这些玩意儿(233),相关的知识由微积分下和网络搜索引擎补齐
设
f
(
x
)
f(x)
f(x)的周期为
T
T
T,傅立叶级数可以写作:
f
(
x
)
=
a
0
2
+
∑
n
=
1
∞
(
a
n
c
o
s
(
2
π
n
x
T
)
+
b
n
s
i
n
(
2
π
n
x
T
)
)
其
中
:
a
n
=
2
T
∫
x
0
x
0
+
T
f
(
x
)
⋅
c
o
s
(
2
π
n
x
T
)
d
x
b
n
=
2
T
∫
x
0
x
0
+
T
f
(
x
)
⋅
s
i
n
(
2
π
n
x
T
)
d
x
因
为
c
o
s
x
=
e
i
x
+
e
−
i
x
2
s
i
n
x
=
e
i
x
−
e
−
i
x
2
i
得
到
傅
立
叶
变
换
:
F
(
ω
)
=
∫
−
∞
∞
f
(
x
)
e
−
i
ω
x
d
x
f(x)=\frac{a_0}{2}+\sum_{n=1}^{∞}(a_n cos(\frac{2\pi n x}{T}) + b_n sin(\frac{2 \pi n x}{T}))\\ 其中:\\ a_n = \frac{2}{T}\int_{x_0}^{x_0+T}f(x)\cdot cos(\frac{2 \pi n x}{T})dx\\ b_n = \frac{2}{T}\int_{x_0}^{x_0+T}f(x)\cdot sin(\frac{2 \pi n x}{T})dx\\ 因为\\ cos x=\frac{e^{ix}+ e^{-ix}}{2}\\ sin x = \frac{e^{ix}-e^{-ix}}{2i}\\ 得到傅立叶变换:F(\omega)=\int_{-∞}^{∞}f(x)e^{-i\omega x} dx
f(x)=2a0+n=1∑∞(ancos(T2πnx)+bnsin(T2πnx))其中:an=T2∫x0x0+Tf(x)⋅cos(T2πnx)dxbn=T2∫x0x0+Tf(x)⋅sin(T2πnx)dx因为cosx=2eix+e−ixsinx=2ieix−e−ix得到傅立叶变换:F(ω)=∫−∞∞f(x)e−iωxdx
Graph上的傅立叶变换
- 离散积分是一种内积的形式,
L
V
=
λ
V
LV=\lambda V
LV=λV
因此定义Graph上的傅立叶变换为:
F ( λ l ) = f ^ ( λ l ) = ∑ i = 1 N f ( i ) u l ∗ ( i ) F(\lambda_l)=\hat f(\lambda_l)=\sum_{i=1}^N f(i)u_l^{*}(i) F(λl)=f^(λl)=i=1∑Nf(i)ul∗(i) - f是Graph上的n维向量,f(i)与Graph上的顶点一一对应
- u l ( i ) u_l(i) ul(i)表示第l个特征向量的第i个分量(U是拉普拉斯矩阵的特征向量)
- 特征值(频率)
λ
l
\lambda_l
λl下的, f 的Graph 傅里叶变换就是与
λ
l
\lambda_l
λl对应的特征向量
u
l
u_l
ul 进行内积运算。
所以对应的矩阵形式为 - f为待变换函数
( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ n ) ) = ( u 1 ( 1 ) u 2 ( 1 ) ⋯ u n ( 1 ) u 1 ( 2 ) u 2 ( 2 ) ⋯ u n ( 2 ) ⋮ ⋮ ⋱ ⋮ u 1 ( n ) u 2 ( n ) ⋯ u n ( n ) ) ( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) \begin{pmatrix} \hat f(\lambda_1)\\ \hat f(\lambda_2)\\ \vdots\\ \hat f(\lambda_n)\\ \end{pmatrix}= {\begin{pmatrix} u_1(1)&u_2(1)& \cdots &u_n(1)\\ u_1(2)&u_2(2)& \cdots &u_n(2)\\ \vdots &\vdots &\ddots&\vdots\\ u_1(n)&u_2(n)& \cdots &u_n(n)\\ \end{pmatrix}} {\begin{pmatrix} f(1)\\ f(2)\\ \vdots\\ f(N)\\ \end{pmatrix}} ⎝⎜⎜⎜⎛f^(λ1)f^(λ2)⋮f^(λn)⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛u1(1)u1(2)⋮u1(n)u2(1)u2(2)⋮u2(n)⋯⋯⋱⋯un(1)un(2)⋮un(n)⎠⎟⎟⎟⎞⎝⎜⎜⎜⎛f(1)f(2)⋮f(N)⎠⎟⎟⎟⎞
因此f在graph上的变换形式为 f ^ = U ⊤ f \hat f=U^\top f f^=U⊤f
Graph上的傅里叶逆变换
-
逆变换是对频率 ω \omega ω求积分
F − 1 ∣ F ( ω ) ∣ = 1 2 π ∫ F ( ω ) e i ω t d ω {\bf F}^{-1} |F(\omega)| = \frac{1}{2 \pi} \int F(\omega) e^{i \omega t} d \omega F−1∣F(ω)∣=2π1∫F(ω)eiωtdω -
在Graph上是对特征值 λ l \lambda_l λl求和
f ( i ) = ∑ l = 1 N f ^ ( λ l ) u l ( i ) f(i) = \sum_{l=1}^N \hat f (\lambda_l) u_l(i) f(i)=l=1∑Nf^(λl)ul(i) -
矩阵形式
( f ( 1 ) f ( 2 ) ⋮ f ( N ) ) = ( u 1 ( 1 ) u 2 ( 1 ) ⋯ u n ( 1 ) u 1 ( 2 ) u 2 ( 2 ) ⋯ u n ( 2 ) ⋮ ⋮ ⋱ ⋮ u 1 ( n ) u 2 ( n ) ⋯ u n ( n ) ) ( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ n ) ) {\begin{pmatrix} f(1)\\ f(2)\\ \vdots\\ f(N)\\ \end{pmatrix}}= {\begin{pmatrix} u_1(1)&u_2(1)& \cdots &u_n(1)\\ u_1(2)&u_2(2)& \cdots &u_n(2)\\ \vdots &\vdots &\ddots&\vdots\\ u_1(n)&u_2(n)& \cdots &u_n(n)\\ \end{pmatrix}} \begin{pmatrix} \hat f(\lambda_1)\\ \hat f(\lambda_2)\\ \vdots\\ \hat f(\lambda_n)\\ \end{pmatrix} ⎝⎜⎜⎜⎛f(1)f(2)⋮f(N)⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎛u1(1)u1(2)⋮u1(n)u2(1)u2(2)⋮u2(n)⋯⋯⋱⋯un(1)un(2)⋮un(n)⎠⎟⎟⎟⎞⎝⎜⎜⎜⎛f^(λ1)f^(λ2)⋮f^(λn)⎠⎟⎟⎟⎞
因此f在graph上的傅里叶逆变换形式为 f = U f ^ f=U \hat f f=Uf^
推广到卷积
- 卷积定理:函数卷积的傅里叶变换是函数傅立叶变换的乘积,即对于函数f(t)与h(t)两者的卷积是其函数傅立叶变换乘积的逆变换
f ∗ h = F − 1 [ f ^ ( ω ) h ^ ( ω ) ] = 1 2 π ∫ f ^ ( ω ) h ^ ( ω ) e i ω t d ω f * h = {\bf F}^{-1} [\hat f(\omega) \hat h(\omega)] = \frac{1}{2 \pi}\int \hat f(\omega) \hat h(\omega) e^{i \omega t} d \omega f∗h=F−1[f^(ω)h^(ω)]=2π1∫f^(ω)h^(ω)eiωtdω-
f为待卷积函数,h为卷积核, f ∗ h f*h f∗h为卷积结果
-
f的傅里叶变换为 f ^ = U T f \hat f = U^T f f^=UTf
-
卷积核傅里叶变换的矩阵形式
- ( h ^ ( λ 1 ) ⋱ h ^ ( λ N ) ) \left( \begin{array}{ccc} \hat h(\lambda_1) & \\ & \ddots & & \\ & & & \hat h(\lambda_N) \\ \end{array} \right) ⎝⎛h^(λ1)⋱h^(λN)⎠⎞
-
h ^ ( λ l ) = ∑ i = 1 N h ( i ) u l ∗ ( i ) \hat h(\lambda_l)=\sum_{i=1}^N h(i)u_l^*(i) h^(λl)=∑i=1Nh(i)ul∗(i)根据需要设计的卷积核在Graph上的傅里叶变换
-
两者傅里叶变换乘积为:
- ( h ^ ( λ 1 ) ⋱ h ^ ( λ N ) ) U T f \left( \begin{array}{ccc} \hat h(\lambda_1) & \\ & \ddots & & \\ & & & \hat h(\lambda_N) \\ \end{array} \right) U^T f ⎝⎛h^(λ1)⋱h^(λN)⎠⎞UTf
-
再求逆变换,即前面乘一个U
- ( f ∗ h ) G = U ( h ^ ( λ 1 ) ⋱ h ^ ( λ N ) ) U T f (f*h)_G = U \left( \begin{array}{ccc} \hat h(\lambda_1) & \\ & \ddots & & \\ & & & \hat h(\lambda_N) \\ \end{array} \right) U^T f (f∗h)G=U⎝⎛h^(λ1)⋱h^(λN)⎠⎞UTf
- 或写成: ( f ∗ h ) G = U ( ( U T h ) ⨀ ( U T f ) ) (f*h)_G=U((U^Th) \bigodot (U^T f)) (f∗h)G=U((UTh)⨀(UTf)),中间的是逐元素乘
-
谱卷积
( f ∗ h ) G = U ( h ^ ( λ 1 ) ⋱ h ^ ( λ N ) ) U T f (f*h)_G = U \left( \begin{array}{ccc} \hat h(\lambda_1) & \\ & \ddots & & \\ & & & \hat h(\lambda_N) \\ \end{array} \right) U^T f (f∗h)G=U⎝⎛h^(λ1)⋱h^(λN)⎠⎞UTf
-
深度学习中的图卷积都是根据上式推导而来
-
卷积核就是
- ( h ^ ( λ 1 ) ⋱ h ^ ( λ N ) ) \left( \begin{array}{ccc} \hat h(\lambda_1) & \\ & \ddots & & \\ & & & \hat h(\lambda_N) \\ \end{array} \right) ⎝⎛h^(λ1)⋱h^(λN)⎠⎞
-
最原始的GCN如下(谱图卷积):
σ ( U ( θ 1 ⋱ θ n ) U T x ) \sigma\left(U\left( \begin{array}{ccc} \theta_1 & \\ & \ddots & & \\ & & & \theta_n \\ \end{array} \right) U^{T}x\right) σ⎝⎛U⎝⎛θ1⋱θn⎠⎞UTx⎠⎞- σ \sigma σ是激活函数,x是Graph上每个点的特征向量, θ \theta θ是卷积核参数。 U T g U^Tg UTg整体可以看作可学习的卷积核
- 但这种形式的缺点就是有n个参数,计算量大
频域卷积网络
- 上式的卷积公式可以写作 o = ( f ∗ g ) θ = U g θ U T f o=(f*g)_{\theta}=U g_{\theta} U^T f o=(f∗g)θ=UgθUTf, g θ g_{\theta} gθ就是卷积核
假设l层的隐藏层为 h l ∈ R N × d l h_l\in R^{N\times d_l} hl∈RN×dl
- 卷积层状态更新为
h : , j l + 1 = σ ( U ∑ i = 1 d l Θ i , j l U T h : , i l ) Θ i , j l = g θ = [ θ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ θ N ] h^{l+1}_{:,j}={\sigma}(U{\sum}_{i=1}^{d_l}{\Theta}^l_{i,j}U^Th^l_{:,i})\\ {\Theta}^l_{i,j}=g_{\theta}= \left[ \begin{matrix} {\theta}_1 & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & {\theta}_N \end{matrix} \right] h:,jl+1=σ(U∑i=1dlΘi,jlUTh:,il)Θi,jl=gθ=⎣⎢⎡θ1⋮0⋯⋱⋯0⋮θN⎦⎥⎤
这里的 Θ i , j l \Theta_{i,j}^l Θi,jl可以类比神经网络中的权重 w i , j w_{i,j} wi,j,一层卷积层参数有 N × d l × d l + 1 N\times d_l \times d_{l+1} N×dl×dl+1
切比雪夫网络(ChebNet)
由于谱卷积时间消耗很大,可以应用切比雪夫多项式来加速特征矩阵的求解。
假设切比雪夫多项式第k项为
T
k
T_k
Tk,频域卷积核计算方法为:
g
θ
=
∑
k
=
0
K
−
1
θ
k
T
k
(
Λ
~
)
,
where
Λ
~
=
2
Λ
λ
m
a
x
−
I
N
g_{\theta}={\sum}_{k=0}^{K-1}{\theta}_{k}T_{k}(\tilde{\Lambda}), \text{where}\ \tilde{\Lambda}=\displaystyle\frac{2\Lambda}{\lambda_{max}}-I_N
gθ=∑k=0K−1θkTk(Λ~),where Λ~=λmax2Λ−IN
- 按照切比雪夫多项式的定义: T k ( x ) = 2 x T k − 1 ( x ) − T k − 2 ( x ) , T 0 ( x ) = 1 , T 1 ( x ) = x T_k(x)=2xT_{k-1}(x)-T_{k-2}(x),T_0(x)=1,T_1(x)=x Tk(x)=2xTk−1(x)−Tk−2(x),T0(x)=1,T1(x)=x
- Λ ~ \tilde \Lambda Λ~让特征矩阵归一化
可以进一步写成
g
θ
(
L
)
x
=
∑
k
=
1
K
θ
k
T
k
(
L
~
)
x
g_{\theta}(L)x=\sum_{k=1}^K \theta_k T_k (\tilde L)x
gθ(L)x=k=1∑KθkTk(L~)x
-将可学习的参数分解成了K个,类似传统的CNN,常取K=3,K=5等。计算复杂度也变成了
O
(
K
∣
E
∣
)
O(K|E|)
O(K∣E∣),E为图的边数
简易的多项式形式
-
卷积核
h ^ ( λ l ) : ∑ j = 0 K a j λ l j \hat h(\lambda_l):\sum_{j=0}^K a_j \lambda_l^j h^(λl):j=0∑Kajλlj -
输出
σ ( U ( ∑ j = 0 K a j λ 1 j ⋱ ∑ j = 0 K a j λ n j ) U T x ) \sigma\left(U\left( \begin{array}{ccc}\sum_{j=0}^K a_j \lambda_1^j & \\ & \ddots & & \\ & & &\sum_{j=0}^K a_j \lambda_n^j \\ \end{array} \right) U^{T}x\right) σ⎝⎜⎛U⎝⎜⎛∑j=0Kajλ1j⋱∑j=0Kajλnj⎠⎟⎞UTx⎠⎟⎞
( ∑ j = 0 K a j λ 1 j ⋱ ∑ j = 0 K a j λ n j ) = ∑ j = 0 K a j Λ j \left( \begin{array}{ccc}\sum_{j=0}^K a_j \lambda_1^j & \\ & \ddots & & \\ & & &\sum_{j=0}^K a_j \lambda_n^j \\ \end{array} \right) =\sum_{j=0}^K a_j \Lambda^j ⎝⎜⎛∑j=0Kajλ1j⋱∑j=0Kajλnj⎠⎟⎞=j=0∑KajΛj
又因为
L
2
=
U
Λ
U
T
U
Λ
U
T
=
U
λ
2
U
T
U
T
U
=
E
L^2=U\Lambda U^T U \Lambda U^T=U\lambda^2 U^T\qquad U^TU=E
L2=UΛUTUΛUT=Uλ2UTUTU=E
进而
U
∑
j
=
0
K
a
j
Λ
j
U
T
=
∑
j
=
0
K
a
j
U
Λ
j
U
T
=
∑
j
=
0
K
a
j
L
j
{U\sum_{j=0}^K a_j \Lambda ^j U^T=\sum_{j=0}^K a_j U \Lambda^j U^T = \sum_{j=0}^K a_j L^j}
Uj=0∑KajΛjUT=j=0∑KajUΛjUT=j=0∑KajLj
简化后的输出公式为
σ
(
∑
j
=
0
K
a
j
L
j
x
)
\sigma\left(\sum_{j=0}^K a_j L^j x\right)
σ(j=0∑KajLjx)
k的作用
- k=1时,对顶点i,将顶点i以及顶点i的一阶相邻点的feature(f函数值)做加权求和
- k=2时,对顶点i以及顶点i的一阶相连顶点、二阶相连顶点的feature值加权求和