Bootstrap

GCN的基础入门及数学原理

这是一份用于图卷积神经网络的的入门教程,文章中包含的论证与例子不一定完全严谨,但是有助于加强对知识的理解,若有错误之处也请在评论区指出。


目录

1 预备知识

1.1 什么是卷积

1.1.1 离散卷积

1.1.2 连续卷积

1.1.3 如何理解CNN的卷积

1.2 特征值与特征向量

2 GCN的数学原理及推导

2.1 GCN相关概念

2.2 拉普拉斯矩阵重要性质的证明

2.3 GCN卷积的实现

参考资料:

1 预备知识

1.1 什么是卷积

        学习过《信号与系统》这门课程的同学肯定对卷积的概念有深刻的印象,我在学习这门课程时经常被这个概念绕道团团转,所以卷积到底是什么,该如何通俗的理解卷积,计算机视觉领域对于图像的卷积是什么原理,这是我们需要搞明白的问题。

卷积的一般定义这样解释:

        卷积(Convolution)的数学定义涉及将一个函数与另一个函数结合,从而生成一个新的函数。具体来说,卷积是一种将两个函数通过滑动一个函数来计算另一个函数在不同位置上的相互作用的运算。

        以一维卷积入手,对于连续卷积,两个函数 f(t) 与 g(t),它们的卷积定义为:

(f*g)(t)=\int_{-\infty}^{\infty}f(\tau)g(t-\tau)d\tau

        其中\tau是积分变量,t是时间或者空间变量。

        在离散的情况下,卷积定义为:

(f*g)[n]=\sum_{m=-\infty}^{\infty}f[m]g[n-m]

        其中f[m]g[n]是离散的信号序列,n是离散时间或索引。

        单从公式看来卷积是很抽象的,如何形象的体现卷积“卷”的过程呢?这里分别拿连续和离散的两种示例来解释卷积通过滑动一个函数来计算另一个函数在不同位置上的相互作用是如何操作的,关键词是“滑动”与“相互作用”。

1.1.1 离散卷积

        假设你正在做一个研究,探究温度是如何影响植物生长的,这里就可以引出两个离散序列:

f=[20,22,24,21,19]

        序列f记录了五天范围内的温度变化情况,f[m]表示第m天记录的温度。

g=[0.5,0.3,0.2]

        序列g记录了植物对于温度的响应程度,可以看出 g[1]=0.5,即表明当天温度对植物生长的影响 达到50%,以此类推,g[2]=0.3表明昨天的温度对植物生长的影响达到30%。

        想要探究植物的生长受到过去几天温度影响的累计值,就需要用到卷积的方法,即计算一个函数在另一个函数上的作用

        离散卷积定义如下:

(f*g)[n]=\sum_{m=-\infty}^{\infty}f[m]g[n-m]

        以上实际问题有fg的索引限制,即m=1,2,3,4,5n-m=1,2,3,所以在索引之外的项均不存在。这也很好理解,比如计算第一天温度对于植物生长的影响时,由于没有记录第0天和第-1天的温度,所以就无法计算前两天的温度对植物生长的影响。

        第一天的索引n=1,计算如下:

(f*g)[1]=f[1]g[1-1]=20\times0.5=10

        以此类推,计算后四天的影响评分:

(f*g)[2]=f[2]\cdot g[1]+f[1]\cdot g[2]=22\times0.5+20\times0.3=11+6=17\\(f*g)[3]=f[3]\cdot g[1]+f[2]\cdot g[2]+f[1]\cdot g[3]=22.6\\(f*g)[4]=f[4]\cdot g[1]+f[3]\cdot g[2]+f[2]\cdot g[3]=22.1\\(f*g)[5]=f[5]\cdot g[1]+f[4]\cdot g[2]+f[3]\cdot g[3]=20.6

        经过卷积操作后,我们得到一个新的序列,它表示植物在每一天对前几天温度的累积响应:

(f*g)=[10,17,22.6,22.1,20.6]

        观察计算过程我们可以明显的发现该计算似乎是一种“加权平均”的思想,加权平均体现了序列g对于序列f的作用,即两个离散序列之间的“相互作用”。那么滑动是如何体现的呢,请看下图:

        卷积的“卷”即滑动一个函数作用于另一个函数也直观地体现出来了。注意:g^*=g[n-m]

1.1.2 连续卷积

        在日常生活和信号处理中,很多函数是连续的,这就需要用到连续卷积,公式如下:

(f*g)(t)=\int_{-\infty}^{\infty}f(\tau)g(t-\tau)d\tau

        假设你开了一家生鲜食品工厂,你的工厂的食品生产速度是时间t的函数f(t)。由于生鲜食品会随时间而腐败,那么你的食品的腐败率同样是时间t的函数g(t)。那么该如何计算24h之后你还有多少食品剩余呢?

        首先可以得到一天当中能够生产的生鲜产品的总量:

\int_0^{24}f(t)dt

        在一天中,第一个生产出来的产品会经历24h的腐败,一小时后生产出的产品会经历23h的腐败,以此类推。那么采用卷积的方法就可以计算24h后剩余产品的数量:

\int_{0}^{24}f(t)g(24-t)dt

         通俗的说就是最先生产出的产品最先开始腐败,这就是连续卷积的过程。

1.1.3 如何理解CNN的卷积

        这里不讨论卷积神经网络的其他知识,仅仅从卷积的视角来说明在CNN(Convolutional Neural Network)中卷积是如何实现的。

        CNN的卷积于上文提到的离散卷积十分类似,CNN的作用目标大多为特定图像、视频,这类数据的特点就是有规整的拓扑结构。计算机处理图像的方式即是将图像储存为无数个像素块,每个像素块有特定的数值,以此来支持计算。

        如果理解了上文提到的一维离散卷积过程,就可以很好的理解对于二维图像的卷积过程。如上图所示,input是输入的一张picture,由很多像素构成,可以对应函数f,图中3*3的矩阵被称为卷积核,这里的功能类似于函数g,这个3*3的卷积核在这个5*5的picture中遍历滑动,计算出新的值即是CNN中的2D卷积过程。这样做的好处就是整合了邻居像素点的信息,在我的理解开看,这是一种能够自动学习和提取不同层次的特征的行为。

1.2 特征值与特征向量

        特征值与特征向量在线性代数中的定义大致是这样的:

        对于一个特定的方阵A,如果存在一个非零向量\mathbf{x}满足以下条件

A\mathbf{x}=\lambda\mathbf{x}

        那么称\lambda为方阵A的特征值,\mathbf{x}为方阵的特征向量。

        但是从定义出发还是很难理解特征值与特征向量到底是什么东西,所以用直观的例子能更好的理解其本质。首先我们知道在二维坐标系中,二维方阵其实是一种映射关系,它能够将坐标系中特定的点映射到新的位置。

        我们定义一个二维方阵:

B=\begin{bmatrix}2&1\\0&3\end{bmatrix}

        定义三个向量分别为:

x_1=\begin{bmatrix}1\\2\end{bmatrix},x_2=\begin{bmatrix}3\\3\end{bmatrix},x_3=\begin{bmatrix}2\\4\end{bmatrix}

这三个向量分别经过矩阵B的映射后变为了以下新的向量,如图所示:

Bx_1=\begin{bmatrix}2&1\\0&3\end{bmatrix}\begin{bmatrix}1\\2\end{bmatrix}=\begin{bmatrix}5\\4\end{bmatrix}

        通俗的讲,方阵B作用于这个空间后,将这个空间映射到了另一个坐标系中。我们可以观察到:

x_1=\begin{bmatrix}1\\2\end{bmatrix},x_2=\begin{bmatrix}3\\3\end{bmatrix},x_3=\begin{bmatrix}2\\4\end{bmatrix}

