Deep Learner
首发于Deep Learner

图卷积网络(GCN)新手村完全指南

前言

图卷积网络Graph Convolutional Network,简称GCN,最近两年大热,取得不少进展。

最近,清华大学孙茂松教授组在 arXiv 发布了论文Graph Neural Networks: A Review of Methods and Applications,作者对现有的 GNN 模型做了详尽且全面的综述。GCN就是GNN中的一种重要的分支。

但是对于GCN的萌新,看着这篇综述可能还是会困难重重、不知所措。

写这篇文章的目的,就是帮助萌新们掌握GCN的重要概念和理论,走出新手村。


什么是Convolution

Convolution的数学定义是
(f*g)(t)=\int_{\mathbb{R}}^{}f(x)g(t-x)dx

一般称g为作用在f上的filter或kernel

一维的卷积示意图如下

大家常见的CNN二维卷积示意图如下

在图像里面卷积的概念很直接,因为像素点的排列顺序有明确的上下左右的位置关系。

那在抽象的graph里面卷积该怎么做呢

比如这个社交网络抽象出来的graph里面,有的社交vip会关联上万的节点,这些节点没有空间上的位置关系,也就没办法通过上面给出的传统卷积公式进行计算。


Fourier变换

为了解决graph上卷积计算的问题,我们给出第二个装备--Fourier变换。

先上结论,根据卷积定理,卷积公式还可以写成

f*g=\mathcal{F}^{-1}\{\mathcal{F}\{f\}\cdot \mathcal{F}\{g\}\}

这样我们只需要定义graph上的fourier变换,就可以定义出graph上的convolution变换。


好的,先来看下Fourier变换的定义

\mathcal{F}\{f\}(v)=\int_{\mathbb{R}}^{}f(x)e^{-2\pi ix\cdot v}dx

Inverse Fourier变换则是

\mathcal{F}^{-1}\{f\}(x)=\int_{\mathbb{R}}^{}f(v)e^{2\pi ix\cdot v}dv


根据Fourier变换及其逆变换的定义,下面我们来证明一下卷积定理

我们定义 hfg 的卷积,那么

h(z)=\int_{\mathbb{R}}^{}f(x)g(z-x)dx

\begin{align} \mathcal{F}\{f*g\}(v) &= \mathcal{F}\{h\}(v) \\ &= \int_{\mathbb{R}}^{}h(z)e^{-2\pi iz\cdot v}dz \\ &= \int_{\mathbb{R}}^{}\int_{\mathbb{R}}^{}f(x)g(z-x)e^{-2\pi iz\cdot v}dxdz \\ &= \int_{\mathbb{R}}^{}f(x)(\int_{\mathbb{R}}^{}g(z-x)e^{-2\pi iz\cdot v}dz)dx \\  \end{align}

带入 y=z-x ; dy=dz

\begin{align} \mathcal{F}\{f*g\}(v) &= \int_{\mathbb{R}}^{}f(x)(\int_{\mathbb{R}}^{}g(y)e^{-2\pi i(y+x)\cdot v}dy)dx \\  &= \int_{\mathbb{R}}^{}f(x)e^{-2\pi ix\cdot v}(\int_{\mathbb{R}}^{}g(y)e^{-2\pi iy\cdot v}dy)dx \\ &= \int_{\mathbb{R}}^{}f(x)e^{-2\pi ix\cdot v}dx\int_{\mathbb{R}}^{}g(y)e^{-2\pi iy\cdot v}dy \\ &= \mathcal{F}\{f\}(v)\cdot \mathcal{F}\{g\}(v)  \end{align}

最后对等式的两边同时作用 \mathcal{F}^{-1} ,得到

f*g=\mathcal{F}^{-1}\{\mathcal{F}\{f\}\cdot \mathcal{F}\{g\}\}


Laplacian算子

一波未平,又来一个陌生的概念。。。

不要担心,这是出新手村之前的最后一件装备了。

一阶导数定义为

f^{\prime}(x)=\lim_{h \rightarrow 0}\frac{f(x+h)-f(x)}{h}

laplacian算子简单的来说就是二阶导数

\Delta f(x)=\lim_{h \rightarrow 0}\frac{f(x+h)-2f(x)+f(x-h)}{h^{2}}


那在graph上,我们可以定义一阶导数为

f_{*g}^{\prime}(x)=f(x)-f(y)

其中y是x的邻居节点

那么对应的Laplacian算子可以定义为
\Delta_{*g} f^{\prime}(x)=\Sigma_{y\sim x} f(x)-f(y)

定义 DN\times N 的度数矩阵(degree matrix)

D(i,j) =  \begin{cases}     d_{i} & \text{if } i=j \\    0       & otherwise \end{cases}

