GCN图卷积网络入门详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCN图卷积网络入门详解相关的知识,希望对你有一定的参考价值。

参考技术A

在这篇文章中,我们将仔细研究一个名为GCN的著名图神经网络。首先,我们先直观的了解一下它的工作原理,然后再深入了解它背后的数学原理。

字幕组双语原文: 【GCN】图卷积网络(GCN)入门详解
英语原文: Graph Convolutional Networks (GCN)
翻译: 听风1996 、 大表哥

许多问题的本质上都是图。在我们的世界里,我们看到很多数据都是图,比如分子、社交网络、论文引用网络。

图的例子。(图片来自[1])

在图中,我们有节点特征(代表节点的数据)和图的结构(表示节点如何连接)。

对于节点来说,我们可以很容易地得到每个节点的数据。但是当涉及到图的结构时,要从中提取有用的信息就不是一件容易的事情了。例如,如果2个节点彼此距离很近,我们是否应该将它们与其他对节点区别对待呢?高低度节点又该如何处理呢?其实,对于每一项具体的工作,仅仅是特征工程,即把图结构转换为我们的特征,就会消耗大量的时间和精力。

图上的特征工程。(图片来自[1])

如果能以某种方式同时得到图的节点特征和结构信息作为输入,让机器自己去判断哪些信息是有用的,那就更好了。

这也是为什么我们需要图表示学习的原因。

我们希望图能够自己学习 "特征工程"。(图片来自[1])

论文 :基于图神经网络的半监督分类 (2017)[3]

GCN是一种卷积神经网络,它可以直接在图上工作,并利用图的结构信息。

它解决的是对图(如引文网络)中的节点(如文档)进行分类的问题,其中仅有一小部分节点有标签(半监督学习)。

在Graphs上进行半监督学习的例子。有些节点没有标签(未知节点)。

就像"卷积"这个名字所指代的那样,这个想法来自于图像,之后引进到图(Graphs)中。然而,当图像有固定的结构时,图(Graphs)就复杂得多。

从图像到图形的卷积思想。 (图片来自[1])

GCN的基本思路:对于每个节点,我们从它的所有邻居节点处获取其特征信息,当然也包括它自身的特征。假设我们使用average()函数。我们将对所有的节点进行同样的操作。最后,我们将这些计算得到的平均值输入到神经网络中。

在下图中,我们有一个引文网络的简单实例。其中每个节点代表一篇研究论文,同时边代表的是引文。我们在这里有一个预处理步骤。在这里我们不使用原始论文作为特征,而是将论文转换成向量(通过使用NLP嵌入,例如tf-idf)。NLP嵌入,例如TF-IDF)。

让我们考虑下绿色节点。首先,我们得到它的所有邻居的特征值,包括自身节点,接着取平均值。最后通过神经网络返回一个结果向量并将此作为最终结果。

GCN的主要思想。我们以绿色节点为例。首先,我们取其所有邻居节点的平均值,包括自身节点。然后,将平均值通过神经网络。请注意,在GCN中,我们仅仅使用一个全连接层。在这个例子中,我们得到2维向量作为输出(全连接层的2个节点)。

在实际操作中,我们可以使用比average函数更复杂的聚合函数。我们还可以将更多的层叠加在一起,以获得更深的GCN。其中每一层的输出会被视为下一层的输入。

2层GCN的例子:第一层的输出是第二层的输入。同样,注意GCN中的神经网络仅仅是一个全连接层(图片来自[2])。

让我们认真从数学角度看看它到底是如何起作用的。

首先,我们需要一些注解

我们考虑图G,如下图所示。

从图G中,我们有一个邻接矩阵A和一个度矩阵D。同时我们也有特征矩阵X。

那么我们怎样才能从邻居节点处得到每一个节点的特征值呢?解决方法就在于A和X的相乘。

看看邻接矩阵的第一行,我们看到节点A与节点E之间有连接,得到的矩阵第一行就是与A相连接的E节点的特征向量(如下图)。同理,得到的矩阵的第二行是D和E的特征向量之和,通过这个方法,我们可以得到所有邻居节点的向量之和。

计算 "和向量矩阵 "AX的第一行。

在问题(1)中,我们可以通过在A中增加一个单位矩阵I来解决,得到一个新的邻接矩阵Ã。

