图卷积神经网络(GCN)综述与实现(PyTorch版)
Posted Torture_L
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图卷积神经网络(GCN)综述与实现(PyTorch版)相关的知识,希望对你有一定的参考价值。
图卷积神经网络(GCN)综述与实现(PyTorch版)
本文的实验环境为PyTorch = 1.11.0 + cu113,PyG = 2.0.4
,相关依赖库和数据集的下载请见链接。
一、图卷积神经网络介绍
1.1 传统图像卷积
卷积神经网络中的卷积(Convolution)指的是在图像上进行的输入和卷积核之间离散内积运算,其本质上就是利用共享参数的滤波器,通过计算中心值以及相邻节点的值进行加权获得带有局部空间特征的特征提取器。
其具有三个重要的特征,分别为:
- 稀疏连接
- 相较于全连接层,卷积层输入和输出间的连接是稀疏的,能够大大减少参数的数量,加快网络的训练速度。
- 参数共享
- 卷积核的权重参数可以被多个函数或操作共享,这样只需要训练一个参数集,而不需要对每个位置都训练一个参数集。此外,由于卷积核的大小一般是小于输入大小,也能起到减少参数数量的作用
- 等变表示
- 事实上,每个卷积层可以通过多个卷积核来进行特征提取,并且在卷积运算后,卷积神经网络对输入的图像具有平移不变性(有严格的数学论证)
- 事实上,每个卷积层可以通过多个卷积核来进行特征提取,并且在卷积运算后,卷积神经网络对输入的图像具有平移不变性(有严格的数学论证)
一般在卷积层后,会通过一个池化层进行降维,进一步降低网络的复杂度和非线性程度。在那之后,可以将通过卷积池化层后的特征输入全连接层或反卷积层进行进一步的分类、分割、重建工作。当然,传统的卷积操作一般适用于结构化数据。
1.2 图结构
图作为一种典型的非结构化非线性数据(非欧几里得数据),其可以表示一对一、一对多、多对多的关系,因而常被用于描述复杂的数据对象,譬如社交网络、知识图谱、城市路网、3D点云等。与结构化数据不同,图的局部输入维度可变,即每个节点的邻居节点数量不同;图具有无序性,即节点间并不存在先后关系,仅存在连接关系(点云是置换不变性,在无序性的基础上,交换两点或多点不会影响整体结果)。由于图结构的特殊性,传统CNN和RNN对其的表征能力并不理想。
对于图结构,我们可以将其抽象表示为:
G
=
(
V
,
E
)
G=(V,E)
G=(V,E)
在这里
V
V
V表示图中节点的集合,而
E
E
E为边的集合。对于图特征,我们一般有三个重要矩阵进行表示。
- 邻接矩阵
A
A
A:
adjacency matrix
用来表示节点间的连接关系。
∣
0
1
0
0
0
0
1
0
1
1
0
0
0
1
1
0
∣
\\beginvmatrix &0 & 1 & 0 & 0&\\\\ &0 & 0 & 1 & 0&\\\\ &1 & 1 & 0 & 0&\\\\ &0 & 1 & 1 & 0&\\\\ \\endvmatrix
∣
∣0010101101010000∣
∣
对于带权的图,邻接矩阵将把1替换为对应的权重
-
度矩阵 D D D:
degree matrix
用来表示节点的连接数,可以表征某个节点在图中的重要程度,是一个对角矩阵,例如针对上图的入度矩阵:
∣ 1 0 0 0 0 3 0 0 0 0 2 0 0 0 0 0 ∣ \\beginvmatrix &1 & 0 & 0 & 0&\\\\ &0 & 3 & 0 & 0&\\\\ &0 & 0 & 2 & 0&\\\\ &0 & 0 & 0 & 0&\\\\ \\endvmatrix ∣ ∣1000030000200000∣ ∣ -
特征矩阵 X X X:
feature matrix
用来表示节点的特征
1.3 图卷积神经网络
目前主流的图卷积基本上可以分为两类,一种是基于谱的图卷积,一种是基于空域的图卷积。
基于谱的图卷积通过傅里叶变换(FFT干的一件事情就是连接空域和频域)将节点映射到频域空间,通过频域空间上的卷积来实现时域上的卷积,最后将特征映射回空域。而基于空域的图卷积则是直接基于节点与邻居进行卷积提取特征,没有做域上的变换。
图卷积算子可表示为:
h
i
l
+
1
=
σ
(
∑
j
∈
N
i
1
C
i
j
h
j
l
w
R
j
l
)
h_i^l+1=\\sigma(\\sum_j\\in N_i\\frac1C_ijh_j^lw_R_j^l)
hil+1=σ(j∈Ni∑Cij1hjlwRjl)
其中,设中心结点为
i
i
i;
h
i
l
h_i^l
hil为结点
i
i
i在
l
l
l层的特征表达;
σ
\\sigma
σ是非线性激活函数;
C
i
j
C_ij
Cij则是归一化因子,譬如结点度的倒数、反距离权重、高斯衰减权重等;
N
i
N_i
Ni是结点
i
i
i的邻接节点(包括自身);
R
i
R_i
Ri表示节点
i
i
i的类型;
W
R
j
W_R_j
WRj表示
R
j
R_j
Rj类型的节点变换权重参数。
下面围绕Semi-supervised Classification with Graph Convolutional Networks一文中提出的GCN结构进行分析。
该篇文章由阿姆斯特丹(the University of Amsterdam)大学机器学习专业的Thomas Kipf 博士于2016年提出,并于2017年被深度学习的顶会ICLR(International Conference on Learning Representations)接收!这位大佬的研究方向是学习结构化数据和结构化表示/计算,包括推理、(多智能体)强化学习和结构化深度生成模型。
核心思想
该篇文章提出了一种新的网络结构,用于处理非结构化的图数据,并解决了在一个图中,只有少部分节点的标签是已知情况下的节点分类问题(半监督学习)。
对于带有特征的图结构,例如下图中的
n
×
3
n\\times3
n×3网络结构,有部分是带有标识的,而有部分则是无标识的。
GCN通过考虑节点本身以及邻居节点的特征信息来提取潜在的关系。比如我们在中心节点拼接了邻居的特征后,使用平均池化的方式对这些特征进行聚合,再通过浅层网络进行学习训练得到新的数据。
每个GCN层做的事情:
- 获取当前节点和邻接节点特征
- 通过聚合函数获取局部特征(带有拓扑关系)
- 浅层学习训练,获取高维特征
数学推导
对于一个如上图所示的无向图,我们要怎么样才能获取到某个节点以及其邻居节点的特征呢?一种非常直观的想法💡是,在当前节点的特征之后,根据权重拼接与之相邻节点的特征。此时,空域上的距离往往成为了权重的影响因素。
那么,邻接表就成了我们考虑节点间拓扑关系最重要的结构。我们写成
A
×
X
×
W
A\\times X\\times W
A×X×W,
A
A
A是邻接矩阵,
X
X
X是特征矩阵,
W
W
W是权重。右乘相当于控制行,左乘相当于控制列,
A
A
A左乘
X
X
X,相当于在对应节点处,使用哪些节点特征构建新的特征:
∣
0
1
0
0
0
0
1
1
0
1
0
1
1
1
0
0
∣
×
∣
1
1
1
1
2
2
2
2
3
3
3
3
40
40
40
40
∣
=
∣
2
2
2
2
43
43
43
43
42
42
42
42
3
3
3
3
∣
\\beginvmatrix &0 & 1 & 0&0&\\\\ &0 & 0 & 1&1&\\\\ &0 & 1 & 0&1&\\\\ &1 & 1 & 0&0&\\\\ \\endvmatrix\\times \\beginvmatrix &1 & 1 & 1&1&\\\\ &2 & 2 & 2&2&\\\\ &3 & 3 & 3&3&\\\\ &40 & 40 & 40&40&\\\\ \\endvmatrix= \\beginvmatrix &2 & 2 & 2&2&\\\\ &43 & 43 & 43&43&\\\\ &42 & 42 & 42&42&\\\\ &3 & 3 & 3&3&\\\\ \\endvmatrix
∣
∣000110110100011深度学习100例 | 第52天-图卷积神经网络(GCN):实现论文分类
以上是关于图卷积神经网络(GCN)综述与实现(PyTorch版)的主要内容,如果未能解决你的问题,请参考以下文章