GNN的理论与发展梳理
2020-11-20
参考:《深入浅出图神经网络:GNN原理解析》。
1、拉普拉斯矩阵
拉普拉斯矩阵(Laplacian Matrix)是研究图的结构性质的核心对象,定义为:
L
=
D
−
A
L=D-A
L=D−A
D
D
D是一个对角阵,是节点的度矩阵,
A
A
A是邻接矩阵,
D
i
i
=
∑
j
A
i
j
D_{ii}=\sum_{j}A_{ij}
Dii=j∑Aij
因此,拉普拉斯矩阵的元素值为,
L
i
j
=
{
d
e
g
(
v
i
)
,
i
=
j
−
1
,
e
i
j
∈
E
0
,
o
t
h
e
r
w
i
s
e
L_{ij} = \begin{cases} deg(v_i), & i = j \\[2ex] -1, & e_{ij}\in E \\[2ex] 0, & otherwise \end{cases}
Lij=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧deg(vi),−1,0,i=jeij∈Eotherwise
拉普拉斯矩阵的正则化形式,
L
s
y
m
[
i
,
j
]
=
{
1
,
i
=
j
−
1
d
e
g
(
v
i
)
d
e
g
(
v
j
)
,
e
i
j
∈
E
0
,
o
t
h
e
r
w
i
s
e
L_{sym}[i,j]= \begin{cases} 1, & i=j \\[2ex] \frac{-1}{\sqrt{deg(v_i)deg(v_j)}}, & e_{ij}\in E \\[2ex] 0, & otherwise \end{cases}
Lsym[i,j]=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧1,deg(vi)deg(vj)−1,0,i=jeij∈Eotherwise
拉普拉斯矩阵源于拉普拉斯算子
Δ
\Delta
Δ,反应图信号的局部平滑度。
2、图傅里叶变换
傅里叶变换将信号从空域(spatial)转化到频域(spetral),给信号处理带来了极大的便利。
由于拉普拉斯矩阵是一个实对称矩阵,因此可以被对角化,
L
=
V
Λ
V
T
=
[
⋮
⋮
⋮
v
1
⋯
v
N
⋮
⋮
⋮
]
[
λ
1
⋱
λ
N
]
[
⋯
v
1
⋯
⋯
⋮
⋯
⋯
v
N
⋯
]
L=V\Lambda V^T=\\[2ex] \begin{bmatrix} \vdots & \vdots & \vdots \\ v_1 & \cdots & v_N \\ \vdots & \vdots & \vdots \\ \end{bmatrix} \begin{bmatrix} \lambda_1 & & \\ & \ddots & \\ & & \lambda_N \\ \end{bmatrix} \begin{bmatrix} \cdots & v_1 & \cdots \\ \cdots & \vdots & \cdots \\ \cdots & v_N & \cdots \\ \end{bmatrix}
L=VΛVT=⎣⎢⎢⎡⋮v1⋮⋮⋯⋮⋮vN⋮⎦⎥⎥⎤⎣⎡λ1⋱λN⎦⎤⎣⎢⎡⋯⋯⋯v1⋮vN⋯⋯⋯⎦⎥⎤
其中
L
∈
R
N
×
N
L\in R^{N\times N}
L∈RN×N,
V
∈
R
N
×
N
V\in R^{N\times N}
V∈RN×N,
V
V
T
=
I
VV^T=I
VVT=I。
V
V
V的每一列表示节点的特征向量,
λ
k
\lambda_k
λk表示第k和特征值。
因此,图傅里叶变换(GFT)为:
x
~
k
=
⟨
v
k
,
x
⟩
x
~
=
V
T
x
\tilde x_k=\langle v_k,x \rangle \\[2ex] \tilde x=V^Tx
x~k=⟨vk,x⟩x~=VTx
其中
x
~
k
\tilde x_k
x~k为傅里叶系数,所有的傅里叶系数合在一起
x
~
\tilde x
x~称为频谱(spectrum)。
逆图傅里叶变换(IGFT)则定义为:
x
=
V
x
~
=
∑
k
=
1
N
x
~
k
v
k
x=V\tilde x=\sum_{k=1}^N\tilde x_kv_k
x=Vx~=k=1∑Nx~kvk
特征值可以等价为频率,特征值越低,频率越低,节点信号越趋于一致;而傅里叶系数可以等价成对应频率分量上的幅值。频域视角是一个全局视角,反映了图信号大小和拓扑结构,相当于图的一种身份ID。
3、图滤波器
使用图滤波器(filter)可以对各频率的强度进行操作。
我们可以定义滤波操作为:
y
=
H
x
=
(
V
Λ
h
V
T
)
x
=
V
[
h
(
λ
1
)
⋱
h
(
λ
N
)
]
V
T
x
y=Hx=(V\Lambda_hV^T)x \\[2ex] =V \begin{bmatrix} h(\lambda_1)& & \\ &\ddots & \\ & &h(\lambda_N) \end{bmatrix} V^Tx
y=Hx=(VΛhVT)x=V⎣⎡h(λ1)⋱h(λN)⎦⎤VTx
其中
H
∈
R
N
×
N
H\in R^{N\times N}
H∈RN×N为滤波器,
y
y
y为输出的信号,通过控制
h
(
λ
k
)
h(\lambda_k)
h(λk)来控制信号的增强或减弱的。
但是,上述计算过于复杂了,我们可以使用泰勒展开进行逼近。因此滤波器又可以定义为:
H
=
∑
k
=
0
K
h
k
L
k
H=\sum_{k=0}^Kh_kL^k
H=k=0∑KhkLk
其中,
K
K
K为滤波器的阶数,可以自定义,
L
L
L为拉普拉斯算子,作为图位移算子。
4、图卷积操作
图信号的卷积运算定义为,
x
1
∗
x
2
=
I
G
F
T
(
G
F
T
(
x
1
)
⨀
G
F
T
(
x
2
)
)
x_1*x_2=IGFT(GFT(x_1)\bigodot GFT(x_2))
x1∗x2=IGFT(GFT(x1)⨀GFT(x2))
其中
⨀
\bigodot
⨀表示哈达玛积,就是频域中的矩阵点乘运算。
4.1 对特征值对角矩阵进行参数化
特征值矩阵又称为频率响应矩阵,参照图滤波器,进行参数化,可得到网络,
X
′
=
σ
(
V
[
θ
1
⋱
θ
N
]
V
T
X
)
=
σ
(
V
d
i
a
g
(
θ
)
V
T
X
)
X'=\sigma(V \begin{bmatrix} \theta_1& & \\ & \ddots& \\ & & \theta_N \end{bmatrix} V^TX) =\sigma(Vdiag(\theta)V^TX)
X′=σ(V⎣⎡θ1⋱θN⎦⎤VTX)=σ(Vdiag(θ)VTX)
其中
θ
=
[
θ
1
,
.
.
.
,
θ
N
]
\theta=[\theta_1,...,\theta_N]
θ=[θ1,...,θN]是需要学习的参数,因此存在一个较大的问题:引入的参数过多!!!需要学习的参数数量和节点数量一致,根本就无法应用于大型图数据上。
4.2 对多项式系数进行参数化
很自然地想到了使用多项式进行逼近,前面也有提到过,
X
′
=
σ
(
V
[
∑
k
=
1
K
θ
k
λ
1
k
⋱
∑
k
=
1
K
θ
k
λ
N
k
]
V
T
X
)
=
σ
(
V
(
∑
k
=
1
K
θ
k
Λ
k
)
V
T
X
)
X'=\sigma(V \begin{bmatrix} \sum_{k=1}^K\theta_k\lambda_1^k& & \\ & \ddots& \\ & & \sum_{k=1}^K\theta_k\lambda_N^k \end{bmatrix} V^TX) =\sigma(V(\sum_{k=1}^K\theta_k\Lambda^k)V^TX)
X′=σ(V⎣⎡∑k=1Kθkλ1k⋱∑k=1KθkλNk⎦⎤VTX)=σ(V(k=1∑KθkΛk)VTX)
其中
θ
=
[
θ
1
,
.
.
.
,
θ
K
]
\theta=[\theta_1,...,\theta_K]
θ=[θ1,...,θK]是需要学习的参数,由于
K
K
K可以自由的定义且
K
≪
N
K\ll N
K≪N,大大降低了参数的数量。
5、GCN
前面的方法都对特征矩阵分解比较依赖,因此有很高的计算复杂度。
先定义重归一化形式的拉普拉斯矩阵,
L
~
s
y
m
=
D
~
−
1
2
A
~
D
~
−
1
2
\tilde L_{sym}=\tilde D^{-\frac{1}{2}}\tilde A\tilde D^{-\frac{1}{2}}
L~sym=D~−21A~D~−21
其中
A
~
=
A
+
I
\tilde A=A+I
A~=A+I,
D
~
i
i
=
∑
j
A
~
i
j
\tilde D_{ii}=\sum_j\tilde A_{ij}
D~ii=∑jA~ij,
L
~
s
y
m
∈
(
−
1
,
1
]
\tilde L_{sym}\in(-1,1]
L~sym∈(−1,1]。可以看出已经不再需要进行矩阵分解操作了。
为了增加网络的拟合能力,增加了一个参数化的权重矩阵,得到
X
′
=
σ
(
L
~
s
y
m
X
W
)
X'=\sigma(\tilde L_{sym}XW)
X′=σ(L~symXW)
这就是很多论文里面提到的图卷积层(GCN layer),使用这个层进行堆叠的模型成为图卷积网络(GCN)。
图卷积层是对函数拟合上的极大简化,相较于频域(spectral)图卷积中的矩阵分解 O ( N 3 ) O(N^3) O(N3)的时间复杂度,空域(spatial)图卷积的时间复杂度可以降至 O ( ∣ E ∣ d ) O(|E|d) O(∣E∣d)。
5.1 GCN对于图数据的学习
对于结构信息和属性信息的学习体现在: L ~ s y m X W \tilde L_{sym}XW L~symXW。
①
X
W
XW
XW对属性信息进行仿射变换
②
L
~
s
y
m
(
X
W
)
\tilde L_{sym}(XW)
L~sym(XW)聚合邻居节点,对结构信息进行编码
③进行任务学习
优点:
①对表示学习和任务学习一起进行端到端优化,具有更好的适应性。
②结构信息和属性信息的学习是同时进行的,二者之间有很好的互补关系。
6、对GCN的各种典型改进
6.1 GraphSAGE
GraphSAGE是对初始GCN模型的改进版本。
最最主要的贡献是采用了小批量训练方式(mini-batch)。为了适应小批量的方式,模型对聚合操作也进行了改进和拓展。
GraphSAGE完全没有用到 L L L或 L ~ s y m \tilde L_{sym} L~sym,节点的特征学习仅与其 k k k阶邻居有关,可以进行归纳学习(Inductive Learning)。这样,对于新节点的加入来说十分方便,这也是随机游走等方法不具备的优势。
6.2 GAT
图注意力网络(GAT)通过注意力机制(Attention Mechanism)对邻居节点进行聚合操作,实现了对不同邻居权重的自适应分配。
节点
v
i
v_i
vi在第
l
l
l层的特征向量为
h
i
∈
R
d
(
l
)
h_i\in R^{d^{(l)}}
hi∈Rd(l),经过图注意力层(GAL)进行聚合操作之后,输出新的特征向量
h
i
′
∈
R
d
(
l
+
1
)
h'_i\in R^{d^{(l+1)}}
hi′∈Rd(l+1)。定义为,
e
i
j
=
L
e
a
k
y
R
e
L
U
(
a
T
[
W
h
i
∣
∣
W
h
j
]
)
e_{ij}=LeakyReLU(a^T[Wh_i||Wh_j])
eij=LeakyReLU(aT[Whi∣∣Whj])
其中
e
i
j
e_{ij}
eij为权重系数,选择单层全连接层作为相似度函数。
α
i
j
=
s
o
f
t
m
a
x
j
(
e
i
j
)
=
e
x
p
(
e
i
j
)
∑
v
k
∈
N
(
v
i
)
e
x
p
(
e
i
k
)
\alpha_{ij}=softmax_j(e_{ij})=\frac{exp(e_{ij})}{\sum_{v_k\in N(v_i)}exp(e_{ik})}
αij=softmaxj(eij)=∑vk∈N(vi)exp(eik)exp(eij)
其中
α
i
j
\alpha_{ij}
αij为权重系数,进行归一化处理。
h
i
′
=
σ
(
∑
v
j
∈
N
(
v
i
)
α
i
j
W
h
j
)
h'_{i}=\sigma(\sum_{v_j\in N(v_i)}\alpha_{ij}Wh_{j})
hi′=σ(vj∈N(vi)∑αijWhj)
进行加权平均后,
h
i
′
h'_{i}
hi′为节点新的特征向量。
图的注意力机制模型比GCN多了一个新的可学习维度——边上的权重系数。
X
′
=
(
A
~
⨀
M
)
X
W
X'=(\tilde A\bigodot M)XW
X′=(A~⨀M)XW
其中权重矩阵
M
∈
R
N
×
N
M\in R^{N\times N}
M∈RN×N,就是将GCN中的
L
~
s
y
m
\tilde L_{sym}
L~sym换成了
(
A
~
⨀
M
)
(\tilde A\bigodot M)
(A~⨀M),使得图注意力模型有着很高的表达能力。
6.3 R-GCN
之前的模型没有考虑节点之间不止一种关系的异构图,解决方法就是使用R-GCN。
相比于GCN的聚合操作,R-GCN又增加了一个聚合关系的维度,
h
i
(
l
+
1
)
=
σ
(
∑
r
∈
R
∑
v
j
∈
N
v
i
(
r
)
1
c
i
,
r
W
(
l
)
h
j
(
l
)
+
W
o
(
l
)
h
i
(
l
)
)
h_{i}^{(l+1)}=\sigma(\sum_{r\in R}\sum_{v_j\in N_{v_i}^{(r)}}\frac {1}{c_{i,r}}W^{(l)}h_{j}^{(l)}+W_o^{(l)}h_i^{(l)})
hi(l+1)=σ(r∈R∑vj∈Nvi(r)∑ci,r1W(l)hj(l)+Wo(l)hi(l))
其中
W
r
W_r
Wr是具有
r
r
r关系的邻居所对应的权重矩阵,
W
o
(
l
)
h
i
(
l
)
W_o^{(l)}h_i^{(l)}
Wo(l)hi(l)对应着节点的自连接,
1
c
i
,
r
\frac {1}{c_{i,r}}
ci,r1用于归一化。
R-GCN共有2层聚合操作:
(1)第1层先对同种关系进行单独聚合
(2)第2层进行总聚合,还考虑了自连接的关系
7、GNN的通用框架
GNN的通用框架主要分为3类:
(1)消息传播神经网络(MPNN)
(2)非局部神经网络(NLNN)
(3)图网络(GN)
7.1 MPNN
MPNN的基本思路是通过消息函数和更新函数进行消息传播,对于节点
v
i
v_i
vi特征向量的更新可以表示为,
m
i
(
k
+
1
)
=
∑
v
j
∈
N
(
v
i
)
M
(
k
)
(
h
i
(
k
)
,
h
j
(
k
)
,
e
i
j
)
h
i
(
k
+
1
)
=
U
(
k
)
(
h
i
(
k
)
,
m
i
(
k
+
1
)
)
m_i^{(k+1)}=\sum_{v_j\in N(v_i)}M^{(k)}(h_i^{(k)},h_j^{(k)},e_{ij}) \\[2ex] h_i^{(k+1)}=U^{(k)}(h_i^{(k)},m_i^{(k+1)})
mi(k+1)=vj∈N(vi)∑M(k)(hi(k),hj(k),eij)hi(k+1)=U(k)(hi(k),mi(k+1))
消息传播一般对应于模型中的层。MPNN的核心是消息函数
M
M
M和更新函数
U
U
U,之前的GCN、R-GCN和GraphSAGE都可以看作是MPNN的特例。
7.2 NLNN
NLNN是注意力机制的一般化总结,使用non-local操作对邻居节点进行加权求和,
h
i
′
=
1
c
(
h
)
∑
∀
j
f
(
h
i
,
h
j
)
⋅
g
(
h
j
)
h'_i=\frac{1}{c(h)}\sum_{\forall j}f(h_i,h_j)\cdot g(h_j)
hi′=c(h)1∀j∑f(hi,hj)⋅g(hj)
7.3 GN
GN是比MPNN和NLNN更加一般的总结。
比较复杂,就不过多展开了。
8、图的池化操作
与之前的节点分类不同,图分类任务需要学习到整张图的标签和类别。为了解决这类问题,一般使用层次化池化(Pooling)的操作。
8.1 基于全局池化的图分类
全局池化的主要思路是设计一个读出(readout)层,对所有节点进行一次性聚合,从而得到图的全局表示,
y
=
R
e
a
d
o
u
t
(
{
h
i
(
k
)
∣
∀
v
i
∈
V
}
)
y=Readout(\{h_i^{(k)}|\forall v_i\in V\})
y=Readout({hi(k)∣∀vi∈V})
读出机制可以取sum,mean或max等函数。读出机制易于实现,但是丢失了图的结构信息。
8.2 基于层次化池化的图分类
主要有3类方法:
(1)基于图坍缩(Graph Coarsening)的池化机制
(2)基于TopK的池化机制
(3)基于边收缩(Edge Contraction)的池化机制
8.2.1 基于图坍缩的池化机制
主要思路:将图划分成不同的子图,将子图看做超级节点,从而形成一个坍缩的图。
1、图坍缩
定义簇分配矩阵
S
S
S,
S
i
j
=
{
1
,
v
i
∈
τ
(
j
)
0
,
o
t
h
e
r
w
i
s
e
S_{ij}= \begin{cases} 1,& v_i\in \tau^{(j)} \\[2ex] 0,& otherwise \end{cases}
Sij=⎩⎨⎧1,0,vi∈τ(j)otherwise
其中
S
∈
R
N
×
K
S\in R^{N\times K}
S∈RN×K,
N
N
N为节点数,
K
K
K为子图(簇)个数,
τ
(
j
)
\tau^{(j)}
τ(j)为子图
j
j
j中的节点列表。
我们定义,
A
c
o
a
r
=
S
T
A
S
A_{coar}=S^TAS
Acoar=STAS
其中
A
c
o
a
r
A_{coar}
Acoar代表了超级节点之间的连接强度(包括自连接),
(
S
T
A
S
)
i
j
(S^TAS)_{ij}
(STAS)ij代表了第
i
i
i簇与第
j
j
j簇之间的连接强度。
接下来定义采样算子
C
C
C,
C
i
j
(
k
)
=
{
1
,
τ
j
(
k
)
=
v
i
0
,
o
t
h
e
r
w
i
s
e
C_{ij}^{(k)}= \begin{cases} 1,& \tau_{j}^{(k)}=v_i \\[2ex] 0,& otherwise \end{cases}
Cij(k)=⎩⎨⎧1,0,τj(k)=viotherwise
其中
τ
j
(
k
)
\tau_{j}^{(k)}
τj(k)表示
τ
(
k
)
\tau^{(k)}
τ(k)中的第
j
j
j个节点,
C
C
C是一个节点顺序关系的指示矩阵。
然后,就可以定义子图的邻接矩阵
A
(
k
)
A^{(k)}
A(k),
A
(
k
)
=
(
C
(
k
)
)
T
A
C
(
k
)
A^{(k)}=(C^{(k)})^TAC^{(k)}
A(k)=(C(k))TAC(k)
A
c
o
a
r
A_{coar}
Acoar和
A
(
k
)
A^{(k)}
A(k)很好的定义了子图间的邻接关系和子图内部的邻接关系。通过不断进行坍缩,我们希望最终整张图成为一个超级节点,这样我们就可以利用其特征向量进行图分类的任务学习了。
2、DiffPOOL
DiffPOOL是首个将图坍缩+GNN的图级任务学习算法。
它提出了一个可学习的簇分配矩阵,使用2个独立的GNN分别对节点特征、节点所属簇的概率分布进行学习。
Z
(
l
)
=
G
N
N
l
,
e
m
b
e
d
(
A
(
l
)
,
H
(
l
)
)
S
(
l
)
=
s
o
f
t
m
a
x
(
G
N
N
l
,
p
o
o
l
(
A
(
l
)
,
H
(
l
)
)
)
Z^{(l)}=GNN_{l,embed}(A^{(l)},H^{(l)}) \\[2ex] S^{(l)}=softmax(GNN_{l,pool}(A^{(l)},H^{(l)}))
Z(l)=GNNl,embed(A(l),H(l))S(l)=softmax(GNNl,pool(A(l),H(l)))
其中,
Z
(
l
)
Z^{(l)}
Z(l)为第
l
l
l层学习到的节点特征,
S
(
l
)
S^{(l)}
S(l)为第
l
l
l层学习到的簇的概率分布,它是一种软分配并且不具备稀疏性。
然后,我们定义DiffPOOL层
(
(
A
(
l
)
,
Z
(
l
)
)
→
(
A
(
l
+
1
)
,
H
(
l
+
1
)
)
)
((A^{(l)},Z^{(l)})\rightarrow (A^{(l+1)},H^{(l+1)}))
((A(l),Z(l))→(A(l+1),H(l+1)))为,
H
(
l
+
1
)
=
(
S
(
l
)
)
T
Z
(
l
)
A
(
l
+
1
)
=
(
S
(
l
)
)
T
A
S
(
l
)
H^{(l+1)}=(S^{(l)})^TZ^{(l)} \\[2ex] A^{(l+1)}=(S^{(l)})^TAS^{(l)}
H(l+1)=(S(l))TZ(l)A(l+1)=(S(l))TAS(l)
计算出每一层的特征向量和邻接矩阵。最后,将整张图探坍缩成一个超级节点,送入后面的
M
L
P
MLP
MLP进行任务学习。
3、EigenPooling
EigenPooling在图分类中没有引入任何任何需要学习的参数!核心思想是选取作用域和池化操作。
(1)图坍缩
EigenPooling是通过图分区算法来实现图坍缩的,比如使用
K
m
e
a
n
s
Kmeans
Kmeans算法。
(
A
,
簇
数
K
)
→
(
节
点
所
属
的
簇
)
(A,簇数K)\rightarrow (节点所属的簇)
(A,簇数K)→(节点所属的簇)
其划分是一种硬分配,并且具有稀疏性,降低了计算复杂度。
(2)池化操作
DiffPOOL在池化操作这一步仅仅是加和,损失了结构信息。
EigenPooling使用图傅里叶变换来进行池化操作,因此可以定义为,
X
l
=
Θ
l
T
X
X_l=\Theta_l^TX
Xl=ΘlTX
其中
Θ
l
=
[
u
‾
l
(
1
)
,
.
.
.
,
u
‾
l
(
k
)
]
\Theta_l=[\overline u_l^{(1)},...,\overline u_l^{(k)}]
Θl=[ul(1),...,ul(k)]表示所有子图的第
l
l
l个特征向量按行方向组织起来。
u
‾
l
(
k
)
\overline u_l^{(k)}
ul(k)表示经过上采样的第
l
l
l个特征向量。
X
l
∈
R
K
×
d
X_l\in R^{K\times d}
Xl∈RK×d是对所有子图的第
l
l
l个特征向量池化的结果。
每一个特征向量都计算完成之后,就可以将它们的结果拼接起来,
X
p
o
o
l
=
[
X
1
,
.
.
.
,
X
N
m
a
x
]
X_{pool}=[X_1,...,X_{N_{max}}]
Xpool=[X1,...,XNmax]
EigenPooling不仅能提高计算效率,并且还能兼顾图的结构和属性信息,显然要比DiffPOOL更加合理。
8.2.2 基于TopK的池化机制
TopK机制主要是一个按照某种规则不断丢弃节点的过程,最终得到全图的一个特征向量,用于后续的任务学习。
我们定义
g
p
o
o
l
gpool
gpool层为,
z
=
X
p
∣
∣
p
∣
∣
i
⃗
=
t
o
p
−
r
a
n
k
(
z
,
k
N
)
X
′
=
(
X
⨀
t
a
n
h
(
z
)
)
i
⃗
,
:
A
′
=
A
i
⃗
,
i
⃗
z=\frac{Xp}{||p||} \\[2ex] \vec i=top-rank(z,kN) \\[2ex] X'=(X\bigodot tanh(z))_{\vec i,:} \\[2ex] A'=A_{\vec i,\vec i}
z=∣∣p∣∣Xpi=top−rank(z,kN)X′=(X⨀tanh(z))i,:A′=Ai,i
其中,
z
z
z为重要度值(节点分数),用于进行降序排序,计算方法是将节点的特征向量在基向量
p
p
p上进行投影。
t
o
p
−
r
a
n
k
top-rank
top−rank函数根据
z
z
z值选出重要度前
k
k
k名的节点的下标。然后依据
i
⃗
\vec i
i对原先的特征矩阵
X
X
X和邻接矩阵
A
A
A进行切片操作,相当于丢弃一些节点。
但是这种层层丢弃节点的方法,会使得模型缺乏对所有节点进行有效融合的手段。为了实现有效融合,在
g
p
o
o
l
gpool
gpool层后面再加上一个
r
e
a
d
o
u
t
readout
readout层实现一次性聚合。
s
(
l
)
=
(
1
N
∑
i
=
1
N
x
i
(
l
)
)
∣
∣
(
m
a
x
i
=
1
N
x
i
(
l
)
)
s
=
∑
l
=
1
L
s
(
l
)
s^{(l)}=(\frac{1}{N}\sum_{i=1}^{N}x_i^{(l)})||(max_{i=1}^Nx_i^{(l)}) \\[2ex] s=\sum_{l=1}^Ls^{(l)}
s(l)=(N1i=1∑Nxi(l))∣∣(maxi=1Nxi(l))s=l=1∑Ls(l)
其中读出层将平均池化与最大池化拼接起来,最终的全局池化是每一层池化结果的加和。
8.2.3 基于边收缩的池化机制
EdgePool核心思想是迭代式地将每条边上的节点进行两两归并形成一个新的节点,最终得到全图的特征表示。
每次选择边进行节点归并的依据是边的分数,
r
i
j
=
w
T
[
h
i
∣
∣
h
j
]
+
b
s
i
j
=
s
o
f
t
m
a
x
j
(
r
i
j
)
r_{ij}=w^T[h_i||h_j]+b \\[2ex] s_{ij}=softmax_j(r_{ij})
rij=wT[hi∣∣hj]+bsij=softmaxj(rij)
其中
r
i
j
r_{ij}
rij为每条边的原始分数,
s
i
j
s_{ij}
sij为原始分数沿着邻居节点归一化后的分数。
然后,选择分数最高的且未被选过的两个节点进行归并。合并之后新节点的特征向量
h
i
j
h_{ij}
hij为,
h
i
j
=
m
a
x
{
s
i
j
,
s
j
i
}
⋅
(
h
i
+
h
j
)
h_{ij}=max\{s_{ij},s_{ji}\}\cdot (h_i+h_j)
hij=max{sij,sji}⋅(hi+hj)
EdgePool利用边收缩的原理,仅将邻居节点进行归并,既保留了图的结构信息,有保证了图中连接的稀疏性。
9、基于GNN的图表示学习
9.1 图表示学习的分类
图表示学习(graph embedding)又可以称为网络表示学习(network embedding),或者称为网络嵌入,主要目标是将图数据转化成低维稠密的向量化表示,同时确保图数据中的某些性质在向量空间中也能够得到对应。
图表示学习从方法上来说可以分为3类:
(1)基于分解的方法
(2)基于随机游走的方法
(3)基于深度学习的方法
类别 | 主要思想 | 代表模型 | 优点 | 缺点 |
---|---|---|---|---|
基于分解的方法 | 对结构信息进行矩阵分解 | - | - | 具有很高的计算复杂度 |
基于随机游走的方法 | 将随机游走所产生的序列看作是句子,节点看作是词,类比词向量Skip-gram等模型的学习方法 | DeepWalk、Node2Vec等 | 将图转化为序列,实现了大规模图的学习 | ①图本身的结构信息没有充分利用 ②很难融合属性信息进行表示学习 |
基于深度学习的方法 | 主要是使用基于GNN的方法进行表示学习 | GraphSAGE、GAE、DGI等 | ①融合结构和属性信息进行表示学习 ②可以将表示学习和任务学习有机结合 ③能够适应大规模图 | 在模型深度、过平滑问题等方面仍面临挑战 |
9.2 基于GNN的图表示学习
依据损失函数(Loss Function)的不同,基于GNN的无监督图表示学习方法可分为2类:
(1)基于重构损失的GNN
(2)基于对比损失的GNN
9.2.1 基于重构损失的GNN
主要思想类似于自编码器(AE),将节点之间的邻接关系进行重构学习,并将重构的矩阵与原矩阵进行相似度对比,来更新参数。因此,这类方法也叫作图自编码器(GAE)。
Z
=
G
N
N
(
A
,
X
)
A
^
=
σ
(
Z
Z
T
)
Z=GNN(A,X) \\[2ex] \hat A=\sigma(ZZ^T)
Z=GNN(A,X)A^=σ(ZZT)
其中
Z
Z
Z是所有节点的表示矩阵,
A
^
\hat A
A^是重构后的邻接矩阵,重构损失定义如下,
L
o
s
s
r
e
c
o
n
=
∣
∣
A
^
−
A
∣
∣
2
Loss_{recon}=||\hat A-A||^2
Lossrecon=∣∣A^−A∣∣2
为了防止过平滑的问题,需要加入一些噪声,迫使模型学习到有用的信息:
(1)将
X
X
X增加随机噪声或置零
(2)将
A
A
A删除适当比例的边或修改边的权重
9.2.2 基于对比损失的GNN
对比损失通常会设置一个评分函数 D ( ⋅ ) D(\cdot) D(⋅),用来提高正样本的得分、降低负样本的得分。
类比词向量的学习,在图中,节点看作是词,如何定义节点的“上下文”就成为一个值得研究的问题。目前为止共有3中定义方式:
(1)邻居作为上下文
(2)子图作为上下文
(3)全图作为上下文
不论是何种定义方式,我们都可以定义一个通用的损失函数,
L
o
s
s
v
i
=
−
l
o
g
(
D
(
z
i
c
)
)
+
l
o
g
(
D
(
z
i
c
‾
)
)
Loss_{v_i}=-log(D(z_ic))+log(D(z_i\overline c))
Lossvi=−log(D(zic))+log(D(zic))
其中
c
c
c为上下文的表示向量,
c
‾
\overline c
c为非上下文的表示向量。
1、邻居作为上下文
通过损失函数建模节点和邻居节点之间的关系,GraphSAGE中就使用了这种思路。主要思想类似于DeepWalk,将随机游走时与中心节点
v
i
v_i
vi一起出现在固定窗口内的节点
v
j
v_j
vj视为邻居。
Z
=
G
N
N
(
A
,
X
)
L
o
s
s
v
i
=
l
o
g
(
1
−
σ
(
z
i
T
z
j
)
)
+
E
v
n
∼
p
n
(
v
j
)
l
o
g
(
σ
(
z
i
T
z
v
n
)
)
Z=GNN(A,X) \\[2ex] Loss_{v_i}=log(1-\sigma(z_i^Tz_j))+E_{v_n\sim p_n(v_j)}log(\sigma(z_i^Tz_{v_n}))
Z=GNN(A,X)Lossvi=log(1−σ(ziTzj))+Evn∼pn(vj)log(σ(ziTzvn))
其中
p
n
(
v
j
)
p_n(v_j)
pn(vj)是节点出现概率的负样本分布。由于此方法不需要重构出
A
^
\hat A
A^之后再最小化损失,所以省去了
O
(
n
2
)
O(n^2)
O(n2)的空间复杂度。
2、子图作为上下文
邻居作为上下文强调的是节点之间的共现关系,但是有时候距离远的节点的结构未必没有相似之处,如此一来就缺乏对节点结构相似性的捕捉。
Z
=
G
N
N
(
A
,
X
)
,
Z
c
o
n
t
e
x
t
=
G
N
N
c
o
n
t
e
x
t
(
A
,
X
)
c
i
=
R
e
a
d
o
u
t
(
{
Z
c
o
n
t
e
x
t
[
j
]
,
∀
v
j
是
v
i
的
上
下
文
锚
点
}
)
L
o
s
s
v
i
=
l
o
g
(
1
−
σ
(
z
i
T
c
i
)
)
+
l
o
g
(
σ
(
z
i
T
c
j
∣
j
≠
i
)
)
Z=GNN(A,X),Z_{context}=GNN_{context}(A,X) \\[2ex] c_i=Readout(\{Z_{context}[j],\forall v_j是v_i的上下文锚点\}) \\[2ex] Loss_{v_i}=log(1-\sigma(z_i^Tc_i))+log(\sigma(z_i^Tc_{j|j\ne i}))
Z=GNN(A,X),Zcontext=GNNcontext(A,X)ci=Readout({Zcontext[j],∀vj是vi的上下文锚点})Lossvi=log(1−σ(ziTci))+log(σ(ziTcj∣j=i))
其中一共用到2个GNN。一个用来在
K
K
K阶子图上提取其特征向量
Z
Z
Z,另一个提取每个节点作为上下文锚点时的表示向量
Z
c
o
n
t
e
x
t
Z_{context}
Zcontext,使用读出机制来聚合上下文锚点的表示向量
c
i
c_i
ci。
3、全图作为上下文
DGI模型实现了节点与全图之间的对比损失的学习机制。
Z
=
G
N
N
(
A
,
X
)
,
Z
‾
=
G
N
N
(
A
c
u
r
r
u
p
t
,
X
c
u
r
r
u
p
t
)
s
=
R
e
a
d
o
u
t
(
{
z
i
,
∀
v
i
∈
V
}
)
L
o
s
s
v
i
=
l
o
g
(
1
−
D
(
z
i
,
s
)
)
+
l
o
g
(
D
(
z
‾
i
,
s
)
)
Z=GNN(A,X),\overline Z=GNN(A_{currupt},X_{currupt}) \\[2ex] s=Readout(\{z_i,\forall v_i\in V\}) \\[2ex] Loss_{v_i}=log(1-D(z_i,s))+log(D(\overline z_i,s))
Z=GNN(A,X),Z=GNN(Acurrupt,Xcurrupt)s=Readout({zi,∀vi∈V})Lossvi=log(1−D(zi,s))+log(D(zi,s))
其中
(
A
c
u
r
r
u
p
t
,
X
c
u
r
r
u
p
t
)
(A_{currupt},X_{currupt})
(Acurrupt,Xcurrupt)为加噪声构造的负采样样本。将正负样本送入同一个GNN中进行学习。使用读出机制得到全图的向量表示
s
s
s。
总结
下一步:
《Graph Representation Learning》
https://www.cs.mcgill.ca/~wlh/grl_book/files/GRL_Book.pdf
https://www.cs.mcgill.ca/~wlh/