GAT(Graph ATtention network)和GCN(Graph Convoluution Network)理论

代码

如果想直接看代码部分,请移步https://github.com/Alienge/Graph-Network.

背景

? ? ? 最近各种顶会上都可以看到

GCNGCN

GCN和

GATGAT

GAT,虽然这两篇论文都差不多在18年左右出来的,但是现有论文的网络结构都或多或少的有

GCNGCN

GCN和

GATGAT

GAT的影子,那么为什么有这么多人去研究图网络呢?或者换句话说使用图网络能解决什么问题?要回答这个问题很容易,因为图结构更符合我们现实生活中的逻辑关系,那么自然而然的就可以去解决很多问题了。比如,个性化推荐,社交网络,特征工程等。

本文会尽量弱化数学公式的影响。

基础知识

? ? ? 在介绍图网络之前我们需要了解一部分图论的基础知识。图是由若干个结点(Node)及连接两个结点的边(edge)所构成的图形,用于刻画不同结点之间的关系。如图1表示了一张图。




图1 non-Euclidean space

? ? ? 那么可以用两个集合量化该图,这两个集合分别是顶点集合和边的集合,分别用

VV

V和

EE

E表示。按照图论的定义,可以用一个这个二元组来定义这个图。即

G={V,E}G=\{V,E\}

G={V,E} 其中

VV

V是顶点的集合,

EE

E是边的集合。

拓展一下把这个用到

GCNGCN

GCN或者

GANGAN

GAN中,对于每一个顶点,都有一个特征,所有顶点的特征聚集在一起可以用一个矩阵来表示,假设顶点有

V=N|V| = N

∣V∣=N个,特征的维度为

FF_{}

F? 图中顶点的特征也叫图的embedding 。那么就可以用一个矩阵

hh

h来表示,其维度

size=[N,F]size=[N, F]

size=[N,F]. 而边的关系用矩阵e来表示,其

eije_{ij}

eij?表示顶点

viv_{i}

vi?和顶点

vijv_{ij}

vij?是否有边相连。维度

size=[N,N]size=[N, N]

size=[N,N].