取lambda=1(使得节点本身的特征和邻居一样重要),我们就有Ã=A+I,注意,我们可以把lambda当做一个可训练的参数,但现在只要把lambda赋值为1就可以了,即使在论文中,lambda也只是简单的赋值为1。

通过给每个节点增加一个自循环,我们得到新的邻接矩阵

对于问题(2): 对于矩阵缩放,我们通常将矩阵乘以对角线矩阵。在当前的情况下,我们要取聚合特征的平均值,或者从数学角度上说,要根据节点度数对聚合向量矩阵ÃX进行缩放。直觉告诉我们这里用来缩放的对角矩阵是和度矩阵D̃有关的东西(为什么是D̃,而不是D?因为我们考虑的是新邻接矩阵Ã 的度矩阵D̃,而不再是A了)。

现在的问题变成了我们要如何对和向量进行缩放/归一化?换句话说:

我们如何将邻居的信息传递给特定节点?我们从我们的老朋友average开始。在这种情况下,D̃的逆矩阵(即,D̃^-1)就会用起作用。基本上,D̃的逆矩阵中的每个元素都是对角矩阵D中相应项的倒数。

例如,节点A的度数为2,所以我们将节点A的聚合向量乘以1/2,而节点E的度数为5,我们应该将E的聚合向量乘以1/5,以此类推。

因此,通过D̃取反和X的乘法,我们可以取所有邻居节点的特征向量(包括自身节点)的平均值。

到目前为止一切都很好。但是你可能会问加权平均()怎么样?直觉上,如果我们对高低度的节点区别对待,应该会更好。

但我们只是按行缩放,但忽略了对应的列(虚线框)。

为列增加一个新的缩放器。

新的缩放方法给我们提供了 "加权 "的平均值。我们在这里做的是给低度的节点加更多的权重,以减少高度节点的影响。这个加权平均的想法是,我们假设低度节点会对邻居节点产生更大的影响,而高度节点则会产生较低的影响,因为它们的影响力分散在太多的邻居节点上。

在节点B处聚合邻接节点特征时,我们为节点B本身分配最大的权重(度数为3),为节点E分配最小的权重(度数为5)。

因为我们归一化了两次,所以将"-1 "改为"-1/2"

例如,我们有一个多分类问题,有10个类,F 被设置为10。在第2层有了10个维度的向量后,我们将这些向量通过一个softmax函数进行预测。

Loss函数的计算方法很简单,就是通过对所有有标签的例子的交叉熵误差来计算,其中Y_l是有标签的节点的集合。

层数是指节点特征能够传输的最远距离。例如,在1层的GCN中,每个节点只能从其邻居那里获得信息。每个节点收集信息的过程是独立进行的,对所有节点来说都是在同一时间进行的。

当在第一层的基础上再叠加一层时,我们重复收集信息的过程,但这一次,邻居节点已经有了自己的邻居的信息(来自上一步)。这使得层数成为每个节点可以走的最大跳步。所以,这取决于我们认为一个节点应该从网络中获取多远的信息,我们可以为#layers设置一个合适的数字。但同样,在图中,通常我们不希望走得太远。设置为6-7跳,我们就几乎可以得到整个图,但是这就使得聚合的意义不大。

例: 收集目标节点 i 的两层信息的过程

在论文中,作者还分别对浅层和深层的GCN进行了一些实验。在下图中,我们可以看到,使用2层或3层的模型可以得到最好的结果。此外,对于深层的GCN(超过7层),反而往往得到不好的性能(虚线蓝色)。一种解决方案是借助隐藏层之间的残余连接(紫色线)。

不同层数#的性能。图片来自论文[3]

论文作者的说明

该框架目前仅限于无向图(加权或不加权)。但是,可以通过将原始有向图表示为一个无向的两端图,并增加代表原始图中边的节点,来处理有向边和边特征。

对于GCN,我们似乎可以同时利用节点特征和图的结构。然而,如果图中的边有不同的类型呢?我们是否应该对每种关系进行不同的处理?在这种情况下如何聚合邻居节点?最近有哪些先进的方法?

在图专题的下一篇文章中,我们将研究一些更复杂的方法。

如何处理边的不同关系(兄弟、朋友、......)?