定义 AN\times N 邻接矩阵(adjacency matrix)

A(i,j) =  \begin{cases}     1 & \text{if } x_{i} \sim x_{j} \\    0       & otherwise \end{cases}

那么图上的Laplacian算子可以写成

L = D-A

标准化之后得到 L=I_{N}-D^{-\frac{1}{2}}AD^{-\frac{1}{2}}

定义Laplacian算子的目的是为了找到Fourier变换的基

比如传统Fourier变换的基 e^{2\pi ix\cdot v} 就是Laplacian算法的一组特征向量

\Delta e^{2\pi ix\cdot v} = \lambda e^{2\pi ix\cdot v} , \lambda 是一个常数

那么图上的Fourier基就是 L 矩阵的n个特征向量 U=[u_1 ...u_n]L 可以分解为

L=U\Lambda U^{T}

其中 \Lambda 是特征值组成的对角矩阵


\begin{array}{c|c|c} & \text{传统Fourier变换} & \text{Graph Fourier变换} \\ \hline Fourier变换基 & e^{-2\pi ixv} & U^{T} \\ 逆Fourier变换基 & e^{2\pi ixv} & U \\ 维度 & \infty & 点的个数n \\ \end{array}\\


那么Graph Fourier变换可以定义为

\mathcal{GF}\{f\}(\lambda_{l})=\sum_{i=1}^{n}{f(i)u_{l}^{*}(i)}

其中 f(i) 可以看做是作用在第 i 个点上的signal,用向量 x=(f(1)...f(n))\in \mathbb{R}^{n} 来表示

u_{l}^{*}u_{l} 的的对偶向量, u_{l}^{*} 是矩阵 U^{T} 的第 l 行,u_{l} 是矩阵 U 的第 l 行。

那么我们可以用矩阵形式来表示Graph Fourier变换

\mathcal{GF}\{x\}=U^{T}x

类似的Inverse Graph Fourier变换定义为

\mathcal{IGF}\{\hat{f}\}(i)=\sum_{l=0}^{n-1}{\hat{f}(\lambda_{l})u_{l}(i)}

它的矩阵形式表达为

\mathcal{IGF}\{x\}=Ux


推导Graph Convolution

走到这里,我们已经获得了新手村的所有装备,下面就开始推导GCN的公式。

还记得我们之前提到的先上卷积定理吗

f*g=\mathcal{F}^{-1}\{\mathcal{F}\{f\}\cdot \mathcal{F}\{g\}\}

那么图的卷积公式可以表示为

g*x=U(U^{T}g\cdot U^{T}x)

作为图卷积的filter函数 g ,我们希望具有很好的局部性。就像CNN模型里的filter一样,只影响到一个像素附近的像素。那么我们可以把 g 定义成一个laplacian矩阵的函数 g(L)

作用一次laplacian矩阵相当于在图上传播了一次邻居节点。进一步我们可以把 U^{T}g 看做是 g_{\theta}(\Lambda) 一个laplacian特征值的函数,参数为 \theta

改写上面的图卷积公式,我们就可以得到论文SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

https://arxiv.org/pdf/1609.02907.pdfarxiv.org

的公式(3)

g_{\theta}*x=Ug_{\theta}U^{T}x=Ug_{\theta^{\prime}}(\Lambda)U^{T}x

可以看到这个卷积计算的复杂度是非常高的,涉及到求laplacian矩阵的特征向量,和大量的矩阵计算。下面我们考虑对filter函数做近似,目标是省去特征向量的求解

g_{\theta^{\prime}}(\Lambda)\approx\sum_{k=0}^{K}\theta_{k}^{\prime}T_k(\tilde{\Lambda})

其中 T_{k} 是Chebyshev多项式。这里可以把简单 g_{\theta}(\Lambda) 简单看成是 \Lambda 的多项式。

因为 U\Lambda^{k}U^{T}=(U\Lambda U^{T})^{k}=L^{k}

所以上面filter函数可以写成 L 的函数 g_{\theta^{\prime}}(\Lambda)\approx\sum_{k=0}^{K}\theta_{k}^{\prime}T_k(\tilde{L})

设定 K=1那卷积公式可以简化为

\begin{align} g_{\theta^{\prime}}*x &\approx \theta(I_{N}+L)x \\ &= \theta(I_{N}+D^{-\frac{1}{2}}AD^{-\frac{1}{2}})x \end{align}

\tilde{A}=A+I_{N}\tilde{D}_{ii}=\sum_{j}^{}\tilde{A}_{ij}

g_{\theta^{\prime}}*x=\theta(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}})x

那么再加上激活层,我们就可以得到最终的GCN公式

H^{(l+1)}=\sigma(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}}H^{(l)}W^{(l)})

编辑于 2019-01-11

文章被以下专栏收录