x_1'=\begin{bmatrix}4\\6\end{bmatrix},x_2'=\begin{bmatrix}9\\9\end{bmatrix},x_3'=\begin{bmatrix}8\\12\end{bmatrix}

        更一般的来说,在原始坐标系上取两个向量,当经过这个矩阵映射到新的空间中时,我们可以发现映射改变了向量的方向于与大小。

        同样的我们重点观察绿色与黄色这个向量,此时可以发现这个向量在映射到新的空间后没有发生方向变化,仅仅大小变为原来的三倍。

        以上现象说明,存在特定向量在经过映射之后不产生方向变化的向量(与自身平行),即满足以下关系:

Bx_{2}=\lambda x_{2}

        即证明向量 [1,1]^T是矩阵B的特征向量之一,\lambda是矩阵B的特征值之一。(在上述例子中x_2对应的\lambda=3

        对于一个n维方阵来说,为了确保其作用于一个特定维度的空间后不会降维,其至少需要包含n个非零特征值。拿二维空间距离,如果一个方阵仅有一个非零特征值,那么其映射后的二维空间将会坍缩成一维空间,如下图所示:

        我们再次回到本质,经过矩阵映射之后不产生方向变化的向量的特征向量,特征向量缩放的倍数为特征值。对于矩阵B来说,我们已经一次简单的实验中发现了它的一个特征向量

        《线性代数》课程中有规范的特征向量与特征值的解,这里省略不必要的过程,得出矩阵B

的两个特征向量与特征值如下:

u_1=\begin{bmatrix}1\\0\end{bmatrix},u_2=\begin{bmatrix}1\\1\end{bmatrix},\lambda_1=2,\lambda_2=3

         特征向量的作用在于其方向不受映射的变化,同时两个不共线的向量可以组成该平面内任何向量,这两个性质就通俗的说明:矩阵对空间映射的变化仅与特征向量的变化有关,映射前后的变化可以用特征向量的线性组合表示。

        将这两个特征向量线性组合成特征向量矩阵,将特征值化为对角矩阵我们可以得到如下结果:

U=\begin{bmatrix}1&1\\0&1\end{bmatrix},\Lambda=\begin{bmatrix}2&0\\0&3\end{bmatrix}

        由此我们的矩阵B可以分解为以下形式(课本定义为B的特征分解):

B=U\Lambda U^{-1}

\begin{bmatrix}2&1\\0&3\end{bmatrix}=\begin{bmatrix}1&1\\0&1\end{bmatrix}\begin{bmatrix}2&0\\0&3\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}^{-1}

        我们之前的视角是将B视作一个整体,探究其对二维空间每个点的作用,作用结果为:

Bx=\begin{bmatrix}2&1\\0&3\end{bmatrix}\begin{bmatrix}x_i\\x_j\end{bmatrix}

        利用分解后的矩阵可以得到以下视角:

Bx=\begin{bmatrix}1&1\\0&1\end{bmatrix}\begin{bmatrix}2&0\\0&3\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}^{-1}\begin{bmatrix}x_i\\x_j\end{bmatrix}

        首先 \begin{bmatrix}1&1\\0&1\end{bmatrix}^{-1}\begin{bmatrix}x_i\\x_j\end{bmatrix} 在特征向量的坐标系下分解得到系数,\begin{bmatrix}2&0\\0&3\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}^{-1}\begin{bmatrix}x_i\\x_j\end{bmatrix}其次根据特征值对系数进行缩放,最终\begin{bmatrix}1&1\\0&1\end{bmatrix}\begin{bmatrix}2&0\\0&3\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}^{-1}\begin{bmatrix}x_{i}\\x_{j}\end{bmatrix}表示按照上述计算出的系数重新组合特征向量得到结果。

        同时为了更好的理解下文内容还需要了解一些结论,这里就不一一证明:

  • 如果一个矩阵是实对称阵,那么他就有n个特征值与n个互相正交的特征向量
  • 一般矩阵的特征值分解为:

B=U\Lambda U^{-1}

  • 对称矩阵的特征值分解为:

B=U\Lambda U^{T}

  • 如果一个矩阵的所有特征值大于等于零,那么就说明这个矩阵是一个半正定的矩阵