[1] Excellent slides on Graph Representation Learning by Jure Leskovec (Stanford): https://drive.google.com/file/d/1By3udbOt10moIcSEgUQ0TR9twQX9Aq0G/view?usp=sharing

[2] Video Graph Convolutional Networks (GCNs) made simple: https://www.youtube.com/watch?v=2KRAOZIULzw

[3] Paper Semi-supervised Classification with Graph Convolutional Networks (2017): https://arxiv.org/pdf/1609.02907.pdf

[4] GCN source code: https://github.com/tkipf/gcn

[5] Demo with StellarGraph library: https://stellargraph.readthedocs.io/en/stable/demos/node-classification/gcn-node-classification.html

雷锋字幕组是一个由AI爱好者组成的翻译团队,汇聚五五多位志愿者的力量,分享最新的海外AI资讯,交流关于人工智能技术领域的行业转变与技术创新的见解。

团队成员有大数据专家,算法工程师,图像处理工程师,产品经理,产品运营,IT咨询人,在校师生;志愿者们来自IBM,AVL,Adobe,阿里,百度等知名企业,北大,清华,港大,中科院,南卡罗莱纳大学,早稻田大学等海内外高校研究所。

如果,你也是位热爱分享的AI爱好者。欢迎与雷锋字幕组一起,学习新知,分享成长。

GCN图卷积网络初探——基于图(Graph)的傅里叶变换和卷积

【GCN】图卷积网络初探——基于图(Graph)的傅里叶变换和卷积

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41727666/article/details/84622965

一、CNN(卷积神经网络)中的离散卷积

推荐阅读:如何通俗易懂地解释卷积?

1、CNN中的离散卷积:共享参数的过滤器

2、CNN中的卷积操作:通过计算中心像素点以及相邻像素点的【加权和】构成【feature map】;
加权系数=卷积核的权重系数

【实例】下式是一个隐藏神经元的输出计算公式,b为偏置,w为5×5的权重向量,a为上一层的激活值,σ()为激活函数。
可以看出,将上一层的5×5=25的神经元(a)加权(w)求和
技术图片

3、CNN中的卷积目的:空间特征的提取

4、确定卷积核的系数:随机化初值,训练中根据误差函数loss,通过反向传播+梯度下降进行迭代优化。

二、GCN基本概念介绍

(一)图Graph

定义:顶点和边建立的关系拓扑图

(二)研究GCN的原因

1、CNN的【平移不变性】在【非矩阵结构】数据上不适用

2、希望在【拓扑图】上提取空间特征来进行机器学习

3、GCN主要工作:引入可以优化的【卷积参数】

(三)提取【拓扑图】空间特征的两种方式

1、vertex domain(spatial domain):顶点域(空间域)

操作:把每个顶点相邻的neighbors找出来

缺点:每个顶点的neighbors不同,计算处理必须针对每个节点

2、spectral domain:谱域

过程:

(1)定义graph上的Fourier Transformation傅里叶变换

(利用Spectral graph theory,借助图的拉普拉斯矩阵的特征值和特征向量研究图的性质)

(2)定义graph上的convolution卷积

三、图的拉普拉斯矩阵

(一)定义:拉普拉斯矩阵L

L=DAL=D-AL=DA
其中,L为Laplacian矩阵;
      D是顶点的度矩阵(对角矩阵),对角线上的元素依次为各个顶点的度(与该顶点相连的边的条数);
      A是图的邻接矩阵。

计算方法实例:
技术图片

(二)拉普拉斯矩阵L的良好性质

1、是对称矩阵,可以进行谱分解(特征分解),与GCN的spectral domain对应

2、只在【中心节点】和【一阶相连的顶点】这两种位置上有非0元素,其余位置都是0
注:一阶相连就是通过一条边直接相连,如上图中与顶点1一阶相连的顶点为5和2;
二阶相连就是通过两条边相连,如上图中与顶点1二阶相连的顶点为4(1-5-4)、2(1-5-2)、5(1-2-5)、3(1-2-3)

3、可以通过拉普拉斯算子与拉普拉斯矩阵进行类比

(三)拉普拉斯矩阵L的谱分解(特征分解)

1、矩阵L的特征分解定义:将矩阵L分解为由特征值λ和特征向量u表示的矩阵之积

