论文笔记之GPT-GNN: Generative Pre-Training of Graph Neural Networks
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文笔记之GPT-GNN: Generative Pre-Training of Graph Neural Networks相关的知识,希望对你有一定的参考价值。
参考技术A 文中指出训练GNN需要大量和任务对应的标注数据,这在很多时候是难以获取的。一种有效的方式是,在无标签数据上通过自监督的方式预训练一个GNN,然后在下游任务上只需要少量的标注数据进行fine-tuning。本文提出了GPT-GNN通过生成式预训练的方式来初始化GNN。GPT-GNN引入了一个自监督的属性图生成任务,来pre-training一个GNN,使其能够捕捉图上的结构信息和节点属性信息。
图生成任务被分成了两部分:①属性生成。②边生成。
pre-training的GNN要能够捕捉input graph的结构信息和节点属性信息,使其能够在相似领域的下游任务上通过少量label的fine-tuning就能达到很好的泛化效果。本文采用的方式是重构输入的属性图来对图分布建模。
第一步,如上左图所示,通过自监督学习任务(节点属性生成和边生成)来预训练GNN。第二步,如上右图所示,pre-training好的模型以及参数用于对下游任务的初始化,只需要在少部分标注数据上做fine-tuning。
输入G=(V,E,X),其中V表示顶点集,E表示边集,X表示顶点属性矩阵。
目标:pre-training一个GNN模型,使其能够:1)捕捉图中的结构特征和属性特征。2)能够对图的下游任务有帮助。
也就是对图G=(V,E,X)不使用label学习一个可以泛化的GNN模型fθ。
GPT-GNN通过重构/生成输入图的结构信息和节点属性信息来pre-training GNN。given 输入图G=(V,E,X)和GNN模型fθ,图和GNN的likelihood定义为p(G,θ),通过最大化likelihood来预训练GNN,也就是
如何对p(G,θ)建模?
通过自回归的方法分解目标概率分布。
首先说明什么是自回归
如上式所示,c为常数项,є为随机误差,概括来说就是X的当期值等于一个或数个前期值的线性组合加常数项加随机误差。
对于graph来说,自回归方法概括为:nodes in the graph come in an order, and the edges are generated by connecting each new arriving node to existing nodes.
对于一个给定的order,通过自回归的方式分解log likelihood,每次生成一个节点。
在step i,given 所有在前面步骤生成的节点,包括节点属性X<i和节点之间的边E<i来生成新的节点i,包括节点属性Xi和与现有节点的连接边Ei.
如何对pθ(Xi,Ei|X<i,E<i)建模?
一种简单的方式是假设Xi和Ei是独立的,也就是
然而,这种分解方式完全忽略了节点属性和节点之间联系(边)之间的依赖关系。然而这种依赖关系是属性图和基于聚合邻居节点信息的GNN的核心属性。
因此,文中提出了一种分解方式,当生成一个新的节点属性时,给出结构信息,反之亦然。
从而整个生成过程可以分为两部分:
1)given 观测边,生成节点属性。
2)given 观测边和1)中生成的节点属性,生成剩下的边。
通过这种方式,模型能够捕捉每个节点属性和结构之间的依赖关系。
定义变量o来表示Ei中观测边的index vector,即Ei,o表示已经观测到的边。¬o表示masked边(要生成边)的index。
通过引入o,可以把前面的分布重写为所有可能观测边的期望likelihood.
这里的理解非常重要,第一个等式中,把Ei拆成了Ei,¬o和Ei,o,也就是说指定了哪些边是观测边,哪些边是masked边。需要注意的是,当o确定下来以后,¬o也是确定的。因此等式外面加上了对o的累加,这里可以理解为类似于全概率公式去对所有可能的o求和。
此外,这里需要注意Ei,E<i,Ei,o,Ei,¬o四个符号分别表示的是什么。现在位于step i,E<i是指在step i之前已经生成的边,Ei是指在step i将会生成的边(与节点i相连,有好多条),之后再将Ei中的边生成过程拆分成已经生成和将要生成两部分,即Ei,o和Ei,¬o。
下一个等式中,把第二个p看作概率分布,写作对于o期望的形式。最后把Xi和Ei,¬o看作独立的过程,拆成两个概率分布。
这种分解的优势在于,没有忽略Xi和Ei,o的联系。第一项表示given观测边,聚合目标节点i的邻居信息来生成其属性Xi.第二项表示given观测边和刚生成的属性Xi,预测Ei,¬o中的边是否存在。
如上图所示,给出了一个例子。对于一个academic graph,我们要去生成一个paper node,它的属性为title,并且其和author,publish venue,reference相连。上图中的实线部分为已经观测到的边,首先生成节点的属性,即title。然后基于author1,author2,author3和刚生成的节点属性title,预测剩下的边,即虚线部分。
出于效率的考虑,希望:
1)对于输入图只跑一次GNN就能计算节点属性生成和边生成过程的loss。
2)希望节点属性生成和边生成能同时进行。
然而,边生成需要用到节点属性信息,如果两个生成过程同时进行,会导致信息泄漏。
为了避免这个问题,将节点分为两种类型:
•属性生成节点。mask住这些节点的属性,用一个共用的dummy token Xinit来代替,Xinit和Xi的维度是相同的,并且在pre-training的过程中学习到。
•边生成节点。保持它们原有的属性。
需要注意的是,同一个节点在不同阶段扮演不同的角色,可能是属性生成节点也可能是边生成节点。只是在某一阶段,一个节点有一个确定的角色。
在graph上训练GNN来生成各节点的embedding,用hAttr和hEdge来分别表示属性生成节点和边生成节点的embedding。由于属性生成节点的属性被mask住了,因此hAttr中包含的信息通常会少于hEdge。因此,在GNN的message passing过程中,只使用hEdge作为向其他节点发送的信息。也就是说,对于每个节点,其聚合邻居hEdge的信息和自身的信息来生成新的embedding。之后,对于节点的embedding,使用不同的decoder来生成节点属性和边。(注意,节点的embedding和节点属性不是一回事。通俗理解,在GNN中节点的属性是input,节点的embedding是hidden layer。)
对于属性生成,用DecAttr来表示decoder,输入hAttr来生成节点属性。decoder的选择依赖于节点属性的类型,如果是text类型的节点属性,可以使用LSTM等;如果节点属性是vector,可以使用MLP。定义一个距离函数来度量生成属性和真实属性之间的差异,对于text类型属性,可以使用perplexity,对于vector属性,可以使用L2距离。由此,可以计算属性生成过程中的loss
最小化生成属性和真实属性之间的差异,等价于对generate attributes做MLE,也就是最大化下式
从而捕捉了图中的节点属性信息。
对于边生成过程,假设每条边的生成过程和其他边是独立的,由此对likelihood进行分解
得到hEdge后,如果节点i和节点j相连,则使用
进行建模,DecEdge是一个pairwise score function。
loss定义为
Si-指的是没有和节点i相连的节点。
最小化loss等价于对generate edges做MLE,从而捕捉了图中的结构信息。
上图给出了属性图生成过程的一个具体例子。
a)对于input graph确定permutation order π。
b)随机挑选一部分与节点i相连的边作为observed edges Ei,o,剩下的边作为masked edges Ei,¬o,并且删除masked edges。
c)把节点分为属性生成节点和边生成节点。
d)计算节点3,4,5的embedding,包括它们的属性生成节点和边生成节点。
(d)-(e)通过对于每个节点并行进行节点属性预测和masked边预测来训练一个GNN模型。
完整的算法流程如下所示。
对于上图的算法流程进行详细的说明。
输入一个属性图,每次采样一个子图G~作为训练的实例进行训练。首先决定permutation order π。同时,我们希望能够并行化训练,只做一次前向传播,就能得到整个图的embedding,由此可以同时计算所有节点的loss。因此,根据permutation order π来移除边,也就是使每个节点只能从跟低order的节点处获得信息。
之后,需要决定哪些边被mask。对于每个节点,获得其所有的出边,随机挑选一部分边被mask住,这一过程对应上述line4。
之后,对节点进行划分,得到整个图中节点的embedding,用于之后loss的计算,对应line5。
lone 7-9进行loss的计算。
line 8中,通过整合采样图中未连接的节点和Q中以前计算的节点embedding来选择负样本,这种方式能够减轻对于采样图优化和对于整个图优化的差距。
在line11-12中,优化模型并更新Q。
对于异构图,即包含不同类型的点和边的图,唯一的不同在于不同类型的点和边采用不同的decoder。
对于大规模的图,可以采样子图来进行训练,即上述算法流程中Sampler的作用。为了计算Ledge这一loss,需要遍历输入图的所有节点。然而,我们只能在采样的子图上计算这个loss。为了缓解这一差异,提出了adaptive queue,其中存储了之前采样的子图的节点embedding作为负样本。每次采样一个新的子图时,逐步更新这个队列,增加新的节点embedding,移除旧的节点embedding。通过引入adaptive queue,不同采样子图中的节点也能为全局的结构提供信息。
论文精度(李沐老师)Generative Adversarial Nets
Abstract
我们提出了一个新的framework,通过一个对抗的过程来估计生成模型,其中会同时训练两个模型:生成模型G来获取整个数据的分布,辨别模型D来分辨数据是来自于训练样本还是生成模型G。生成模型G的任务是尽量的让辨别模型D犯错。这个framework对应一个博弈论中双人对抗游戏。在任何函数空间的G和D中,存在一个独一无二的解,这个解能够将你整个训练中的数据的真实分布找出,D在任何地方等于1/2。如果G和D是一个MLP的话,整个系统可以通过一个误差反传进行训练。我们不需要任何的马尔科夫链或者对一个近似的推理过程展开。实验通过对生成的样本进行定性和定量评估,证明了该框架的潜力。
(介绍了GAN做的是个什么事情)
Introduction
一、深度学习是用来发现一些丰富、有层次的模型,这些模型能够对AI中的各种数据做一个概率分布的表示。虽然深度学习在辨别模型上取得了显著的进展,但是在生成模型上做的还是比较差,这个难点来自于我们最大化似然函数的时,要对概率进行很多的近似,从而带来了很大的计算困难。
二、(对GAN的一些介绍)在所提出的对抗网络框架中,生成模型和对抗模型对立:一个判别模型,它学习确定一个样本是来自模型分布还是数据分布。生成式模型可以被认为是类似于一队造假者,试图生产假币并在不被发现的情况下使用,而鉴别式模型则类似于警察,试图检测假币。这个游戏中的竞争促使两个团队改进他们的方法,直到假币与真币无法区分(希望造假者赢)。
三、这个框架可以产生许多种模型和优化算法的具体训练算法。在这篇文章中,我们探讨了这样一种特殊情况:生成模型通过多层感知器传递随机噪声来生成样本,而判别模型也是多层感知器。我们把这种特殊情况称为对抗性网络。在这种情况下,我们可以只用非常成功的反向传播和dropout算法来训练两个模型,只用正向传播从生成模型中取样。不需要近似推理或马尔科夫链。
Related work
一、之前的方法总是想去构造出一个分布函数,然后给这个函数提供一些参数进行学习,这些参数通过最大对数似然函数来求,但这会导致计算困难,尤其是维度比较高的时候。因为这些方法在计算上有困难,所以最近有些工作**“generative machines”**——学一个模型来近似模拟需要的结果,这项工作计算比较容易但是无法得知最后的分布是什么样子。
二、我们观察到对于f的期望求导等价于对f自己求导(说明为什么通过误差的反向传递对GAN求解)。说了一下VAEs的工作,和GAN类似。
三、说了一下NCE所做工作,但是其损失函数比较复杂,在求解性能上没有GAN好。
四、解释了一下与predictability minimization(PM)的区别。
五、解释了一下与adversarial examples的区别。adversarial examples构造一些假的样本,达到以假乱真的目的,从而测试算法的稳定性。
Adversarial nets
(讲的GAN的目标函数,以及对其的求解)
一、这个框架最简单的应用是当你的生成器和辨别器都是MLP的时候。生成器会学一个在数据x上的
p
g
p_g
pg分布。对于生成模型,我们定义一个先验
p
z
(
z
)
p_z(z)
pz(z),在输入的噪音变量z上。对于生成模型,就是把z映射映射成x,参数是
θ
g
\\theta_g
θg,
G
(
z
;
θ
g
)
G(z;\\theta_g)
G(z;θg)。辨别器
D
(
x
;
θ
d
)
D(x;\\theta_d)
D(x;θd),就是把x输出成一个标量,用来表示此数据来自真实数据(用1表示)还是由生成器(用0表示)生成的。在训练D的同时也会训练G,G用来最小化
l
o
g
(
1
−
D
(
G
(
z
)
)
)
log(1-D(G(z)))
log(1−D(G(z))),即训练一个G使我的辨别器尽量的犯错,G(z)代表是一个假图片。
二、
最理想状态是图(d),此时D的输出一直是0.5。
上述算法中,先更新我们的辨别器,再更新我们的生成器。k是超参数,不能太大/小,要保证辨别器有足够的更新,但也不要更新的太好。
如果没有把辨别器足够好的更新,我们更新生成器则没有太大的意义。
如果把辨别器更新的太好了,
1
−
D
(
G
(
z
i
)
)
1-D(G(z^i))
1−D(G(zi))会变成0,此时对生成器的更新会有困难。
GAN的收敛是非常不稳定的。
三、
在上面的公式里,后面一项会有一点问题,即容易把辨别器更新的太好了,
1
−
D
(
G
(
z
i
)
)
1-D(G(z^i))
1−D(G(zi))会变成0,此时对生成器的更新会有困难,所以更新G的时候把目标函数改成max
l
o
g
D
(
G
(
z
)
)
logD(G(z))
logD(G(z)),但同时也会产生一些数值上的问题,今后的工作会对其进行一些改进。
Theoretical Results
(讲了一些理论上的结果)
一、当且仅当
p
g
=
p
d
a
t
a
p_g=p_data
pg=pdata(生成器学到的分布=真实数据的分布),目标函数有一个全局最优解。
二、算法一确实能够求解目标函数。
Global Optimality of p g = p d a t a p_g=p_data pg=pdata
(讲目标函数是正确的)
Proposition 1 当G固定时,辨别器最优解(取值范围[0,1])为
当
p
g
=
p
d
a
t
a
p_g=p_data
pg=pdata时,结果为1/2。
Theorem 1 当且仅当
p
d
a
t
a
=
p
g
p_data=p_g
pdata=pg时,C(G)取得全局最小值。
KL散度,量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据或太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息。
GAN使用的JS散度,相对熵(KL散度)虽然可以用来表示两个概率分布之间的差异,但是它并不是对称的,因此有时用它来训练神经网络会有顺序不同造成不一样的训练结果的情况。为了克服这个问题,有人就提出了一个新的衡量公式,叫做JS散度。
Convergence of Algorithm 1
Proposition 2
如果 G 和 D 有足够的容量,并且在算法 1 的每一步,允许判别器在给定 G 的情况下达到其最优值,并更新
p
g
p_g
pg 以改进标准
E
x
∼
p
d
a
t
a
[
l
o
g
D
∗
G
(
x
)
]
+
E
x
∼
p
g
[
l
o
g
(
1
−
D
∗
G
(
x
)
)
]
Ex∼p_data [log D∗ G(x)] + Ex∼p_g [log(1 − D∗ G(x))]
Ex∼pdata[logD∗G(x)]+Ex∼pg[log(1−D∗G(x))] 然后
p
g
p_g
pg 收敛到
p
d
a
t
a
p_data
pdata。
Advantages and disadvantages
优:生成器没有去看真正样本上的数据,没有试图去拟合那些特征,所以使得其能够生成比较锐利的一些边缘。
缺:要均衡好G和D,如果G和D没均衡好,会导致结果很差。
Conclusions and future work
以上是关于论文笔记之GPT-GNN: Generative Pre-Training of Graph Neural Networks的主要内容,如果未能解决你的问题,请参考以下文章
论文笔记 Generative Face Completion
论文笔记---ClusterGAN: Latent Space Clustering in Generative Adversarial Networks
Generative Adversarial Nets 论文翻译
论文精读:Generative Adversarial Imitation Learning(生成对抗模仿学习)