eij={0如果vivj有边相连1otherwisee_{ij}=
\begin{cases}
0& \text{如果$v_{i}$与$v_{j}$有边相连}\\
1& \text{$otherwise$}
\end{cases}

eij?={01?如果vi?与vj?有边相连otherwise?
另外图还有一个度矩阵

DD

D,其维度

size=[N,N]size=[N, N]

size=[N,N],

DiiD_{ii}

Dii?表示顶点

viv_{i}

vi?的度。

例子 :

? ? ?下面就以

1图1

图1作为例来表示特征矩阵

f=hf = h

f=h, 边矩阵

A=eA = e

A=e和度矩阵

DD

D。由于只是演示作用,不妨设置特征矩阵的维度为

11

1维。即

f=h=[4,2,4,?3]Tf = h = [4, 2, 4, -3]^{T}

f=h=[4,2,4,?3]T

图的拓扑结构 度矩阵(D) 边矩阵(A=e) 特征矩阵(f=h)
在这里插入图片描述 [2000030000200001]\left[ \begin{matrix} 2& 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 &1 \end{matrix} \right]

?????2000?0300?0020?0001??????

[0110101110100100]\left[ \begin{matrix} 0& 1 & 1 & 0 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 &0 \end{matrix} \right]

?????0110?1001?1110?0100??????

[424?3]\left[ \begin{matrix} 4 \\ 2 \\ 4 \\-3 \end{matrix} \right]

?????424?3??????

空域卷积和频域卷积

空域卷积(Spatial Convolution)。从设计理念上看,空域卷积与深度学习中的卷积的应用方式类似,其核心在于聚合邻居结点的信息。比如说,一种最简单的无参卷积方式可以是:将所有直连邻居结点的隐藏状态加和,来更新当前结点的隐藏状态。如图1中顶点

v1v_{1}

v1?的空域卷积结果为

f(v1)l+1=f(v0)l+f(v1)l+f(v2)l+f(v3)l4(1)f(v_{1})^{l+1} = \frac{f(v_{0}) ^{l}+ f(v_{1}) ^{l}+f(v_{2})^{l}+f(v_{3})^{l}}{4} \tag{1}

f(v1?)l+1=4f(v0?)l+f(v1?)l+f(v2?)l+f(v3?)l?(1)其中

ff

f表示是顶点到特征的映射。其中以

GATGAT

GAT为代表。在下面的说明中, 这种卷积时发生在

vertex domainvertex\space domain

vertex domain也称

spatial domainspatial \space domain

spatial domain。

频域卷积(Spectral Convolution)。相比于空域卷积而言,它主要利用的是图傅里叶变换(Graph Fourier Transform)实现卷积。简单来讲,它利用图的拉普拉斯矩阵(Laplacian matrix)导出其频域上的的拉普拉斯算子,再类比频域上的欧式空间中的卷积,导出图卷积的公式。虽然公式的形式与空域卷积非常相似,但频域卷积的推导过程却有些艰深晦涩。其中以

GCNGCN

GCN为代表。在下面的说明中,此类卷积是发生在

spectral domainspectral \space domain

spectral domain。

空域卷积相比频域卷积非常直观地借鉴了图像里的卷积操作,频域卷积相比空域卷积更加有理论依据。

GAT

? ? ?在上一节提到的空域卷积的公式

(1)(1)

(1)中,计算

l+1l+1

l+1层的顶点

v1v_{1}

v1?的特征时,

ll

l层的顶点

v0,v1,v2,v3v_{0},v_{1},v_{2},v_{3}

v0?,v1?,v2?,v3?对

l+1l+1

l+1层的

v1v_{1}

v1?的权重是一样的,显然这是不合理的。因此

GATGAT

GAT提出就是解决此问题的一种解决方案。
? ? ?

GraphAttentionNetwork(GAT)GraphAttentionNetwork(GAT)

GraphAttentionNetwork(GAT)提出了用注意力机制对邻近节点特征加权求和。 邻近节点特征的权重完全取决于节点特征,独立于图结构。那么

GATGAT

GAT解决了那些问题呢。

  • GATGAT

    GAT中,图中每个顶点可以根据邻接的顶点确定特征,不由我们指定,权重设置成参数,最终结果由梯度下降得到,免去了人工指定的麻烦。

  • GATGAT

    GAT的设置,只与相邻节点有关,无需得到整张图的信息。

GAT的理论依据

? ? ?现有给定如下已知条件:顶点之间的边矩阵为

ARN×NA \in R^{N \times N}

A∈RN×N, 第

ll

l层的顶点的特征向量集:

hl=[h1,h2,???,hN]Th^{l} = [h_{1}, h_{2},\cdot\cdot\cdot,h_{N} ]^{T}

hl=[h1?,h2?,???,hN?]T, 其中

hiRFh_{i} \in R^{F}

hi?∈RF,

NN

N为图中顶点的个数, 显然可以知道

hRN×Fh \in R^{N \times F}

h∈RN×F。得到下一层

l+1l+1

l+1的特征向量势必需要一个权重矩阵,假设下一层的特征向量的维度为

FF'

F′, 即

hil+1RFh_{i}^{l+1} \in R^{F'}

hil+1?∈RF′, 那么需要的权重矩阵

WRF×FW \in R^{F \times F'}

W∈RF×F′。可以得到的

l+1l+1

l+1层的特征向量集:

hl+1=[h1,h2,???,hN]T h^{l+1} = [h_{1}^{'}, h_{2}^{'},\cdot\cdot\cdot,h_{N}^{'} ]^{T}

hl+1=[h1′?,h2′?,???,hN′?]T
显然可以知道

hl+1RN×Fh^{l+1} \in R^{N \times F'}

hl+1∈RN×F′。
? ? ?有了这些就可以计算注意力了,针对每个节点可以得到对应的注意力系数, 注意力系数为:

eij=a(WThi,WThj)(2) e_{ij} = a(W^{T}h_{i},W^{T}h_{j}) \tag{2}

eij?=a(WThi?,WThj?)(2)
注意一下

(WThi,WThj)(W^{T}h_{i},W^{T}h_{j})

(WThi?,WThj?)是一个

concatconcat

concat操作, 可以知道

(WThi,WThj)R2F×1(W^{T}h_{i},W^{T}h_{j}) \in R^{2F' \times 1}

(WThi?,WThj?)∈R2F′×1, 而

aR1×2Fa \in R^{1 \times 2F'}

a∈R1×2F′
? ? ?那么以这种方式就可以计算出所有的注意力系数,作者通过

MaskAttentionMask Attention

MaskAttention将这个注意力机制引入图结构中,

MaskAttentionMask Attention

MaskAttention的含义是:仅将注意力分配到顶点

ii

i的邻居节点集

jNij \in N_{i}

j∈Ni? 为了使得注意力系数更容易计算和便于比较,我们引入了

softmaxsoftmax

softmax对所有的

ii

i的相邻节点

jNij \in N_{i}

j∈Ni?进行正则化:

aij=softmax(eij)=exp(eij)kNiexp(eik)(3) a_{ij} = softmax(e_{ij})=\frac{exp(e_{ij})}{\sum_{k\in N_{i}}exp(e_{ik})} \tag{3}

aij?=softmax(eij?)=∑k∈Ni??exp(eik?)exp(eij?)?(3)
更直观一点解释就是行归一化,只不过是特殊的行归一化而已。

? ? ?作者在这里在进行行归一化之前加了一个非线性函数

LeakyReluLeakyRelu

LeakyRelu。有了

(2)(2)

(2),

(3)(3)

(3)和非线性关系

LeakReluLeakRelu

LeakRelu,那么我们就可以轻松得到最后的注意力系数:

aij=softmax(LeakyRelu(eij))=exp(LeakyRelu(a[Whi,Whj]))kNiexp(LeakyRelu(a[Whi,Whk]))(4) a_{ij} = softmax(LeakyRelu(e_{ij}))=\frac{exp(LeakyRelu(a[Wh_{i},Wh_{j}]))}{\sum_{k\in N_{i}}exp(LeakyRelu(a[Wh_{i},Wh_{k}]))} \tag{4}

aij?=softmax(LeakyRelu(eij?))=∑k∈Ni??exp(LeakyRelu(a[Whi?,Whk?]))exp(LeakyRelu(a[Whi?,Whj?]))?(4)
? ? ?注意一下哈,我在参考其他代码的时候发现系数

aa

a在每一次计算

eije{ij}

eij的过程中是不变的
? ? ?那么上面这公式(2), (3)和(4) 时组成GAT的核心部分。最后一步得到最终的

attentionattention

attention就需要把边的矩阵

AA

A结合起来, 即最后的

maskmask

mask部分。

attentionij={aij如果vivj有直接边相连infiniteotherwise(5)attention_{ij}=
\begin{cases}
a_{ij}& \text{如果$v_{i}$与$v_{j}$有直接边相连}\\
infinite& \text{$otherwise$}
\end{cases} \tag{5}

attentionij?={aij?infinite?如果vi?与vj?有直接边相连otherwise?(5)
其中

attentionRN×Nattention \in R^{N\times N}

attention∈RN×N。
? ? ?有了这个最终

l+1l+1

l+1层的输出为:

hl+1=σ(attention×hlW)h^{l+1} = \sigma( attention \times h_{l}W)

hl+1=σ(attention×hl?W)
最终得到

hl+1RN×Fh^{l+1} \in R^{N \times F'}

hl+1∈RN×F′

? ? ?自此,

GATGAT

GAT的理论部分基本全部完成,其最终的目的时训练出注意力系数。以这个目的进行了一系列操作,本质上就是这个。

下面是重新整理公式与代码部分的相关的公式, 如果你不想看,可直接跳过.


? ? ?为了写代码的方便,这里我们把计算

attentionattention

attention的部分用矩阵写出来
? ? ?已知

hlRN×Fh^{l} \in R^{N\times F}

hl∈RN×F ,

WRF×FW\in R^{F\times F'}

W∈RF×F′, 参数

aR1×2Fa \in R^{1\times 2F'}

a∈R1×2F′, 这里可以解释一下

aa

a这里的作用,我们可以把

aa

a分成两部分,一个是自注意力系数,一个是邻居节点的注意力系数,即

a=[aself,aneibor]a = [a_{self}, a_{neibor}]

a=[aself?,aneibor?]

hl+1=hlW(6)h^{l+1} = h^{l} W \tag{6}

hl+1=hlW(6)

attentionself=hl+1aselfT(7)attention_{self} = h^{l+1} a_{self}^{T}\tag{7}

attentionself?=hl+1aselfT?(7)

attentionneibor=hl+1aneiborT(8)attention_{neibor} = h^{l+1} a_{neibor}^{T}\tag{8}

attentionneibor?=hl+1aneiborT?(8)

attention=attentionself+attentionneiborT(9)attention =attention_{self} + attention_{neibor}^{T}\tag{9}

attention=attentionself?+attentionneiborT?(9)

attention=LeakRelu(attention)(10)attention = LeakRelu(attention)\tag{10}

attention=LeakRelu(attention)(10)

attentionij={attentionij如果vivj有直接边相连infiniteotherwise(11)attention_{ij}=
\begin{cases}
attention_{ij}& \text{如果$v_{i}$与$v_{j}$有直接边相连}\\
infinite& \text{$otherwise$}
\end{cases} \tag{11}

attentionij?={attentionij?infinite?如果vi?与vj?有直接边相连otherwise?(11)

attention=softmax(attetion)(12) attention = softmax(attetion)\tag{12}

attention=softmax(attetion)(12)

hl+1=σ(attention×hl+1)(13) h^{l+1} =\sigma(attention \times h^{l+1} ) \tag{13}

hl+1=σ(attention×hl+1)(13)

? ? ?有了公式

(6)?(13)(6)-(13)

(6)?(13), 我们可以很容易的实现

GATGAT

GAT的代码, 具体代码参考GAT的pytorch代码. 这个代码的实现只是我自己参考别人的代码实现,有些地方作了改动。当然也有star很多的代码pytorch星比较多的代码

GCN

? ? ?深度学习中,

CNNCNN

CNN中的卷积本质上是一个共享参数的特征提取, 通过计算中心像素点以及相邻像素点的加权和来构成

featuremapfeature map

featuremap, 实现空间特征的提取。但是这种理论只适用于

EuclideanStructureEuclidean Structure

EuclideanStructure, 对于

GraphGraph

Graph这种

NonEuclideanStructureNon Euclidean Structure

NonEuclideanStructure并不是很适用。那么如何将

CNNCNN

CNN中的思想引入到

GraphGraph

Graph中,成为一个很大的问题。这里为什么要研究GCN的原因,参考的知乎请移步这里。

? ? ?

spectral domainspectral \space domain

spectral domain是GCN的理论基础, 主要借助图的

Laplacian matrixLaplacian \space matrix

Laplacian matrix的特征值和特征向量来研究图的性质。

GCN的理论依据

? ? ?现有给定如下已知条件:顶点之间的边矩阵为

ARN×NA \in R^{N \times N}

A∈RN×N,

NN

N为图中顶点的个数, 显然可以知道

hRN×Fh \in R^{N \times F}

h∈RN×F 和和度矩阵

DRN×ND \in R^{N\times N}

D∈RN×N。

Laplacian matrixLaplacian \space matrix

Laplacian matrix定义为

L=D?A(14)L=D-A \tag{14}

L=D?A(14)

图的拓扑结构 度矩阵(D) 边矩阵(A=e) 特征矩阵(f=h) Laplacian matrix
在这里插入图片描述 [2000030000200001]\left[ \begin{matrix} 2& 0 & 0 & 0 \\ 0 & 3 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 &1 \end{matrix} \right]

?????2000?0300?0020?0001??????

[0110101110100100]\left[ \begin{matrix} 0& 1 & 1 & 0 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 0 \\ 0 & 1 & 0 &0 \end{matrix} \right]

?????0110?1001?1110?0100??????

[424?3]\left[ \begin{matrix} 4 \\ 2 \\ 4 \\-3 \end{matrix} \right]

?????424?3??????

[2?1?10?13?1?1?10100?101]\left[ \begin{matrix} 2& -1 & -1 & 0 \\ -1 & 3 & -1 & -1 \\ -1 & 0 & 1 & 0 \\ 0 & -1 & 0 &1 \end{matrix} \right]

?????2?1?10??130?1??1?110?0?101??????

? ? ?这里不过多的介绍傅里叶分析里面的东西, 这里只需要记得

LaplacianLaplacian

Laplacian变换可以将上面的

vertexdomainvertex domain

vertexdomain变换到

spectraldomainspectral domain

spectraldomain, 或者简单的把

LaplacianLaplacian

Laplacian变换是操作在

GraphGraph

Graph中的一个算子即可。这里并不影响你理解

GCNGCN

GCN。这里简单说一下

Laplacian matrixLaplacian \space matrix

Laplacian matrix的几个好的性质:

  • Laplacian matrixLaplacian \space matrix

    Laplacian matrix是一个对称矩阵, 那么就可以进行特征分解, 也就是谱分解

  • Laplacian matrixLaplacian \space matrix

    Laplacian matrix是一个半正定的矩阵,也就是其特征值

    λi0\lambda_{i} \geq0

    λi?≥0

知道了这些,就可以对这些就可以对

LL

L进行特征分解,在线性代数中,有

L=UΛUT(15)L = U\Lambda U^{T} \tag{15}

L=UΛUT(15) 其中

Λ=[λ10?00λ2?0????00?λN]\Lambda =
\left[
\begin{matrix}
\lambda_{1} & 0 & \cdots & 0 \\
0 & \lambda_{2} & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & \lambda_{N} \\
\end{matrix}
\right]

Λ=??????λ1?0?0?0λ2??0??????00?λN????????

U=[u1,u2,,uN]RN×NU = [u_{1}, u_{2},\dots,u_{N}] \in R^{N\times N}

U=[u1?,u2?,…,uN?]∈RN×N 。
那么这个

UU

U就是一组标准的正交基向量, 显然有

UUT=I(16)UU^{T}=I \tag{16}

UUT=I(16)
这组标准正交基可以将

Vertex domainVertex \space domain

Vertex domain 转化到

Spectral doaminSpectral \space doamin

Spectral doamin中。现假设输入的矩阵为

xRN×Fx\in R^{N\times F}

x∈RN×F, 那么转化到

Spectral doaminSpectral \space doamin

Spectral doamin中变成:

x^=UTx(17)\hat{x} = U^{T}x \tag{17}

x^=UTx(17)
所有的特征都转化到

Spectral doaminSpectral \space doamin

Spectral doamin中了,那么自然而然的联想到是否有有在

Vertex domainVertex\space domain

Vertex domain中的普通神经网络中的

y=Wx{y} = W{x}

y=Wx
答案是肯定的,但是这个和在

Spectral doaminSpectral \space doamin

Spectral doamin中有稍稍的不同, 我们以图1中的顶点的例子进行简单的解释, 应该是怎么样的一种

WW

W的形式。
在图2中,输入特征矩阵

f=xf=x

f=x, 把

x^\hat{x}

x^用一个图3表示出来,简单的想象成是一块波形的3维侧面,就是这个样子.或者想象一下从

λ\lambda

λ轴向原点看, 你将会看到一串波形. 就像图2一样。




图2 在不同空间的图解




图3 x在spectral domain上的显示(f=x)

解释一下这个是什么意思,

[λ1,λ2,λ3,λ4][\lambda_{1},\lambda_{2},\lambda_{3},\lambda_{4}]

[λ1?,λ2?,λ3?,λ4?]是在

spectral domainspectral \space domain

spectral domain的频率大小。而

[u1f,u2f,u3f,u4f][u_{1}f, u_{2}f, u_{3}f,u_{4}f]

[u1?f,u2?f,u3?f,u4?f]是每个频率上的数值大小。说白了就是

ff

f在基向量

u1u1

u1上的投影大小。现在只需要在每个频率上加一个参数就可以实现

CNNCNN

CNN上的

y=wxy=wx

y=wx了。即




图4 参数

那么就有

[y^1y^2y^3y^4]=[θ10000θ20000θ30000θ4][x^1x^2x^3x^4]
\left[ \begin{matrix} \hat{y}_{1} \\ \hat{y}_{2} \\ \hat{y}_{3} \\ \hat{y}_{4} \end{matrix} \right] = \left[ \begin{matrix} \theta_{1}& 0 & 0 & 0 \\ 0 & \theta_{2} & 0 & 0 \\ 0 & 0 & \theta_{3} & 0 \\ 0 & 0 & 0 &\theta_{4} \end{matrix} \right] \left[ \begin{matrix} \hat{x}_{1} \\ \hat{x}_{2} \\ \hat{x}_{3} \\ \hat{x}_{4} \end{matrix} \right]

?????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???????
显然这个参数与

Λ\Lambda

Λ和

θ\theta

θ有关,不妨将其记录为

gθ(Λ)g_{\theta}(\Lambda)

gθ?(Λ)。那么就有关系:

y^=gθ(Λ)x^(18)\hat{y} = g_{\theta}(\Lambda)\hat{x} \tag{18}

y^?=gθ?(Λ)x^(18)
由公式(17)可知,(18)式可以变成

y^=gθ(Λ)UTx(19)\hat{y} = g_{\theta}(\Lambda)U^{T}{x} \tag{19}

y^?=gθ?(Λ)UTx(19)
现在只需要把

y^\hat{y}

y^?反傅里叶变化成

Vertex domainVertex \space domain

Vertex domain中就可以。即

y^=UTy=gθ(Λ)UTx(20)\hat{y} =U^{T}y= g_{\theta}(\Lambda)U^{T}{x} \tag{20}

y^?=UTy=gθ?(Λ)UTx(20)
根据正交矩阵的性质, 也即公式(16), 就可以得到

y=Ugθ(Λ)UTx(21)y =U g_{\theta}(\Lambda)U^{T}{x} \tag{21}

y=Ugθ?(Λ)UTx(21)
又因为

gθ(Λ)g_{\theta}(\Lambda)

gθ?(Λ)是关于

Λ\Lambda

Λ的函数, 就可以变成

y=gθ(L)x(22)y =g_{\theta}(L){x} \tag{22}

y=gθ?(L)x(22)


然而公式(22)是所有一切以

GCNGCN

GCN罪恶的开始, 其他的所有都只是在做怎么估计这个

gθ(L)g_{\theta}(L)

gθ?(L)。

广受欢迎的

GCNGCN

GCN是以

chebyshev polynomialchebyshev \space polynomial

chebyshev polynomial为基础进行估计

gθ(L)g_{\theta}(L)

gθ?(L),

chebyshev polynomialchebyshev \space polynomial

chebyshev polynomial为:

T0(Λ~)=I T1(Λ~)=Λ~ Ti(Λ~)=2Λ~Ti?1(Λ~)?Ti?2(Λ~)(23)T_{0}(\widetilde{\Lambda}) = I \space \space T_{1}(\widetilde{\Lambda})=\widetilde{\Lambda}\space \space T_{i}(\widetilde{\Lambda}) = 2\widetilde{\Lambda}T_{i-1}(\widetilde{\Lambda})-T_{i-2}(\widetilde{\Lambda}) \tag{23}

T0?(Λ)=I T1?(Λ)=Λ Ti?(Λ)=2ΛTi?1?(Λ)?Ti?2?(Λ)(23)

其中要满足两个关系式

Λ~=2Λλmax?I\widetilde{\Lambda} = \frac{2\Lambda}{\lambda_{max}}-I

Λ=λmax?2Λ??I,

Λ~[?1,1]\widetilde{\Lambda}\in[-1,1]

Λ∈[?1,1]。
有了上面的

chebyshev polynomialchebyshev \space polynomial

chebyshev polynomial递推关系式(23),不妨设:

gθ(Λ)=k=0nθkΛkg_{\theta}(\Lambda) = \sum_{k=0}^{n}\theta_{k}\Lambda^{k}

gθ?(Λ)=k=0∑n?θk?Λk

chebyshev polynomialchebyshev \space polynomial

chebyshev polynomial中,取值

n=1,λmax=2n=1,\lambda_{max}=2

n=1,λmax?=2,公式(22)就可以变成:

y=θ0x+θ1(L?I)x(24)y =\theta_{0}{x} +\theta_{1}(L-I)x \tag{24}

y=θ0?x+θ1?(L?I)x(24)

L=I?D?12AD12L=I-D^{\frac{-1}{2}}AD^{\frac{1}{2}}

L=I?D2?1?AD21?,这一步在原论文中成为正则化的结果.另外为了防止参数过多,令

θ=θ0=?θ1\theta=\theta_{0}=-\theta_{1}

θ=θ0?=?θ1?,那么式(24)可以变成

y=θ(I+D?12AD12)x(25)y=\theta(I+D^{\frac{-1}{2}}AD^{\frac{1}{2}})x \tag{25}

y=θ(I+D2?1?AD21?)x(25).
又令

I+D?12AD12=I+D~?12AD~12I+D^{\frac{-1}{2}}AD^{\frac{1}{2}}=I+\widetilde{D}^{\frac{-1}{2}}A\widetilde{D}^{\frac{1}{2}}

I+D2?1?AD21?=I+D2?1?AD21?,最终的形式变成了

y=θ(D~?12AD~12)x(26)y=\theta(\widetilde{D}^{\frac{-1}{2}}A\widetilde{D}^{\frac{1}{2}})x \tag{26}

y=θ(D2?1?AD21?)x(26).
式(26)再加上一个非线性变化也就是

GCNGCN

GCN的最终形式

y=σ(θ(D~?12AD~12)x)(26)y=\sigma(\theta(\widetilde{D}^{\frac{-1}{2}}A\widetilde{D}^{\frac{1}{2}})x )\tag{26}

y=σ(θ(D2?1?AD21?)x)(26).

代码部分也是参考式(26)的矩阵变形形式所写

y=σ((D~?12AD~12)xθ)(27)y=\sigma((\widetilde{D}^{\frac{-1}{2}}A\widetilde{D}^{\frac{1}{2}})x \theta)\tag{27}

y=σ((D2?1?AD21?)xθ)(27).

有了公式

(27)(27)

(27), 我们可以很容易的实现

GCNGCN

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.