代码
如果想直接看代码部分,请移步https://github.com/Alienge/Graph-Network.
背景
? ? ? 最近各种顶会上都可以看到
GCN和
GAT,虽然这两篇论文都差不多在18年左右出来的,但是现有论文的网络结构都或多或少的有
GCN和
GAT的影子,那么为什么有这么多人去研究图网络呢?或者换句话说使用图网络能解决什么问题?要回答这个问题很容易,因为图结构更符合我们现实生活中的逻辑关系,那么自然而然的就可以去解决很多问题了。比如,个性化推荐,社交网络,特征工程等。
本文会尽量弱化数学公式的影响。
基础知识
? ? ? 在介绍图网络之前我们需要了解一部分图论的基础知识。图是由若干个结点(Node)及连接两个结点的边(edge)所构成的图形,用于刻画不同结点之间的关系。如图1表示了一张图。
图1 non-Euclidean space
? ? ? 那么可以用两个集合量化该图,这两个集合分别是顶点集合和边的集合,分别用
V和
E表示。按照图论的定义,可以用一个这个二元组来定义这个图。即
G={V,E} 其中
V是顶点的集合,
E是边的集合。
拓展一下把这个用到
GCN或者
GAN中,对于每一个顶点,都有一个特征,所有顶点的特征聚集在一起可以用一个矩阵来表示,假设顶点有
∣V∣=N个,特征的维度为
F? 图中顶点的特征也叫图的embedding 。那么就可以用一个矩阵
h来表示,其维度
size=[N,F]. 而边的关系用矩阵e来表示,其
eij?表示顶点
vi?和顶点
vij?是否有边相连。维度
size=[N,N].
eij?={01?如果vi?与vj?有边相连otherwise?
另外图还有一个度矩阵
D,其维度
size=[N,N],
Dii?表示顶点
vi?的度。
例子 :
? ? ?下面就以
图1作为例来表示特征矩阵
f=h, 边矩阵
A=e和度矩阵
D。由于只是演示作用,不妨设置特征矩阵的维度为
1维。即
f=h=[4,2,4,?3]T
图的拓扑结构 |
度矩阵(D) |
边矩阵(A=e) |
特征矩阵(f=h) |
|
?????2000?0300?0020?0001?????? |
?????0110?1001?1110?0100?????? |
?????424?3?????? |
空域卷积和频域卷积
空域卷积(Spatial Convolution)。从设计理念上看,空域卷积与深度学习中的卷积的应用方式类似,其核心在于聚合邻居结点的信息。比如说,一种最简单的无参卷积方式可以是:将所有直连邻居结点的隐藏状态加和,来更新当前结点的隐藏状态。如图1中顶点
v1?的空域卷积结果为
f(v1?)l+1=4f(v0?)l+f(v1?)l+f(v2?)l+f(v3?)l?(1)其中
f表示是顶点到特征的映射。其中以
GAT为代表。在下面的说明中, 这种卷积时发生在
vertex domain也称
spatial domain。
频域卷积(Spectral Convolution)。相比于空域卷积而言,它主要利用的是图傅里叶变换(Graph Fourier Transform)实现卷积。简单来讲,它利用图的拉普拉斯矩阵(Laplacian matrix)导出其频域上的的拉普拉斯算子,再类比频域上的欧式空间中的卷积,导出图卷积的公式。虽然公式的形式与空域卷积非常相似,但频域卷积的推导过程却有些艰深晦涩。其中以
GCN为代表。在下面的说明中,此类卷积是发生在
spectral domain。
空域卷积相比频域卷积非常直观地借鉴了图像里的卷积操作,频域卷积相比空域卷积更加有理论依据。
GAT
? ? ?在上一节提到的空域卷积的公式
(1)中,计算
l+1层的顶点
v1?的特征时,
l层的顶点
v0?,v1?,v2?,v3?对
l+1层的
v1?的权重是一样的,显然这是不合理的。因此
GAT提出就是解决此问题的一种解决方案。
? ? ?
GraphAttentionNetwork(GAT)提出了用注意力机制对邻近节点特征加权求和。 邻近节点特征的权重完全取决于节点特征,独立于图结构。那么
GAT解决了那些问题呢。
GAT的理论依据
? ? ?现有给定如下已知条件:顶点之间的边矩阵为
A∈RN×N, 第
l层的顶点的特征向量集:
hl=[h1?,h2?,???,hN?]T, 其中
hi?∈RF,
N为图中顶点的个数, 显然可以知道
h∈RN×F。得到下一层
l+1的特征向量势必需要一个权重矩阵,假设下一层的特征向量的维度为
F′, 即
hil+1?∈RF′, 那么需要的权重矩阵
W∈RF×F′。可以得到的
l+1层的特征向量集:
hl+1=[h1′?,h2′?,???,hN′?]T
显然可以知道
hl+1∈RN×F′。
? ? ?有了这些就可以计算注意力了,针对每个节点可以得到对应的注意力系数, 注意力系数为:
eij?=a(WThi?,WThj?)(2)
注意一下
(WThi?,WThj?)是一个
concat操作, 可以知道
(WThi?,WThj?)∈R2F′×1, 而
a∈R1×2F′
? ? ?那么以这种方式就可以计算出所有的注意力系数,作者通过
MaskAttention将这个注意力机制引入图结构中,
MaskAttention的含义是:仅将注意力分配到顶点
i的邻居节点集
j∈Ni? 为了使得注意力系数更容易计算和便于比较,我们引入了
softmax对所有的
i的相邻节点
j∈Ni?进行正则化:
aij?=softmax(eij?)=∑k∈Ni??exp(eik?)exp(eij?)?(3)
更直观一点解释就是行归一化,只不过是特殊的行归一化而已。
? ? ?作者在这里在进行行归一化之前加了一个非线性函数
LeakyRelu。有了
(2),
(3)和非线性关系
LeakRelu,那么我们就可以轻松得到最后的注意力系数:
aij?=softmax(LeakyRelu(eij?))=∑k∈Ni??exp(LeakyRelu(a[Whi?,Whk?]))exp(LeakyRelu(a[Whi?,Whj?]))?(4)
? ? ?注意一下哈,我在参考其他代码的时候发现系数
a在每一次计算
eij的过程中是不变的。
? ? ?那么上面这公式(2), (3)和(4) 时组成GAT的核心部分。最后一步得到最终的
attention就需要把边的矩阵
A结合起来, 即最后的
mask部分。
即
attentionij?={aij?infinite?如果vi?与vj?有直接边相连otherwise?(5)
其中
attention∈RN×N。
? ? ?有了这个最终
l+1层的输出为:
hl+1=σ(attention×hl?W)
最终得到
hl+1∈RN×F′
? ? ?自此,
GAT的理论部分基本全部完成,其最终的目的时训练出注意力系数。以这个目的进行了一系列操作,本质上就是这个。
下面是重新整理公式与代码部分的相关的公式, 如果你不想看,可直接跳过.
? ? ?为了写代码的方便,这里我们把计算
attention的部分用矩阵写出来
? ? ?已知
hl∈RN×F ,
W∈RF×F′, 参数
a∈R1×2F′, 这里可以解释一下
a这里的作用,我们可以把
a分成两部分,一个是自注意力系数,一个是邻居节点的注意力系数,即
a=[aself?,aneibor?]
hl+1=hlW(6)
attentionself?=hl+1aselfT?(7)
attentionneibor?=hl+1aneiborT?(8)
attention=attentionself?+attentionneiborT?(9)
attention=LeakRelu(attention)(10)
attentionij?={attentionij?infinite?如果vi?与vj?有直接边相连otherwise?(11)
attention=softmax(attetion)(12)
hl+1=σ(attention×hl+1)(13)
? ? ?有了公式
(6)?(13), 我们可以很容易的实现
GAT的代码, 具体代码参考GAT的pytorch代码. 这个代码的实现只是我自己参考别人的代码实现,有些地方作了改动。当然也有star很多的代码pytorch星比较多的代码
GCN
? ? ?深度学习中,
CNN中的卷积本质上是一个共享参数的特征提取, 通过计算中心像素点以及相邻像素点的加权和来构成
featuremap, 实现空间特征的提取。但是这种理论只适用于
EuclideanStructure, 对于
Graph这种
NonEuclideanStructure并不是很适用。那么如何将
CNN中的思想引入到
Graph中,成为一个很大的问题。这里为什么要研究GCN的原因,参考的知乎请移步这里。
? ? ?
spectral domain是GCN的理论基础, 主要借助图的
Laplacian matrix的特征值和特征向量来研究图的性质。
GCN的理论依据
? ? ?现有给定如下已知条件:顶点之间的边矩阵为
A∈RN×N,
N为图中顶点的个数, 显然可以知道
h∈RN×F 和和度矩阵
D∈RN×N。
Laplacian matrix定义为
L=D?A(14)
图的拓扑结构 |
度矩阵(D) |
边矩阵(A=e) |
特征矩阵(f=h) |
Laplacian matrix |
|
?????2000?0300?0020?0001?????? |
?????0110?1001?1110?0100?????? |
?????424?3?????? |
?????2?1?10??130?1??1?110?0?101?????? |
? ? ?这里不过多的介绍傅里叶分析里面的东西, 这里只需要记得
Laplacian变换可以将上面的
vertexdomain变换到
spectraldomain, 或者简单的把
Laplacian变换是操作在
Graph中的一个算子即可。这里并不影响你理解
GCN。这里简单说一下
Laplacian matrix的几个好的性质:
-
Laplacian matrix是一个对称矩阵, 那么就可以进行特征分解, 也就是谱分解
-
Laplacian matrix是一个半正定的矩阵,也就是其特征值
λi?≥0
知道了这些,就可以对这些就可以对
L进行特征分解,在线性代数中,有
L=UΛUT(15) 其中
Λ=??????λ1?0?0?0λ2??0??????00?λN????????
U=[u1?,u2?,…,uN?]∈RN×N 。
那么这个
U就是一组标准的正交基向量, 显然有
UUT=I(16)
这组标准正交基可以将
Vertex domain 转化到
Spectral doamin中。现假设输入的矩阵为
x∈RN×F, 那么转化到
Spectral doamin中变成:
x^=UTx(17)
所有的特征都转化到
Spectral doamin中了,那么自然而然的联想到是否有有在
Vertex domain中的普通神经网络中的
y=Wx
答案是肯定的,但是这个和在
Spectral doamin中有稍稍的不同, 我们以图1中的顶点的例子进行简单的解释, 应该是怎么样的一种
W的形式。
在图2中,输入特征矩阵
f=x, 把
x^用一个图3表示出来,简单的想象成是一块波形的3维侧面,就是这个样子.或者想象一下从
λ轴向原点看, 你将会看到一串波形. 就像图2一样。
图2 在不同空间的图解
图3 x在spectral domain上的显示(f=x)
解释一下这个是什么意思,
[λ1?,λ2?,λ3?,λ4?]是在
spectral domain的频率大小。而
[u1?f,u2?f,u3?f,u4?f]是每个频率上的数值大小。说白了就是
f在基向量
u1上的投影大小。现在只需要在每个频率上加一个参数就可以实现
CNN上的
y=wx了。即
图4 参数
那么就有
?????y^?1?y^?2?y^?3?y^?4???????=?????θ1?000?0θ2?00?00θ3?0?000θ4????????????x^1?x^2?x^3?x^4???????
显然这个参数与
Λ和
θ有关,不妨将其记录为
gθ?(Λ)。那么就有关系:
y^?=gθ?(Λ)x^(18)
由公式(17)可知,(18)式可以变成
y^?=gθ?(Λ)UTx(19)
现在只需要把
y^?反傅里叶变化成
Vertex domain中就可以。即
y^?=UTy=gθ?(Λ)UTx(20)
根据正交矩阵的性质, 也即公式(16), 就可以得到
y=Ugθ?(Λ)UTx(21)
又因为
gθ?(Λ)是关于
Λ的函数, 就可以变成
y=gθ?(L)x(22)
然而公式(22)是所有一切以
GCN罪恶的开始, 其他的所有都只是在做怎么估计这个
gθ?(L)。
广受欢迎的
GCN是以
chebyshev polynomial为基础进行估计
gθ?(L),
chebyshev polynomial为:
T0?(Λ
其中要满足两个关系式
Λ=λmax?2Λ??I,
Λ∈[?1,1]。
有了上面的
chebyshev polynomial递推关系式(23),不妨设:
gθ?(Λ)=k=0∑n?θk?Λk
在
chebyshev polynomial中,取值
n=1,λmax?=2,公式(22)就可以变成:
y=θ0?x+θ1?(L?I)x(24)
取
L=I?D2?1?AD21?,这一步在原论文中成为正则化的结果.另外为了防止参数过多,令
θ=θ0?=?θ1?,那么式(24)可以变成
y=θ(I+D2?1?AD21?)x(25).
又令
I+D2?1?AD21?=I+D2?1?AD21?,最终的形式变成了
y=θ(D2?1?AD21?)x(26).
式(26)再加上一个非线性变化也就是
GCN的最终形式
y=σ(θ(D2?1?AD21?)x)(26).
代码部分也是参考式(26)的矩阵变形形式所写
y=σ((D2?1?AD21?)xθ)(27).
有了公式
(27), 我们可以很容易的实现
GCN的代码, 具体代码参考GCN的pytorch代码. 这个代码的实现只是我自己参考别人的代码实现,有些地方作了改动。当然也有star很多的代码星比较多的代码
结语
至此,GAT和GCN都基本讲完了, 在这个过程也学了很多东西,才怪.
参考文献
[1] https://arxiv.org/abs/1710.10903.
[2] https://blog.csdn.net/weixin_36474809/article/details/89401552.
[3]http://webia.lip6.fr/~durandt/pdfs/2017_CVPR/Durand_WILDCAT_CVPR_2017.pdf.
[4] https://www.zhihu.com/question/54504471?sort=created.
[5]https://www.bilibili.com/video/BV1G54y1971Sfrom=search&seid=3673449636835487631.
[6] https://blog.csdn.net/weixin_40013463/article/details/81089223.
[7] https://www.cnblogs.com/SivilTaram/p/graph_neural_network_1.html.