瞎搞Paper
首发于瞎搞Paper

从 Graph Convolution Networks (GCN) 谈起

本文所提到的观点和公式, 都出于自己的瞎掰, 不代表原作者,在没有充分讨论的情况下, 未免有很多纰漏, 欢迎批评指正.

开专栏后还是先从最近看的GCN开始讲起. 今天我们先来看这一篇

ICLR 2017, Semi-supervised Classification with Graph Convolutional Networks, Thomas N. Kipf, Max Welling. [pdf], [code]

直接开始

原理什么我就不多说了

如何理解 Graph Convolutional Network(GCN)?www.zhihu.com图标

@superbrother 给出了非常详细的说明, 写得很好, 手动点赞.

本文主要旨在瞎聊, 给出几个我觉得有意思的点.

为了方便阅读, 我先给出几个notation:

\mathbf{A} \in \mathbb{R}^{n \times n} : adjacency matrix, \mathbf{D} \in \mathbb{R}^{n \times n} : diagonal degree matrix, \mathbf{X} \in \mathbb{R}^{n \times d} : feature matrix.

然后是一些定义:

\mathbf{L} = \mathbf{D} - \mathbf{A} : graph Laplacian

\mathcal{L} = \mathbf{D}^{-1/2}\mathbf{L}\mathbf{D}^{-1/2} : normalized graph Laplacian

\mathcal{A} = \mathbf{D}^{-1/2} \mathbf{A} \mathbf{D}^{-1/2} : normalized adjacency


然后先来看看所谓的spectral graph convolutions:

文中指出 spectral convolutions 能够定义: 在傅里叶域里, 一个signal通过一个filter后的情况:

g_{\theta} \star \mathbf{x} = \mathbf{U} g_{\theta} \mathbf{U}^\top \mathbf{x} \\

然后这个filter可以用Chebyshev polynomial 来近似 (注: Chebyshev polynomial的定义是一个递归的形式: T_0(x)=1, T_1(x)=x, T_k(x)=2xT_{k-1}(x)-T_{k-2}(x) ):

