图卷积神经网络从入门到放弃
前言
最近在看论文的时候,发现GCN一直被各种论文当作模型中的基础使用,然而我对GCN是什么还是一篇混沌,遂开始阅读GCN的相关论文文献,但是被天书般的公式——傅里叶变换、拉普拉斯算子等等,给搞蒙了,所以写(搬运)一个比较入门的介绍,以记录我真的在这方面努力过!
一、什么是欧几里德结构样本?
数据类型可以分为两大类:
- 欧几里德结构数据(Euclidean Structure Data)
- 非欧几里德结构数据(Non-Euclidean Structure Data)
欧几里德结构样本:
类似于图片(image)和视频(video)以及语音(voice)这种排列整齐的都是欧几里得结构样本,例如图片可以通过矩阵存储像素值:
对于某个节点,我们很容易可以找出其邻居节点,而且,因为这类型的数据排列整齐,不同样本之间可以容易的定义出“距离”这个概念出来。我们且思考,假设现在有两个图片样本,尽管其图片大小可能不一致,但是总是可以通过空间下采样的方式将其统一到同一个尺寸的,然后直接逐个像素点进行相减后取得平方和,求得两个样本之间的欧几里德距离是完全可以进行的:
d ( s i , s j ) = 1 2 ∣ ∣ s i − s j ∣ ∣ 2 d(s_i,s_j)=\cfrac{1}{2}||s_i-s_j||^2 d(si,sj)=21∣∣si−sj∣∣2
因此,不妨把图片样本的不同像素点看成是高维欧几里德空间中的某个维度,一张m × n 的图片可以看成是m × n 维的欧几里德样本空间中的一个点,而不同样本之间的距离就体现在了样本点之间的距离了。
同样的,视频可以在时间轴上进行采样做到统一的目的,而音频也是一样的。因此它们都是符合欧几里德距离定义的类型的样本。
非欧几里德结构样本:
类似于图这种结构的排列不整齐,比较的随意的数据就是非欧几里德结构样本:
对于数据中的某个点,难以定义出其邻居节点出来,或者是不同节点的邻居节点的数量是不同的,这个其实是一个特别麻烦的问题,因为这样就意味着难以在这类型的数据上定义出和图像等数据上相同的卷积操作出来,而且因为每个样本的节点排列可能都不同
二、GCN是做什么的?
上面讲的图片或者音频,都属于欧几里德结构样本,因此才有维度的概念,欧式结构的数据的特点就是结构很规则。但是现实生活中,其实有很多很多不规则的数据结构,典型的就是图结构,或称拓扑结构,如社交网络、化学分子结构、知识图谱等等;即使是语言,实际上其内部也是复杂的树形结构,也是一种图结构;而像图片,在做目标识别的时候,我们关注的实际上只是二维图片上的部分关键点,这些点组成的也是一个图的结构。
图的结构一般来说是十分不规则的,可以认为是无限维的一种数据,所以它没有平移不变性。每一个节点的周围结构可能都是独一无二的,这种结构的数据,就让传统的CNN、RNN瞬间失效。所以很多学者从上个世纪就开始研究怎么处理这类数据了。这里涌现出了很多方法,例如GNN、DeepWalk、node2vec等等,GCN只是其中一种,这里只讲GCN,其他的后面有空再讨论。
GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得到图的嵌入表示(graph embedding),可见用途广泛。因此现在人们脑洞大开,让GCN到各个领域中发光发热。
三、GCN快速入门
假设现在有一个n个节点的图,每个节点都有k个特征,这个图的邻接矩阵用A来表示(A是一个n×n的矩阵),图的特征用H来表示(H是一个n×k的矩阵),那么我们可以定义一个简单的神经网络:
实验证明,即使就这么简单的神经网络层,就已经很强大了。
但是这个简单模型有几个局限性:
- 只使用A的话,由于A的对角线上都是0,所以在和特征矩阵H相乘的时候,只会计算一个node的所有邻居的特征的加权和,该node自己的特征却被忽略了。因此,我们可以做一个小小的改动,给A加上一个单位矩阵
I ,这样就让对角线元素变成1了。 - A是没有经过归一化的矩阵,这样与特征矩阵相乘会改变特征原本的分布,产生一些不可预测的问题。所以我们对A做一个标准化处理。首先让A的每一行加起来为1,我们可以乘以一个D的逆,D就是度矩阵。我们可以进一步把D的拆开与A相乘,得到一个对称且归一化的矩阵。
通过对上面两个局限的改进,我们便得到了最终的层特征传播公式:
其中:
- A ^ = A + I \hat{A}=A+I A^=A+I,I是单位矩阵
- D ^ \hat{D} D^ 是A波浪的度矩阵(degree matrix)
- H ( l ) H^{(l)} H(l)是每一层的特征
- σ是非线性激活函数
在这个公式中, A ^ \hat{A} A^、 D ^ \hat{D} D^是由A计算而来,而A是我们的输入之一。
所以在使用GCN的时候只需要去设计上边公式对应的算法来提取图的特征,而不需要去了解数学原理
为了直观理解,我们用论文中的一幅图:
图中一开始输入一个图,通过若干层GCN每个节点的特征从X变成了Z,但是,无论中间有多少层,节点之间的连接关系,即邻接矩阵A,都是共享的。
至此,我们已经对GCN有了一个大概的了解,根据上边的公式在加上一个损失函数,我们就可以训练出一个GCN模型了。但是如果想了解其内部的数学原理的话,请继续往下读(下边主要是从https://blog.csdn.net/weixin_40013463/article/details/81089223 搬过来的)
四、什么是拉普拉斯矩阵?
4.1 Laplacian 矩阵的定义
图中的每个结点无时无刻不因为邻居和更远的点的影响而在改变着自己的状态直到最终的平衡,关系越亲近的邻居影响越大。
对于图 G = ( V , E ) G=(V,E) G=(V,E),其Laplacian 矩阵的定义为 L = D − A L=D-A L=D−A,其中, L L L是Laplacian 矩阵, D D D是顶点的度矩阵(对角矩阵),对角线上元素依次为各个顶点的度, A A A是图的邻接矩阵。看下边的示例,就能很快知道Laplacian 矩阵的计算方法。
这里要说明的是:常用的拉普拉斯矩阵实际有三种:
L = D − A (1) L=D-A\tag{1} L=D−A(1)
L s y s = D − 1 2 L D − 1 2 (2) L^{sys}=D^{-\tfrac{1}{2}}LD^{-\tfrac{1}{2}}\tag{2} Lsys=D−21LD−21(2)
L r w = D − 1 L (3) L^{rw}=D^{-1}L\tag{3} Lrw=D−1L(3)
- (1)定义的Laplacian 矩阵更专业的名称叫Combinatorial Laplacian
- (2)定义的叫Symmetric normalized Laplacian
- (3)定义的叫Random walk normalized Laplacian
这里我们只需要知道拉普拉斯矩阵的概念即可,而且GCN的论文中应用的是大多数是公式(2)
4.2 为什么是 Laplacian 矩阵
拉普拉斯矩阵矩阵有很多良好的性质:
- 是对称矩阵,可以进行谱分解(特征分解),与GCN的spectral domain对应
- 只在中心节点和一阶相连的顶点这两种位置上有非0元素,其余位置都是0
一阶相连就是通过一条边直接相连,如上图中与顶点1一阶相连的顶点为5和2;
二阶相连就是通过两条边相连,如上图中与顶点1二阶相连的顶点为4(1-5-4) - 可以通过拉普拉斯算子与拉普拉斯矩阵进行类比
4.3 拉普拉斯矩阵L的谱分解(特征分解)
将矩阵L分解为由特征值λ和特征向量u表示的矩阵之积:
(1)求特征值和特征向量:λ为特征值,u为特征向量,则满足下式:
L u = λ u Lu=\lambda u Lu=λu
(2)求特征分解:
令 L是一个n×n 的方阵,且有 n 个线性无关的特征向量 。这样, L可以被分解为:
L = U Λ U − 1 = U ( λ 1 . . . λ n ) U − 1 L=U\Lambda U^{-1}=U \begin{pmatrix} \lambda_1 & &\\ & ... & \\ & & \lambda_n\end{pmatrix} U^{-1}\\ L=UΛU−1=U⎝⎛λ1...λn⎠⎞U−1
其中,U是n×n方阵,且其第i列为L的特征向量ui为: U = ( u 1 → , u 2 → , . . . , u n → ) U=(\overrightarrow{u_1} ,\overrightarrow{u_2} ,... ,\overrightarrow{u_n} ) U=(u1,u2,...,un) , Λ \Lambda Λ是对角矩阵,其对角线上的元素为对应的特征值。
(3)拉普拉斯矩阵:【半正定】【对称】矩阵
性质:
- 有n个线性无关的特征向量
- 特征值非负
- 特征向量相互正交,即Q为正交矩阵
设拉普拉斯矩阵L中, λ i \lambda_i λi为特征值, u i u_i ui为特征向量,U为特征向量 u i u_i ui作为列向量组成的方阵,那么拉普拉斯矩阵的谱分解形式为:
L = U ( λ 1 . . . λ n ) U − 1 L=U \begin{pmatrix} \lambda_1 & &\\ & ... & \\ & & \lambda_n\end{pmatrix} U^{-1}\\ L=U⎝⎛λ1