《第9章-基于GNN的图表示学习》学习笔记
第9章-基于GNN的图表示学习
图表示学习是图学习领域中十分热门的研究课题,而GNN的出现又给图表示学习带来了新的建模方法。
9.0 端到端学习是一种强大的表示学习
与传统的特征工程不同,端到端(end-to-end)学习将原始数据作为输入,直接将任务学习的结果作为输出。
网络的前部主要进行表示学习,自动提取特征;网络后部主要进行任务学习。端到端学习可以看作是表示学习和任务学习的组合,但两部分并不是割裂的,它们是联合优化的。
低层的网络主要提取低层特征,高层的网络主要提取抽象的、与任务有关的特征。低层次的特征更加通用,可以基于这个特性进行迁移学习,针对某些特定的任务对某些模型进行微调,已达到针对特定任务的良好效果。
9.1 图表示学习
图表示学习(graph embedding)又可以称为网络表示学习(network embedding),或者称为网络嵌入,主要目标是将图数据转化成低维稠密的向量化表示,同时确保图数据中的某些性质在向量空间中也能够得到对应。
图数据的表示可以是节点层面的、边层面的和全图层面的,其中节点表示学习一直是图表示学习的主要对象。如果能够将图数据表示成包含丰富结构和属性信息的向量,那么后续的任务学习就能够得到更好的效果。
由于图数据自身非线性结构的特点,再加上图数据本身包含着丰富的结构信息,图表示学习就显得十分重要,主要体现在两个方面:
(1)方便计算机处理
(2)为之后的任务学习奠定基础
图表示学习从方法上来说可以分为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删除适当比例的边或修改边的权重
接下来,是比较重要的变分图自编码器(VGAE)。说实话,我暂时还看不懂,nb就完事了,什么时候看懂了再写吧。。。
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。
总结
一刷结束,看看论文再准备二刷。