g_{\theta'} (\mathbf{\Lambda}) \approx \sum_{k=0}^K \theta'_k T_k(\tilde{\mathbf{\Lambda}})\\

那么这个signal 和 approximated filter在一起就变成了

g_{\theta'} \star \mathbf{x} \approx \sum_{k=0}^K \theta'_k T_k(\tilde{L}) \mathbf{x} \\

最后这个K太麻烦, 所以只取到K=1为止, 即很多时候说的 GCN is the first-order approximation of spectral graph convolutions. 这个时候就变成了

\begin{align} g_{\theta'} \star \mathbf{x}   &\approx \sum_{k=0}^1 \theta'_k T_k(\tilde{L}) \mathbf{x} \\  &= \theta'_0 \mathbf{x} + \theta'_1 \mathbf{(L - I)x} \\  &= \theta'_0 \mathbf{x} -  \theta'_1\mathbf{D^{-1/2}A D^{-1/2}x} \end{align} \\

Okay, 到现在为止我觉得没有问题. 因为 \theta 是个filter的parameter, 所以可以\theta = \theta_0' = -\theta_1' 那么这个时候就变成了

g_{\theta'} \star \mathbf{x}  \approx \theta \mathbf{(I + D^{-1/2}A D^{-1/2})} \mathbf{x} \\

Perfect, 我们终于看到了非常相似的形式.

杠精的角度

Okay, 上面提到的 \hat{\mathbf{A}} = \mathbf{I + D^{-1/2}A D^{-1/2}} 其实并不是我们最后看到的样子, 这个形式是说在normalized adjacency matrix上再加个 identity matrix, 但是实际上, 用的却是normalized self-looped adjacency matrix. 原文中用了renormalization trick, 随后就变成了现在大家看到的 \hat{\mathbf{A}} = \mathbf{\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}}.\\

前者的形式其实是 \mathbf{I + D^{-1/2}A D^{-1/2}} =\mathbf{D^{-1/2}({\color{red} D} + A)D^{-1/2}}\\

后者呢, 其实是这样的 \mathbf{\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}} = \mathbf{(D+{\color{red}I})^{-1/2} (A+{\color{red} I}) (D+{\color{red} I})^{-1/2}}\\

很显然两者之前是有差别的.

所以用Wavelets 和 graph convolutional filter来解释GCN不是让我很信服.

而且问题不仅仅止于此.

让我们回过头来看看, 因为 \theta 本身是一个自由变量, 我们也可以把 \theta = \theta_0' = \theta_1' , 那么这个时候 g_{\theta'} \star \mathbf{x}  \approx \theta \mathbf{(I - D^{-1/2}A D^{-1/2})} \mathbf{x} = \theta \mathcal{L} \mathbf{x}\\ \mathcal{L} 就是之前定义中的normalized graph Laplacian, 也就是说这个时候

\hat{\mathbf{A}} = \mathcal{L}= \mathbf{D}^{-1/2}(\mathbf{D-A})\mathbf{D}^{-1/2}.\\

既然 \theta 是自由变量, 那么可以把它设成正负都没有影响啊, 如果可以是一正一负, 自然也可以是两个都是正的.

有些paper会把GCN的renormalization trick 说成是一个self-looped graph. 对, 我就是这么较真, 如果说一个图里加上self-loop, 意味着什么? \mathbf{A}' = \mathbf{A} + {\color{red} 2}\mathbf{I} , 那么这个时候应该是这样的

\mathbf{\hat{A}} = \mathbf{(D+{\color{red}2}I)^{-1/2} (A+{\color{red} 2}I) (D+{\color{red} 2 }I)^{-1/2}}.\\

我就是来搞事情的. 其实从效果上看, 这个形式其实没有差太多, 但是把GCN的renormalization说成self-looped的, 是不够严谨的.

那如果把GCN里用到的形式看成一个加了 \mathbf{I} 的normalized adjacency matrix, 那么我们是不是也能更简化用没有加 \mathbf{I} 的adjacency matrix呢? 于是就成了

\hat{\mathbf{A}} = \mathcal{A} = \mathbf{D^{-1/2}A D^{-1/2}} \\

举个栗子来看看

到现在为止, 我们看到了不同的 \hat{\mathbf{A}} , 让我们稍稍总结一下

\begin{align} \hat{\mathbf{A}}_1 &= \mathbf{\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}}\\ \hat{\mathbf{A}}_2 &= \mathbf{I + D^{-1/2}A D^{-1/2}}\\ \hat{\mathbf{A}}_3 &= \mathbf{D}^{-1/2}(\mathbf{D-A})\mathbf{D}^{-1/2}\\ \hat{\mathbf{A}}_4 &= \mathbf{D^{-1/2} A D^{-1/2}} \end{align}\\

然后我们用 \mathbf{Z} = \sigma(\mathbf{\hat{A}XW}) 来看一下不用的 \mathbf{\hat{A}} 到底会有什么不同. 我用Karate俱乐部为例, 这个俱乐部里有个大老板和教练, 他们的关系很微妙, 使得这整个俱乐部的人, 包括其他员工和一些学员分成了两个阵营 (有些research也把它分成多个阵营, 没关系, 我就以两个阵营为例的好了). 我用的是unweighted karate club data.

karate club labels

先来看一下不同 \hat{\mathbf{A}} 长成了什么样,

Normalization with different tricks

然后把它放到一个两层的GCN里做node classification, 用softmax来作概率. 只用老板和教练(两个点)做training, 没有validation, 直接看在其他32个点上的prediction accuracy.

Accuracy with different normalization

可以看的出来用GCN里面的renormalization trick是要稍稍好一点, 相反如果直接用normalized graph Laplacian效果很差. 为什么呢? 因为 \mathcal{L} 里有很多是负的. 如果我们简单的加绝对值处理,

\hat{\mathbf{A}} = \mathbf{D}^{-1/2}(\mathbf{|D-A|})\mathbf{D}^{-1/2} =  \mathbf{D}^{-1/2}(\mathbf{D+A})\mathbf{D}^{-1/2} = \hat{\mathbf{A}}_2\\

我觉得这就是为什么要把 \theta = \theta_0' = -\theta_1' .

除此之外, 我之前也提到了所谓的self-looped graph的说法其实不是很准确. 假定我们有个参数 \alpha , 使得

\mathbf{\hat{A}} = \mathbf{(D+{\color{red}\alpha}I)^{-1/2} (A+{\color{red} \alpha}I) (D+{\color{red} \alpha }I)^{-1/2}}\\

那么GCN用到的其实是 \alpha=1 , self-looped graph是指 \alpha=2 的时候, 而 \alpha=0 就是normalized adjacency matrix \mathcal{A} .

Accuracy with different of alpha

看的出来, 其实不同的alpha对结果没有太大的差别. 这个加上去的 \alpha \mathbf{I} 我觉得可以作为一个aggregate自我信息的weight.

写在最后

最后我们来透过现象看本质, 所谓的各种Graph Laplacian或者其变形都可以看成是graph operator. 不同的operator最后会有不同的结果.

瞎搞的一些Graph Operators

如果你想知道更多的spectral graph theory, 推荐金芳蓉的那本书, 很多在不同graph下关于eigenvalue的变化性质. 比如第二小的eigenvalue和connectivity有关.

Kipf提到的 \lambda_{\max} \approx 2 也是来自于graph Laplacian的性质. 再比如 normalized adjacency matrix的eigenvalue是在[-1, 1]之间的, 那么 \mathbf{I + D^{-1/2}A D^{-1/2}}\mathbf{I - D^{-1/2}A D^{-1/2}}  的eigenvalue都是在[0, 2]之间的.

甚至考虑到adversarial attacks, 在图中加或者减去edge, 新的eigenvalues和原来的eigenvalues之间, 其实是有非常严格的变化限制的.

因为GCN本事是transductive learning的, 如果图很大, 这个模型不会很适用, 就算有人用了所谓的simplified方法 就是把relu activation换成linearized, 也没法真正解决图很大的问题.

也就是说GCN本身应该用在一些相对固定的数据上, 比如蛋白质结构, 药物研发之类的, 而真正用到大的数据的时候, 还是需要inductive learning的方法来帮忙.


本文主要还是瞎(tui)搞(qiao)了一下GCN的模型, 如果有不严谨的公式和问题, 欢迎交流.

以上.


p.s. 原创不易, 未经允许, 不得转载.

pp.s 诚点赞, 手留余 (真香)

ppp.s 知乎的这个数学公式输入方法真的是很不舒服. 能不能直接把mathjax放进来? @刘看山

编辑于 2020-03-10

文章被以下专栏收录