(1)求特征值和特征向量:λ为特征值,u为特征向量,则满足下式:
Lu=λuLu=\lambda uLu=λu

(2)求特征分解:

令 L是一个 N×N 的方阵,且有 N 个线性无关的特征向量 。
这样, L可以被分解为:
L=UΛU1=U???λ1...λ3???U1L=U\Lambda U^-1 =U\beginpmatrix\lambda_1& & \\ &...& \\ & & \lambda_3 \endpmatrix U^-1L=UΛU1=U???λ1??...?λ3?????U1
其中,U是N×N方阵,且其第i列为L的特征向量ui,ui为列向量;
U=(u1,u2,...,un)U=(\vecu_1,\vecu_2,...,\vecu_n)U=(u1??,u2??,...,un??)
      Λ是对角矩阵,其对角线上的元素为对应的特征值。

2、拉普拉斯矩阵:【半正定】【对称】矩阵
性质:
(1)有n个线性无关的特征向量
(2)特征值非负
(3)特征向量相互正交,即Q为正交矩阵
设拉普拉斯矩阵L中,λi为特征值,ui为特征向量,U为特征向量ui作为列向量组成的方阵,那么拉普拉斯矩阵的谱分解形式为:
技术图片

四、Graph上的傅里叶变换与卷积

(一)核心工作

把拉普拉斯算子的【特征函数】
变为
Graph对应的拉普拉斯矩阵的【特征向量】

(二)Graph上的傅里叶变换

1、传统傅里叶变换:
技术图片
技术图片

2、Graph上的傅里叶变换

  • 拉普拉斯矩阵=离散拉普拉斯算子
  • 拉普拉斯矩阵的【特征向量U】=拉普拉斯算子的【特征函数exp(-iwt)】

仿照上面传统傅里叶定义,得到Graph上的傅里叶变换:

  • i为第i个顶点
  • λl为第l个特征值;ul为第l个特征向量
  • f为待变换函数,f尖为其对应的傅里叶变换,f和f尖与顶点i一一对应
    技术图片
    技术图片

3、Graph上的傅里叶逆变换:
技术图片

(三)Graph上的卷积

1、传统卷积定理:

  • f为待卷积函数,h为卷积核(根据需要设计)
  • f*h为卷积结果
    技术图片

2、Graph上的卷积:仿照上面定义

  • f为待卷积函数,h为卷积核(根据需要设计)
  • f*h为卷积结果
    技术图片
    技术图片

3、由式(1)可以看出,U为特征向量,f为待卷积函数,重点在于设计含有【可训练】【共享参数】的【卷积核h】
diag(hˆ(λl))卷积参数就是diag(\hath(\lambda_l))diag(h^(λl?))

五、深度学习中的GCN

1、第一代GCN:

  • 卷积核:
    diag(hˆ(λl))diag(θl)diag(\hath(\lambda_l)): diag(\theta_l)diag(h^(λl?))diag(θl?)

  • output公式:
    技术图片
    技术图片

  • 缺点:有n个参数θn,计算量大

2、第二代GCN:

  • 卷积核:
    hˆ(λl)Kj=0αjλjl\hath(\lambda_l):\sum_j=0^K \alpha_j\lambda_l^jh^(λl?)j=0K?αj?λlj?
  • output公式:
    技术图片

注意到下式:
技术图片
进而可以导出下式:
技术图片
技术图片

  • 经过矩阵变换,简化后的output公式:
    技术图片
    技术图片

3、实例

  • K=1时,对于顶点i,将顶点i以及顶点i的一阶相连顶点(j,k,m,n)的feature值(f函数值)做加权求和,权重就是参数αj,最终输出新的feature值(g函数),为提取得到的空间特征
  • K=2时,对于顶点i,将顶点i以及顶点i的一阶相连顶点、二阶相连顶点的feature值加权求和,输出新的feature值
    技术图片

以上是关于GCN图卷积网络入门详解的主要内容,如果未能解决你的问题,请参考以下文章

GCN图卷积网络初探——基于图(Graph)的傅里叶变换和卷积

图卷积网络GCN

图卷积网络GCN

图卷积网络GCN

图卷积网络GCN

GCN:基于非局部图卷积神经网络的高光谱图像分类 | TGRS 2020