2 GCN的数学原理及推导

2.1 GCN相关概念

        现在我们大致已经了解一些关于卷积的概念与线性代数的基础知识,让我们着手去研究以下图卷积网络(Graph Convolutional Network,GCN)到底是什么东西。

        之前提到的离散卷积、连续卷积以及适用在CNN计算机视觉中的卷积的本质按我的理解来说就是整合邻居的信息。例如在离散卷积示例中探究温度对于植物生长的影响,采用的加权平均的思想整合了三天的温度信息为一个输出;再者,观察CNN的卷积也不难看出,卷积核整合了特定范围内的信息为一个输出。对于图结构来说,我们只需要找一个卷积核去遍历图结构整合邻居信息不就行了吗?然而事情远远没有这么简单。

        回到CNN卷积的部分,我们发现CNN的作用目标大多为特定图像、视频,这类数据的特点就是有规整的拓扑结构,所以一个3*3的卷积核可以滑动遍历整个图像。但是图结构可没有这么简单。

        图论中其定义如下:

  • 节点/顶点 (Vertex) 图中的每个对象或元素称为节点
  • (Edge): 节点之间的连接关系称为边
  • 邻接节点: 如果两个节点之间存在一条边,则它们被称为邻接节点。
  • 无向图中的度: 一个节点的度是与它连接的边的数量。

        观察以上的人际关系网络图可以看出,有的节点包含8个边,有的节点只包含两个边,这就是图结构复杂拓扑结构的直观展示。所以我们无法找到一个特定形状的kernel直接在图结构的空间域上卷积。

        为了实现卷积,大佬们想到的解决方案就是“傅里叶变换”,将图结构变换到另一个方便进行卷积操作域中,完成卷积后再采用逆变换将其变回空间域中。(注意这里转换操作,有没有感觉和之前特征分解采用的思想很类似)

        以下我就用实际的例子来证明GCN是如何运作的:

        拿一个六个节点的图举例:

        该图的邻接矩阵如下:

A=\begin{bmatrix}0&1&1&1&1&1\\1&0&1&1&0&1\\1&1&0&0&0&1\\1&1&0&0&0&0\\1&0&0&0&0&1\\1&1&1&0&1&0\end{bmatrix}

        该图的度矩阵如下:

D=\begin{bmatrix}5&0&0&0&0&0\\0&4&0&0&0&0\\0&0&3&0&0&0\\0&0&0&2&0&0\\0&0&0&0&2&0\\0&0&0&0&0&4\end{bmatrix}

        邻接矩阵和度矩阵能够很好地将图结构转化为数学语言与计算机语言,这对于计算来说是十分重要的。

2.2 拉普拉斯矩阵重要性质的证明

        接下来我们引入两个概念:图的拉普拉斯矩阵(L)与图的对称规范化拉普拉斯矩阵(L_{sym}):

L=D-A

L_{sym}=D^{-1/2}LD^{-1/2}

        由于拉普拉斯矩阵是由图的邻接矩阵与度矩阵线性运算得到的,同时对称规范化拉普拉斯矩阵只是拉普拉斯矩阵的规范化结果,所以很容易的可以看出二者都是实对称矩阵,所以他们都有n个特征值与nn个正交的特征向量。

        只需要证明拉普拉斯矩阵的二次型大于等于零即能够证明拉普拉斯矩阵是半正定的:

x^{T}Lx=x^{T}(D-A)x=x^{T}Dx-x^{T}Ax

x^TDx=\sum_{i=1}^n d_ix_i^2

x^{T}Ax=\sum_{i=1}^{n}\sum_{j=1}^{n}A_{ij}x_{i}x_{j}=\sum_{(i,j)\in E}x_{i}x_{j}

        简化后可得:

x^TLx=x_i^2+x_j^2-2x_ix_j=(x_i-x_j)^2\geq0

        说明L是半正定的,同理L_{sym}也是半正定的。此时已经可以说明这两个矩阵的特征值都是非负数

        现在承接上文的结论来证明L_{sym}矩阵的另一个重要性质:

        由于:

x^TLx=x^T(D-A)x=(x_i-x_j)^2\geq0

        我们定义一个新矩阵L_{pos}=D+A,则有:

x^TL_{pos}x=x^T(D+A)x=(x_i+x_j)^2\geq0

x^{T}D^{-1/2}L_{pos}D^{-1/2}x=x^{T}D^{-\frac{1}{2}}(D+A)D^{-1/2}x\geq0

x^{T}D^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}}x=x^{T}\left(I+D^{-\frac{1}{2}}AD^{-\frac{1}{2}}\right)x\geq0

x^Tx\geq-x^TD^{-\frac{1}{2}}AD^{-\frac{1}{2}}x

2x^{T}x\geq x^{T}x-x^{T}D^{-\frac{1}{2}}AD^{-\frac{1}{2}}x

2x^{T}x\geq x^{T}(I-D^{-\frac{1}{2}}AD^{-\frac{1}{2}})x

2x^Tx\geq x^TD^{-\frac{1}{2}}(D-A)D^{-\frac{1}{2}}x

2x^Tx\geq x^TD^{-\frac{1}{2}}LD^{-\frac{1}{2}}x

2\geq\dfrac{x^TD^{-\frac12}LD^{-\frac12}x}{x^Tx}=\dfrac{x^TL_{sym}x}{x^Tx}

        根据Rayleigh商(Rayleigh quotient)的定义,对于任何非零向量x,Rayleigh 商的值R(x)=\frac{x^{T}Ax}{x^{T}x} 有限制:\lambda_{min}\leq R(x)\leq\lambda_{max},故证得对称规范化拉普拉斯矩阵(L_{sym})的特征值在[0,2]区间。

2.3 GCN卷积的实现

        经过以上证明的启发,应该能看出来图的拉普拉斯矩阵对于GCN卷积来说十分重要,现在我们就来揭示图卷积神经网络的是如何整合邻居节点信息的。

        还是拿这张图举例:

        图中有六个节点,我们假设每个节点都包含一个常数特征,那么这个图所构成的特征向量如下所示:

X=\begin{bmatrix}x_1\\x_2\\\vdots\\x_6\end{bmatrix}

        同时我们已经完成了关于拉普拉斯矩阵重要性质的证明,现在我们知道拉普拉斯矩阵L是一个实对称的半正定矩阵,其特征向量线性组合为U,特征值构成的对角矩阵为\Lambda,可得:

L=U\Lambda U^T

         当我们采用拉普拉斯矩阵L与图的特征矩阵X相乘可以得到如下结果:

LX=\begin{bmatrix}5&-1&-1&-1&-1&-1\\-1&4&-1&-1&0&-1\\-1&-1&3&0&0&-1\\-1&-1&0&2&0&0\\-1&0&0&0&2&-1\\-1&-1&-1&0&-1&4\end{bmatrix}\times\begin{bmatrix}x_1\\x_2\\\vdots\\x_6\end{bmatrix}=\begin{bmatrix}5x_1-x_2-x_3-x_4-x_5-x_6\\-x_1+4x_2-x_3-x_4-x_6\\-x_1-x_2+3x_3-x_6\\-x_1-x_2+2x_4\\-x_1+2x_5-x_6\\-x_1-x_2-x_3-x_5+4x_6\end{bmatrix}

        可以看出这恰恰是一种整合节点与其邻居信息的计算方法。接下来可以推导出:

LX=U\Lambda U^TX

        其中U^T X 部分是将特征向量 X转化到新的域中,矩阵\Lambda只对其进行放缩操作,U则是将其重新转换到现有的空间域中,由此便可以很容易地实现卷积的过程。(该部分与线性代数部分特征分解的思想一致)

        由此衍生出的一个新的问题是,该方法需要计算拉普拉斯矩阵的特征值域特征向量,但是算法复杂度为O(n^3),大规模的图结构会出现计算困难的情况。所以需要一种不需要进行特征分解的方法来解决问题。

        我们假设有一种函数F(\cdot),它接受的参数为图的邻接矩阵A,并且该函数能输出类似于拉普拉斯矩阵L性质的半正定的实对称矩阵,即该函数满足如下关系:

F(A)=U\Lambda U^T

        这里的U,\Lambda即代表了F(A)的特征向量于特征值

        图卷积的一般过程如下:

g_\theta*X=Ug_\theta(\Lambda)U^TX

        其中U^T XUU^T X代表了域的转换与召回,g_{\theta} (\Lambda)代表了一种与特征值相关的函数关系,我们定义g_{\theta} (\Lambda)为多项式结构:

g_\theta(\Lambda)=\theta_0\Lambda^0+\theta_1\Lambda^1+\ldots+\theta_n\Lambda^n

        对\Lambda^n来说:

(U\Lambda U^T)^n=U\Lambda U^TU\Lambda U^T...U\Lambda U^TU\Lambda U^T=U\Lambda^nU^T

        故可推导:

Ug_\theta(\Lambda)U^T=g_\theta(U\Lambda U^T)=g_\theta\big(F(A)\big)

        该方法是一种避免特征分解的基础解法。但是高次多项式一般会出现梯度爆炸或者梯度消失问题,所以在实际操作时采用切比雪夫多项式。

        切比雪夫多项式是一种用于逼近任意函数的工具,递推公式如下:

T_0(\Lambda)=1,T_1(\Lambda)=\Lambda,T_n(\Lambda)=2\lambda T_{n-1}(\Lambda)-T_{n-2}(\Lambda)

        利用这种递归形式,图卷积可以通过局部邻域的信息进行逼近,而不需要显式计算特征分解。

        由于切比雪夫多项式适合在区间[-1,1]上进行逼近,所以我们输入矩阵的特征值要限制在该区间内。

        这里引入对称规范化拉普拉斯矩阵L_{sym},由于已经证明得出L_{sym}的特征值区间在[0,2]区间,只需要再减去一个单位矩阵I就可以将特征值限制在 [-1,1]之间。

        我们采用切比雪夫多项式逼近g_{\theta}(\Lambda),得到结果如下:

F(A)=U\Lambda U^T=L_{sym}-I

g_\theta(\Lambda)=\sum_{k=0}^{K-1}\theta_k T_k(\Lambda)

        其中\theta_{k} 是待学习的参数。那么卷积过程变换如下:

g_\theta*X=\sum_{k=0}^{K-1}U\theta_kT_k(\Lambda)U^TX

g_\theta*X=\sum_{k=0}^{K-1}\theta_kT_k(U\Lambda U^T)X

g_{\theta}*X=\sum_{k=0}^{K-1} \theta_{k}T_{k}(L_{sym}-I)X

        当k=1时候,采用一阶近似计算方法最简单:

g_{\theta}*X=\theta_{0}T_{0}\big(L_{sym}-I\big)X+\theta_{1}T_{1}\big(L_{sym}-I\big)X

        由于 T_{0}(\Lambda)=1,T_{1}(\Lambda)=\Lambda

g_\theta*X=\theta_0X+\theta_1(L_{sym}-I)X

g_{\theta}*X=\theta_{0}X-\theta_{1}\big(D^{-1/2}AD^{-1/2}\big)X

        现在加入正则化:\theta_{0}=-\theta

g_{\theta}*X=\theta_{0}(I+D^{-1/2}AD^{-1/2})X

        如此便得到了与Kipf.的论文中一样的公式,在论文中作者还使用了Renormalization trick处理,处理后的结果为:

g_{\theta}*X=D^{-1/2}\tilde{A}D^{-1/2}\theta_{0}X

参考资料

4-gcn_哔哩哔哩_bilibili

【无痛线代】特征值究竟体现了矩阵的什么特征?_哔哩哔哩_bilibili

https://www.zhihu.com/question/22298352/answer/228543288

https://zhuanlan.zhihu.com/p/54505069

http://arxiv.org/abs/1609.02907

;