返回介绍

数学基础

统计学习

深度学习

工具

Scala

二十四、GPT-GNN [2020]

发布于 2023-07-17 23:38:24 字数 120852 浏览 0 评论 0 收藏 0

  1. 图神经网络GNN 的突破彻底改变了图数据挖掘的过程,从图的结构特征工程structural feature engineering 到图的表示学习 representation learning 。最近的 GNN 发展已被证明有利于各种 graph application 和网络任务,例如半监督节点分类、推荐系统、知识图谱推断 knowledge graph inference

    通常,GNN 将带有属性的图作为输入,并应用卷积滤波器来逐层生成 node-level representation 。通常,对于输入图上的一个任务,GNN 模型以端到端的方式使用监督信息进行训练。即:对于给定图上的任务,需要足够多的标记样本来训练 GNN 模型。通常对于这些任务,尤其是大型图,获取足够多的标记数据的代价很高,有时甚至是不可行的。以学术图 academic graph 中的作者消歧任务为例,迄今为止,该任务仍然面临着缺少 ground-truth 的挑战。

    NLP 中也遇到类似的问题。NLP 的最新进展通过训练大量的未标记数据,并将学到的模型迁移 transfer 到带少量标记的下游任务来解决该问题,即预训练 pre-training 的思想。如,预训练的 BERT 语言模型通过重构输入文本(next sentence predictmasked language predict )来学习单词的 representation,因此可以显著提高各种下游任务的性能。此外,计算机视觉也证明了类似的观察结果,即:未标记的数据本身包含丰富的语义知识,捕获数据分布的模型可以迁移到各种下游任务。

    受到预训练的启发,论文 《GPT-GNN: Generative Pre-Training of Graph Neural Networks》 提出对图神经网络进行预训练从而进行图数据挖掘。预训练的目的是使得 GNN 能够捕获输入图的结构属性 structural property 和语义属性 semantic property ,以便进行微调fine-tuning 就可以迁移到同一个领域 domain 内的其它的图任务。为实现该目标,GPT-GNN 提出通过学习重建reconstruct 输入的属性图 attributed graph 来对图分布graph distribution 建模。

    一种图重建方式是直接采用神经图生成neural graph generation 技术,但是它不适合预训练 GNN

    • 首先,大多数神经图生成技术仅关注于生成不带属性的图结构,这无法捕获节点属性和图结构之间的底层模式underlying pattern
    • 其次,这些神经图生成技术被设计于处理小图,从而限制了它们在大规模图上进行预训练的潜力。

    贡献:在 GPT-GNN 中,作者设计了一种用于 GNN 预训练的自监督属性图生成任务 self-supervised attributed graph generation task,通过该任务对图结构和节点属性进行建模。基于该任务,作者提出了用于 GNN 的生成式预训练 generative pretraining of graph neural network: GPT-GNN 框架 (如下图所示)。然后可以将输入图上的预训练 GNN 用作同一类型的图上不同下游任务的 GNN 模型的初始化。具体而言,论文的贡献如下:

    • 首先,作者设计了一个属性图生成任务attributed graph generation task 来建模节点属性和图结构。作者将图生成目标分解为两个部分:属性生成attribute generation,边生成 edge generation,它们的联合优化相当于最大化整个属性图的概率似然。通过这种做法,模型可以在生成过程中捕获节点属性和图结构之间的固有依赖性 inherent dependency
    • 其次,作者提出了一个有效的框架 GPT-GNN 来对上述任务进行生成式的预训练 generative pre-trainingGPT-GNN 可以同时计算每个节点的属性生成损失和边生成损失,因此只需要为图运行一次 GNN 。此外,GPT-GNN 可以通过子图采样处理大型图,并通过自适应 embedding queue 来缓解负采样带来的 inaccurate loss
    • 最后,作者在两个大型图上预训练了 GNN1.79 亿节点和 20 亿边的 Open Academic Graph: OAG1.13 亿节点的 Amazon 推荐数据。大量实验表明:GPT-GNN 预训练框架可以显著地有利于各种下游任务。例如,通过在 OAG 上应用预训练模型,节点分类和链接预测任务的性能比没有预训练的 state-of-the-art GNN 平均可达 9.1% 。此外,作者表明:GPT-GNN 可以在各种 setting 下持续提高不同的 base GNN 的性能。

24.1 基础知识和相关工作

  1. 预训练的目的是允许模型(通常是神经网络)使用预训练的权重来初始化模型参数,这样模型可以充分利用预训练和下游任务之间的共性 commonality 。最近,预训练在提高计算机视觉和自然语言处理中许多下游 application 的性能方面显示出优势。

24.1.1 GNN 的基础知识

  1. GNN 可以视为基于输入图结构的消息传递,它通过聚合局部邻域信息来获得节点的 representation

    假设节点v$ v $ 在 GNNl$ l $ 层的 representationhv(l)$ \mathbf{\vec h}_v^{(l)} $ ,则 GNN 的节点 representation 更新方程为:

    hv(l)AgguNv({Extract(hu(l1);hv(l1),e(u,v))})

    其中:Nv$ \mathcal N_v $ 为节点v$ v $ 的邻域,e(u,v)$ e(u,v) $ 为节点u$ u $ 到节点v$ v $ 的边。

    GNN 有两个基本的算子:

    • Extract(.) 算子:邻域信息抽取器 extractor。它使用 target 节点v$ v $ 的 representationhv(l1)$ \mathbf{\vec h}_v^{(l-1)} $ 以及两个节点之间的边e(u,v)$ e(u,v) $ 作为query,并从 source 节点u$ u $ 的 representationhu(l1)$ \mathbf{\vec h}_u^{(l-1)} $ 中抽取有用的信息。
    • Agg(.) 算子:邻域信息聚合器 aggregator 。它用于聚合target 节点v$ v $ 的邻域信息。通常采用 mean, sum, max 等函数作为聚合函数,也可以设计更复杂的聚合函数。

    在这个框架下,人们已经提出了各种GNN 架构:

    • 《Semi-Supervised Classification with Graph Convolutional Networks》 提出了图卷积网络 graph convolutional network: GCN ,它对图中每个节点的一阶邻域进行均值池化,然后进行线性投影和非线性激活操作。
    • 《Inductive Representation Learning on Large Graphs》 提出了 GraphSAGE,将 GCN 的聚合操作从均值池化推广到 sum 池化、最大池化、以及 RNN
  2. 此外,还有很多将注意力机制集成到 GNN 的方法。通常,基于注意力的模型通过估计每个 source 节点的重要性来实现 Extract(.) 算子,并在此基础上应用加权聚合。例如:

    • 《Graph Attention Networks》 提出了 GAT ,它采用加性的注意力机制 additive mechanism 来计算注意力。
    • 《Heterogeneous Graph Transformer》 提出了 heterogeneous graph transformer: HGT ,它利用针对不同关系类型的 multi-head attention 来获得 type-dependent 注意力。

    我们提出的预训练框架 GPT-GNN 可以适用于所有这些 GNN 模型(包括 GCN, GraphSAGE, GAT, HGT )。

24.1.2 用于图的预训练

  1. 已有一些研究提出利用预训练来学习节点的 representation,其中主要分为两类:

    • 第一类通常称作 graph embedding,它直接参数化node embedding 向量,并通过保持某些相似性度量来优化 embedding 向量,如网络邻近性network proximity《Line: Large-scale information network embedding》)或者随机游走得到的统计数据(metapath2vec, node2vec, 《Network embedding as matrix factorization: Unifying deepwalk, line, pte, and node2vec》)。

      但是,这种方式学到的 embedding 无法用于初始化其它模型从而微调其它任务(因为 embedding 模型是 transductive 的)。相反,我们需要考虑一种迁移学习方式,其目标是预训练一个适用于各种下游任务的通用的 GNN

    • 第二类通过直接在未标注数据上预训练 GNN 。例如:

      • 《Variational Graph Auto-Encoders》 提出变分图自编码器来重建图结构。
      • 《Inductive Representation Learning on Large Graphs》 提出 GraphSAGE 从而使用基于随机游走的相似性度量来优化无监督损失。
      • 《Deep Graph Infomax》 引入 Graph Infomax ,它最大化从 GNN 获得的 node representation 和一个池化的 graph representation 之间的互信息。

    尽管这些方法显示了对纯监督学习 purely-supervised learning 的增强enhancement ,但是这些方法迫使相近的节点具有相似的 embedding ,从而忽略了图中丰富的语义和高阶结构 higher-order structure 。我们的方法通过提出排列式的生成式目标 permutated generative objective 来预训练 GNN,这是一项更难的图任务,因此可以指导模型学到输入图的更复杂的语义和结构信息。

  2. 另外,还有一些工作尝试预训练 GNN 来抽取 graph-level representation

    • 《InfoGraph:Unsupervised and Semi-supervised Graph-Level Representation Learning via Mutual Information Maximization》 提出了 InfoGraph,它最大化了从 GNN 获得的 graph-level representation 与子结构 representation 之间的互信息。
    • 《Strategies for Pre-training Graph Neural Networks》 引入了在 node-levelgraph-level 预训练 GNN 的不同策略,并表明将它们组合在一起可以提高图分类任务的性能。

    我们的工作与他们不同,因为我们的目标是在单个大型图上预训练 GNN 并进行 node-level 迁移学习 。

24.1.3 用于计算机视觉和自然语言处理的预训练

  1. 预训练已广泛用于计算机视觉和自然语言处理。

    • 在计算机视觉中,早期的预训练技术(《Decaf: A deep convolutional activation feature for generic visual recognition》《Rich feature hierarchies for accurate object detection and semantic segmentation》《Context Encoders: Feature Learning by Inpainting》)大多遵循首先在大型监督数据集(如 ImageNet )上预训练模型,然后在下游任务上微调预训练的模型,或者直接利用预训练的模型抽取样本的 representation 作为特征。

      最近,一些自监督任务(《A Simple Framework for Contrastive Learning of Visual Representations》《Momentum contrast for unsupervised visual representation learning》《Representation Learning with Contrastive Predictive Coding》)也被用于预训练视觉模型。

    • 在自然语言处理中,早期的工作一直聚焦于利用文本语料库的共现来学习 word embedding《Distributed representations of words and phrases and their compositionality》《Glove:Global vectors for word representation》)。

      最近,人们在 contextualized word embedding 方面取得了重大进展,如 BERT, XLNET, GPT 。以 BERT 为例,它通过两个自监督任务来预训练一个文本编码器,以便更好地对 wordcontext 进行编码。这些预训练方法已被证明可以在广泛的自然语言处理任务中产生 state-of-the-art 性能,因此被用作许多 NLP 系统的基础组件。

24.2 模型

  1. 给定属性图G=(V,E,X)$ \mathcal G = (\mathcal V, \mathcal E, \mathbf X) $ ,其中V={v1,,vn}$ \mathcal V = \{v_1,\cdots,v_n\} $ 为节点集合,E$ \mathcal E $ 为边集合,XRn×d$ \mathbf X\in \mathbb R^{n\times d} $ 为节点的特征矩阵,d$ d $ 为节点的特征向量维度。xvRd$ \mathbf{\vec x}_v\in \mathbb R^d $ 为X$ \mathbf X $ 第v$ v $ 行,表示节点v$ v $ 的特征向量。

    GNN 模型在特定下游任务(如节点分类)的监督下学习输出 node representation 。有时候在单个图上存在多个任务,并且对于每个任务,大多数 GNN 需要提供足够多的标记数据。然而,获得足够多的标记数据通常具有挑战性,特别是对于大型图,这阻碍了GNN 的训练。因此,需要一个预训练的 GNN 模型,该模型可以通过很少的标签来进行泛化。从概念上讲,该预训练的模型应该:捕获图背后的固有结构 intrinsic structure 和属性模式attribute pattern ,从而使得该图上的各种下有任务受益。

  2. GNN 预训练的目标是学到一个通用的 GNN 模型fθ$ f_\theta $ ,它基于单个图G$ \mathcal G $ 来训练并且不使用任何标记数据,从而使得fθ$ f_\theta $ 是图G$ \mathcal G $ 上各种下游任务的很好的初始化点。一个问题是:如何在图上设计一个无监督学习任务来预训练 GNN 模型?

24.2.1 Generative Pre-Training Framework

  1. NLPCV 自监督学习的最新进展表明,未标记数据本身包含丰富的语义知识,因此可以捕获数据分布的模型能够迁移到各种下游任务。受此启发,我们提出了 GPT-GNN,它通过重建/生成 input graph 的结构和属性来预训练 GNN

  2. 形式上,给定属性图G$ \mathcal G $ 以及一个 GNN 模型fθ$ f_\theta $ ,我们通过 GNN 模型fθ$ f_\theta $ 将图的似然 likelihood 建模为p(G;θ)$ p(\mathcal G;\theta) $ ,它表示G$ \mathcal G $ 中节点的属性分布和连接分布。GPT-GNN 目标是最大化图的似然来预训练 GNN 模型,即:

    θ=maxθp(G;θ)
  3. 第一个问题是:如何建模图的似然p(G;θ)$ p(\mathcal G;\theta) $ 。大多数现有的图生成方法都遵循自回归的方式auto-regressive manner 来分解概率目标,即:图中的节点按照顺序依次访问,并通过将每个新的节点连接到现有节点来生成边。

    类似地,我们使用排列向量 permutation vectorπ$ \vec\pi $ 来确定节点的顺序,其中πi$ \pi_i $ 表示编号为i$ i $ 的节点在排列中的位置。因此,图分布p(G;θ)$ p(\mathcal G;\theta) $ 等于似然在所有排列上的期望:

    p(G;θ)=Eπ[pθ(Xπ,Eπ)]

    其中:

    • Xπ$ \mathbf X^\pi $ 表示重排后的节点属性矩阵。
    • Eπ$ \mathcal E^\pi $ 表示重排后的边集合,其中节点i$ i $ 在排列π$ \vec\pi $ 中的边集合为Eiπ$ \mathcal E_i^\pi $ (它仅考虑位于πi$ \pi_i $ 位置之前的节点)。

    为简单起见,我们假设任何节点顺序π$ \vec\pi $ 都是等概率的,并且在下面内容中省略上标π$ \pi $ 。

    给定一个排列顺序,我们可以自回归地分解对数似然:

    logpθ(X,E)=i=1nlogpθ(xi,EiX<i,E<i)

    其中:

    • X<i$ \mathbf X_{\lt i} $ 表示节点i$ i $ 之前生成的所有节点对应的属性。
    • E<i$ \mathcal E_{\lt i} $ 表示节点i$ i $ 之前生成的所有节点对应的边。
    • i$ i $ 表示排列中的新节点,xi$ \mathbf{\vec x}_i $ 表示其属性向量,Ei$ \mathcal E_i $ 表示它和现有节点的连接。

    因此,这个对数似然给出了属性图的自回归生成过程autoregressive generative process

    该模型是一个节点一个节点地生成,因此是生成式模型。

  4. 本质上,上述公式描述了属性图的自回归生成过程autoregressive generative process。现在的问题是如何建模条件概率pθ(xi,EiX<i,E<i)$ p_\theta(\mathbf{\vec x}_i, \mathcal E_{i}\mid \mathbf X_{\lt i}, \mathcal E_{\lt i}) $ ?

24.2.2 Factorizing Attributed Graph Generation

  1. 一种朴素的想法是假设xi$ \mathbf{\vec x}_i $ 和Ei$ \mathcal E_i $ 是相互独立的,即:

    pθ(xi,EiX<i,E<i)=pθ(xiX<i,E<i)×pθ(EiX<i,E<i)

    这种分解完全忽略了节点的属性和它的边之间的依赖关系。但是,这种依赖关系恰好是属性图的核心特性,也是 GNN 中卷积聚合的基础。因此,这种朴素的分解无法应用于预训练 GNN

    为解决该问题,我们为属性图生成过程提出依赖感知 dependency-aware 的因子分解机制。具体而言:

    • 在预估新节点的属性时,我们采用节点的结构信息。
    • 在预估新节点的连接时,我们采用节点的属性信息。

    在这个过程中,一部分边已经被观察到,然后属性图生成过程分解为两个耦合的部分:

    • 给定观测到的边,生成节点属性。
    • 给定观测到的边和生成的节点属性,生成剩余的边。

    这样,模型可以捕获到每个节点的属性和图结构之间的依赖关系。

  2. 我们定义变量o$ \vec o $ 表示Ei$ \mathcal E_i $ 中所有观测到的边的索引组成的向量,因此Ei,o$ \mathcal E_{i,\vec o} $ 为所有的观测边。 定义¬o$ \neg \vec o $ 为所有被掩盖 mask 的边的索引组成的向量,因此Ei,¬o$ \mathcal E_{i,\neg \vec o} $ 表示所有需要被生成的边。则可以将条件概率重写为似然函数关于所有观测到的边的期望:

    pθ(xi,EiX<i,E<i)=opθ(xi,Ei,¬oEi,o,X<i,E<i)×pθ(Ei,oX<i,E<i)=Eo[pθ(xi,Ei,¬oEi,o,X<i,E<i)]=Eo[pθ(xiEi,o,X<i,E<i)generate attributes×pθ(Ei,¬oEi,o,Xi,E<i)generate edges]

    这种分解设计能够建模节点i$ i $ 的属性xi$ \mathbf{\vec x}_i $ 和它关联的边Ei$ \mathcal E_i $ :

    • 第一项pθ(xiEi,o,X<i,E<i)$ p_\theta\left(\mathbf{\vec x}_i\mid \mathcal E_{i,\vec o},\mathbf X_{\lt i}, \mathcal E_{\lt i}\right) $ 用于建模节点i$ i $ 的属性生成过程。基于观测到的边Ei,o$ \mathcal E_{i,\vec o} $ ,我们聚合目标节点i$ i $ 之前节点的信息来生成它的属性xi$ \mathbf{\vec x}_i $ 。

    • 第二项pθ(Ei,¬oEi,o,Xi,E<i)$ p_\theta\left( \mathcal E_{i,\neg \vec o}\mid \mathcal E_{i,\vec o},\mathbf X_{\le i}, \mathcal E_{\lt i}\right) $ 表示被遮盖的边的生成过程。基于观测到的边Ei,o$ \mathcal E_{i,\vec o} $ 以及生成的属性xi$ \mathbf{\vec x}_i $ ,我们预测Ei,¬o$ \mathcal E_{i,\neg\vec o} $ 中的每条边是否都存在。

      注意这里是Xi$ \mathbf X_{\le i} $ 而第一项是X<i$ \mathbf X_{\lt i} $ 。

  3. 我们以一个学术图为例来阐述上述分解的工作原理。假设我们希望生成一个论文节点,节点属性为论文标题,节点的边为论文及其作者、论文及其发表会议、论文及其引用论文。

    • 基于论文和它的某些作者之间观测到的边,我们的生成过程首先生成论文标题。
    • 然后基于观测到的边和论文标题再预测剩余的边(“论文--作者”、“论文--发表会议”、“论文--引用论文”)。

    通过这种方式,该生成过程可以对论文的属性(论文标题)和结构(观测到的边和剩余边)之间的相互作用进行建模。

    能不能先进行边的生成然后再进行节点属性的生成?可以通过实验来说明。

  4. 目前为止,我们将属性图的生成过程分解为节点属性生成 node attribute generation和边生成 edge generation 两步。一个新的问题是:如何通过同时优化属性生成和边生成来有效预训练 GNN

22.2.3 Efficient Attribute and Edge Generation

  1. 为提高效率,我们希望通过仅对输入图运行一次 GNN 来计算属性生成损失和边生成损失。另外,我们希望同时进行属性生成和边生成。但是,由于边生成过程需要将节点属性作为输入,这可能会泄露信息给属性生成过程。为避免信息泄露,我们将每个节点同时加入到两个类别:

    • 属性生成节点Attribute Generation Nodes:对于该集合中的节点,我们使用 dummy token 来代替它们的节点属性,从而掩盖节点属性,并学习一个共享的输入向量xinit$ \mathbf{\vec x}^{\text{init}} $ 来表示这个 dummy token。这等价于在 masked language model 中使用 [Mask] token 技巧。

      xinit$ \mathbf{\vec x}^{\text{init}} $ 的维度和xi$ \mathbf{\vec x}_i $ 相同,并且在预训练过程中进行学习(而不是固定的)。

    • 边生成节点 Edge Generation Nodes:对于该集合中的节点,我们保留其属性并将节点属性作为输入。

    我们修改输入图,将每个节点分裂为两个节点:一个为属性生成节点,另一个为边生成节点(它们之间不存在边)。

    我们将修改后的图输入到 GNN 模型中并得到节点的 embedding,我们分别用Hattr$ \mathbf H^{\text{attr}} $ 和Hedge$ \mathbf H^{\text{edge}} $ 来表示属性生成节点和边生成节点的 embedding。由于属性生成节点的属性被遮盖,因此Hattr$ \mathbf H^{\text{attr}} $ 包含的信息通常比Hedge$ \mathbf H^{\text{edge}} $ 更少。因此,在进行 GNN 消息传递时,我们仅使用边生成节点的来向外传递消息。

    Hattr$ \mathbf H^\text{attr} $ 和Hedge$ \mathbf H^\text{edge} $ 需要通过 GNN 模型计算得到(运行一次GNN 前向传播)。有两个细节需要注意:

    • 根据π$ \vec\pi $ 移除了所有从高编号到低编号的边,这意味着每个节点只能从低编号节点接收消息。这样,它们就不会将信息泄露给自回归生成的目标函数。
    • 如何在 GNN 中运行一次而为每个节点生成两个 embedding ?论文未给出细节。理论上讲,GNN 的前向传播仅能得到每个节点的单个 embedding

    还有一个问题:如果使用Hedge$ \mathbf H^\text{edge} $ 来传递消息,那么是否可能存在信息泄露?假设节点u$ u $ 和节点v$ v $ 之间相互连接且不与其它节点连接,则在属性生成过程中,我们有:

    hv(l),attrExtract(hu(l1),edge;hv(l1),attr,e(u,v))hu(l),edgeExtract(hv(l1),edge;hu(l1),edge,e(v,u))

    可以看到:节点v$ v $ 的属性信息通过hv(l1),edge$ \mathbf{\vec h}_v^{(l-1),\text{edge}} $ 进入了hu(l),edge$ \mathbf{\vec h}_u^{(l),\text{edge}} $ ,并进一步进入了hv(l+1),attr$ \mathbf{\vec h}_v^{(l+1),\text{attr}} $ ,因此发生了信息泄露。但是,由于每个节点只能从低编号节点接收消息,因此两条边e(u,v)$ e(u,v) $ 和e(v,u)$ e(v,u) $ 并不能同时存在,因此这种信息泄露的方式不存在。

    然后,我们使用这两组节点的 embedding 通过不同的解码器来生成属性和边。

  2. 属性生成:对于属性生成,我们将解码器记作Decattr()$ \text{Dec}^{\text{attr}}(\cdot) $ ,它将Hattr$ \mathbf H^{\text{attr}} $ 作为输入,并生成被遮盖的属性。

    解码器类型依赖于属性的类型:

    • 如果节点的属性为文本,则可以使用文本生成模型(如 LSTM)来生成属性文本。
    • 如果节点的属性为标准的向量,则可以使用多层感知机来生成属性向量。

    然后我们将距离函数定义为生成的属性和真实属性之间的度量,如文本属性的度量为困惑度perplexity、属性向量的度量为向量的 L2 距离。因此,我们定义属性生成损失为:

    Liattr=Distance(Decattr(hiattr),xi)

    最小化生成的属性和被遮盖的属性之间的距离,等价于最大化每个观测节点的属性的似然,即pθ(xiEi,o,X<i,E<i)$ p_\theta\left(\mathbf{\vec x}_i\mid \mathcal E_{i,\vec o},\mathbf X_{\lt i}, \mathcal E_{\lt i}\right) $ 。因此预训练的模型能够捕获到图的语义信息。

  3. 边生成:对于边生成,我们假设每条边的生成相互独立,则有:

    pθ(Ei,¬oEi,o,Xi,E<i)=j+Ei,¬opθ(ei,j+Ei,o,Xi,E<i)

    其中ei,j+$ e_{i,j^+} $ 表示被遮盖的、从节点i$ i $ 到j+$ j^+ $ 的边。

    然后在得到边生成节点的 embeddingHedge$ \mathbf H^{\text{edge}} $ 之后,我们通过解码器Decedge(,)$ \text{Dec}^{\text{edge}}(\cdot,\cdot) $ 来建模节点i$ i $ 连接到节点j+$ j^+ $ 之间的概率。

    我们采用负对比估计 negative contrastive estimation 来计算节点i$ i $ 连接到节点j+$ j^+ $ 之间的概率。记所有未连接的节点集合为Si$ \mathcal S_i^- $ ,则对比损失 contrastive loss 为:

    Liedge=j+Ei,¬ologexp(Decedge(hiedge,hj+edge))jSi{j+}exp(Decedge(hiedge,hjedge))

    最小化Liedge$ \mathcal L_i^{\text{edge}} $ 等于最大化生成所有遮盖边的可能性。因此预训练模型能够捕获图的固有结构。

  4. 下图给出了属性图的生成过程。具体而言:

    • (a) :确定输入图的节点排序π$ \vec\pi $ 。

    • (b):随机选择目标节点的一部分边作为观测边Ei,o$ \mathcal E_{i,\vec o} $ ,目标节点的剩余边作为遮盖边Ei,¬o$ \mathcal E_{i,\neg\vec o} $ (带十字的灰色虚线)。

    • (c) - (e)

      • 从输入图中删除被遮盖的边。
      • 将每个节点分裂为属性生成节点和边生成节点,从而避免信息泄露。
      • 在上述预处理之后,使用修改的邻接矩阵来计算节点 3,4,5embedding ,包括它们的属性生成 embedding 和边生成 embedding。注意:仅使用边生成节点的来向外传递消息。
    • 最后,如图 (c) - (e) 所示,我们通过并行的属性预测和遮盖边预测任务来训练 GNN 模型。

22.2.4 用于异质图和大型图的 GPT-GNN

  1. 异质图:GPT-GNN 框架可以直接应用于预训练异质 GNN。此时,每种类型的节点和边都可能有自己的解码器,该解码器由异质 GNN 确定而不是预训练框架指定。其它部分和同质 GNN 预训练完全相同。

  2. 大型图:为了在非常大的图上预训练 GNN,我们采样G$ \mathcal G $ 的子图来进行训练。具体而言,我们建议使用 LADIES 算法及其异质版本 HGSampling 从同质图或异质图采样一个稠密的子图。理论上讲,这两种方法都保证了采样节点之间的高度互连,并最大程度地保留了结构信息。

    为了估算对比损失Liedge$ \mathcal L_i^{\text{edge}} $ ,我们需要遍历输入图的所有节点。但是在采样的子图中我们只能访问采样后的节点,这使得自监督仅关注于采样到的局部信号。为了缓解该问题,我们提出自适应队列 Adaptive Queue,它存储了之前曾经采样的子图中的node embedding。我们将自适应队列中的节点作为负节点加入到Si$ \mathcal S_i^{-} $ 中。每次处理新的子图时,我们都会添加最新的节点embedding 并删除最早的node embedding ,从而逐步更新自适应队列。由于不会严格更新模型参数,因此队列中存储的负样本是一致且准确的 consistent and accurate

    自适应队列使得我们能够使用更大的负样本集合Si$ \mathcal S_i^- $ ,同时跨不同采样子图的节点可以为对比损失引入全局结构的指导。

22.2.5 GPT-GNN 算法

  1. GPT-GNN 预训练算法:

    • 输入:

      • 属性图G=(V,E,X)$ \mathcal G= (\mathcal V, \mathcal E,\mathbf X) $
      • 子图采样器 Sampler(.)
      • GNN 模型fθ$ f_\theta $
    • 输出:预训练模型的参数θ$ \theta^* $

    • 算法步骤:

      • 初始化 GNN 模型fθ$ f_\theta $ ,初始化属性生成解码器Decattr$ \text{Dec}^{\text{attr}} $ ,初始化边生成解码器Decedge$ \text{Dec}^{\text{edge}} $ 。

      • 初始化共享属性向量xinit$ \mathbf{\vec x}^{\text{init}} $ ,初始化自适应node embedding 队列Q={}$ Q=\{\} $ 。

      • 对每个采样到的子图G^Sampler(G)$ \hat{\mathcal G}\in \text{Sampler}(\mathcal G) $ ,执行:

        • 对每个节点,采样一组观测到的边的索引o$ \vec o $ 和遮盖边的索引¬o$ \neg\vec o $ ,并从G^$ \hat{\mathcal G} $ 中移除遮盖边Ei,¬o$ \mathcal E_{i,\neg\vec o} $ 。

        • 将所有节点分别同时分裂为属性生成节点、边生成节点。将属性生成节点集合的节点输入替换为xinit$ \mathbf{\vec x}^{\text{init}} $ 。然后应用 GNNfθ$ f_\theta $ 来获取两个集合中的node embeddingHattr$ \mathbf H^{\text{attr}} $ 和Hedge$ \mathbf H^{\text{edge}} $ 。注意:仅使用边生成节点的来向外传递消息。

        • 对每个节点i$ i $ ,其属性为xi$ \mathbf{\vec x}_i $ ,遮盖边的集合为Ei,¬o$ \mathcal E_{i,\neg\vec o} $ ,执行:

          • 计算属性生成损失Liattr=Distance(Decattr(hiattr),xi)$ \mathcal L_i^{\text{attr}} = \text{Distance}\left(\text{Dec}^{\text{attr}}\left(\mathbf{\vec h}_i^{\text{attr}}\right),\mathbf{\vec x}_i\right) $ 。

          • 通过拼接子图中未连接的节点和自适应队列Q$ Q $ ,为边生成任务准备负采样边集合Si$ \mathcal S_i^- $ 。

          • 计算边生成损失:

            Liedge=j+Ei,¬ologexp(Decedge(hiedge,hj+edge))jSi{j+}exp(Decedge(hiedge,hjedge))
        • 通过最小化L=iG^(Liattr+Liedge)$ \mathcal L = \sum_{i\in \hat{\mathcal G}}(\mathcal L_i^{\text{attr}}+ \mathcal L_i^{\text{edge}}) $ 来优化θ$ \theta $ 。

        • 添加Hedge$ \mathbf H^{\text{edge}} $ 来更新自适应队列Q$ Q $ ,并弹出最早的 edge embedding

      • 返回预训练的模型参数θ$ \theta^* $ 。

  2. 上述算法给出了总体流程。给定一个属性图G$ \mathcal G $ ,我们每次采样一个子图G^$ \hat{\mathcal G} $ 来作为生成式预训练的训练实例。

    • 第一步是确定节点排列顺序π$ \vec\pi $ 。为支持并行训练,我们希望单次的前向传播可以获得整个图的 embedding,以便我们可以同时计算每个节点的损失,而不是递归地计算每个节点。因此,我们根据π$ \vec\pi $ 移除了所有从高编号到低编号的边,这意味着每个节点只能从低编号节点接收消息。这样,它们就不会将信息泄露给自回归生成的目标函数。因此,我们只需要单次执行就可以获得整个图的 embedding,从而直接应用于生成式预训练。

      注意:这一步未在上述算法中体现。理论上在采样子图的外层还有一个循环:采样排列顺序的循环。

    • 然后,我们需要确定要遮盖的边。对于每个节点,我们选择其所有出边 out edge 并随机选择遮盖一部分边。

    • 然后,我们执行节点分裂,并获得节点的 embedding,这将用于计算生成式损失。

    • 我们通过拼接该子图内未连接节点和存储在自适应队列Q$ Q $ 中的节点来准备负样本,这样可以缓和子图和整体图之间的 gap

    • 最后我们更新自适应队列。

    一旦得到预训练模型,我们就可以使用预训练模型作为初始化,从而微调其它下游任务。

24.3 实验

  1. 数据集:

    • 异质图:

      • Open Academic Graph:OAG:包含超过 1.78 亿节点、22.36 亿条边,是迄今为止最大的公开可用的异质学术数据集。每篇论文都包含一组研究领域的标签,发表日期为 1900 ~2019

        数据集包含五种类型的节点:论文 Paper、作者 Author、领域 Field、会议 Venue、机构 Institute ,以及这些节点之间的 14 种类型的边,这些边的关系如下图所示。例如:领域包含 L0 ~ L5 六个级别,这些级别通过层级树 hierarchical tree 来表示;领域之间的层级关系通过 is_organized_in 关系表示;我们区分了不同的作者位置,即第一作者、最后作者、其它作者。另外,数据集还包含自连接,这是 GNN 框架中广泛添加的。

        对于论文和作者节点,节点编号非常大。因此传统的 node embedding 算法不适合为其抽取属性。因此我们借助论文标题来抽取属性。对于每篇论文,我们获取其论文标题,然后使用预训练的 XLNet 获取标题中每个单词的 embedding,然后我们根据每个单词的注意力对它们进行加权平均,从而获得每篇论文的标题 embedding ,作为论文节点属性。作者节点的属性是作者已发表论文的 embedding 的均值。

        对于领域、会议、机构等节点,由于节点数量很少,因此我们使用 metapath2vec 模型来训练它们的node embedding,从而作为节点属性。

        我们考虑对 Paper-Field, Paper-Venue, Author Name Disambiguation(Author ND) 预测作为三个下游任务来评估预训练模型的效果。性能指标为 MRR 进行评估。

        • 对于前两个任务,我们希望模型能够预测论文所属的正确领域或正确会议。我们将这两个任务建模为节点分类问题,其中使用 GNN 来获得论文的node embedding,然后使用一个 softmax 输出层来获得分类结果。
        • 对于最后一个任务,我们选择所有同名的作者,以及链接到其中任何一位作者的论文。任务是在论文和候选同名作者之间进行链接预测。我们使用 GNN 获得论文和节点的 embedding,然后使用 Neural Tensor Network 来获取每对 author-paper 存在链接的概率。

        mean reciprocal rank: MRR :多个 query 的排名倒数的均值。

      • Amazon Review Recommendation:包含 8280 万条评论、2090 万用户、930 万商品。评论发布于 1996~ 2018 年,每条评论都包含一个从 1~5 的离散评分,以及一个特定领域(包括书籍 Book、时装 Fashion 等)。

        数据集包含三种类型的节点:评论(评分和评论文本)、用户 、商品。另外还有商品的其它一些元数据,包括颜色、尺寸、样式和数量。和一般的 user-item 二部图相比,该数据集存在评论数据。为简单起见,我们将评论的连接视为 categorize_in 类型,因此图中共有三种类型的关系。

        我们通过预训练的 XLNet 获取每个评论的 embedding 作为评论节点的属性。用户节点、商品节点的属性都是和它们关联的评论的 embedding 取均值。

        我们将评分预测作为下游任务,该任务是一个 node-level 的五类分类任务。我们使用 micro-F1 得分作为评估指标。我们使用 GNN 获取评论的上下文表示,然后使用 softmax 输出层来获得分类预测。

    • 同质图:Reddit 数据集、从 OAG 提取的引文网络。

  2. Base model:在 OAGAmazon 数据集上,我们使用最新的异质 GNN 模型 Heterogeneous Graph Transformer: HGT 作为 base model 来预训练 GPT-GNN 。另外我们也对比了其它异质 GNN 作为 base model 的效果。

  3. baseline 方法(均用于预训练):

    • GAE:图自编码器,聚焦于传统的链接预测任务。它随机遮盖固定比例的边,然后要求模型重建这些遮盖的边。
    • GraphSAGE(无监督):强迫相连的节点具有相似的 embedding。它和 GAE 的主要区别在于:GraphSAGE 在预训练过程中不会遮盖边。
    • Graph InfoMax:尝试使用全局的图 summary embedding 来最大化局部node embedding。对于每个采样的子图,我们混洗子图来构造负样本。
    • 此外,我们还单独使用 GPT-GNN 的两个预训练任务来进行对比,即属性生成 GPT-GNN(Attr)、边生成 GPT-GNN(Edge)
  4. GPT-GNN 模型配置:

    • 所有的 base model,其隐层维度为 400head 数量为 8GNN 层数为 3
    • 所有GPT-GNN 都采用 PyTorch Geometric(PyG) package 实现。
    • 使用 AdamW 优化器,使用 Cosine Annealing Learning Rate Scheduler 训练 500epoch,并选择验证损失最低的模型作为预训练模型。
    • 自适应队列大小为 256
    • 在下游评估阶段,我们使用相同的优化配置来微调模型,微调期间训练 200epoch
    • 我们对下游任务重复训练 5 次,并报告测试结果的均值和标准差。
  5. 迁移学习配置:我们首先预训练 GNN,然后使用预训练的模型权重来初始化下游任务的模型。然后我们使用下游任务的训练集来微调模型,并评估测试集性能。

    大体而言,有两种不同的配置:

    • 第一种是在完全相同的图上进行预训练和微调。
    • 第二种是在一张图上进行预训练,但是在另一张图(和预训练的图具有相同类型)上进行微调。

    其中第二种更为实用,我们选择第二种进行测试。

    如果是跨图的微调,如何处理训练期间 unseen 节点的 embedding

    • 如果是 transductinve 的,那么只能要求两个图中的节点尽可能重合。
    • 如果是 inductive 的,那么两个图可以不同,因为我们只需要预训练模型权重矩阵(如 GAT 中的投影矩阵)即可。

    具体而言,我们选择以下三种图迁移学习:

    • 时间迁移 Time Transfer:使用来自不同时间段的数据进行预训练和微调。对于 OAGAmazon,我们使用 2014 年之前的数据进行预训练,使用 2014 年之后的数据进行微调。

    • 领域迁移 Field Transfer:使用来自不同领域的数据进行预训练和微调。

      • OAG 中,我们选择计算机科学领域 CS 的论文用于微调,其它领域的论文用于预训练。
      • Amazon 中,我们选择艺术 Art、手工艺品 Craft、缝纫品 Sewing 进行预训练,并对时尚、美容、奢侈品进行微调。
    • 组合迁移 Time + Field Transfer:使用 2014 年之前特定领域的数据来预训练,使用 2014 年之后另一些领域的数据来微调。这比单独的时间迁移或领域迁移更具挑战。

    在微调期间,对于这两个数据集我们选择 2014~2016 年的节点进行训练,2017 年的节点作为验证,2018 年的节点作为测试。

    为满足缺乏训练数据的假设,默认情况下我们仅提供 10% 的标记数据用于微调训练。

    在预训练期间,我们随机选择部分数据(2014 年以前)作为验证集。

  6. OAGAmazon 数据集上的不同预训练方法的下游任务性能如下表所示。

    结论:

    • 总体而言,GPT-GNN 框架显著提高了所有数据集上所有下游任务的性能。

      • 平均而言,GPT-GNN 相比于没有预训练的 base model,在 OAGAmazon 上获得了 13.3%5.7% 的相对提升。
      • GPT-GNN 也超越了其它的预训练模型,如 Graph Informax
    • 预训练在领域迁移学习中的提升要超过时间迁移学习,而组合迁移学习的提升比例最低。这体现了组合迁移学习的挑战性。

      但是,即使是在最具有挑战的组合迁移学习中,GPT-GNN 仍然分别在两个数据集上实现了 11.7%4.6% 的性能提升。这表明:GPT-GNN 使得 GNN 能够捕获输入图的通用结构和语义知识,从而可用于微调图数据的未见过的部分。

    • 通过对比 GPT-GNN 的两个预训练任务(属性生成任务和边生成任务)的有效性,我们可以评估哪个对GPT-GNN 以及下游任务更有效。

      • OAG 上,GPT-GNN(Attr)GPT-GNN(Edge) 平均性能分别提升 7.4%10.3%,表明边生成任务更有效。
      • 但是在 Amazon 上,结论相反,二者分别为 5.2%4.1%

      这表明 GPT-GNN 从属性生成任务和边生成任务带来的收益因不同的数据集而不同。但是,将两个预训练任务结合起来可以获得最大收益。

    • 将边生成任务和其它基于边的预训练方法(如 GAE, GraphSAGE)相比。在 OAG 上,GPT-GNN(Edge), GAE, GraphSAGE 相对于没有预训练分别提升 10.3%, 7.4%, 4.0% 。在 Amazon 上,提升比例分别为 5.2%, 3.1%, 1.3%

      • 首先,在这两个数据集上,GAEGPT-GNN(Edge) 都要比 GraphSAGE 提供更好的结果,这表明在边上进行遮盖是用于自监督的图表示学习的有效方式。
      • 其次,GPT-GNN(Edge) 始终超越了 GAEGPT-GNN(Edge) 的优势在于它会自动生成缺失的边,从而捕获被遮盖边之间的依赖关系,这些依赖关系已被 GAE 丢弃。

      总之,结果表明:GPT-GNN 可以为 GNN 预训练提供有效的自监督。

    • 节点分裂旨在缓解属性生成任务的信息泄露问题,如果没有该部分,则属性将会出现在输入中。此时属性生成任务只需要简单的把输入预测为输出即可,即它无法学到输入图的任何知识,因此对结果有负面影响。

      w/o node seperation 可以看到,移除节点分裂使得预训练模型效果很多情况下甚至比没有预训练的更差。这证明了节点分裂在避免属性信息泄露方面的重要性。

    • 自适应队列旨在缓解采样子图和完整图之间的 gap。从 GPT-GNN(Edge)w/o adaptive queue 之间的对比可以看到:移除自适应队列使得模型性能下降。

      这表明通过使用自适应队列来添加更多负样本,确实有助于预训练框架的效果提升。

  7. 我们考察其它 GNN 框架能否从 GPT-GNN 框架中受益。因此,除了 HGT 之外,我们还考察了 GCN, GAT, R-GCN, HAN 作为 base model

    我们在 OAG 上对它们进行预训练,然后在组合迁移配置下使用 paper-field 预测任务,并使用10% 的微调训练数据来微调。模型无关的超参数(如隐层维度、优化器)保持不变。结果如下所示,可以看到:

    • HGT 在所有非预训练模型中效果最好。
    • 采用 HGTGPT-GNN 在所有模型中效果最好。
    • GPT-GNN 预训练框架可以增强所有 GNN 模型的下游性能。

  8. 我们考察微调期间不同训练数据规模的效果。可以看到:

    • GPT-GNN 和其它预训练框架通过更多的标签数据可以不断提高下游任务的效果。
    • GPT-GNN 在所有预训练框架中表现最好。
    • GPT-GNN 仅需要 10% ~ 20% 的数据来微调,就可以达到监督学习 100% 训练数据的效果。这证明了 GPT-GNN 的优越性。

  9. 除了异质图之外,我们还评估了 GPT-GNN 预训练框架是否可以应用于同质图的迁移学习。我们在两个同质图上进行预训练和微调:

    • OAG 的计算机科学领域的论文引文网络,对每个论文的主题进行预测。
    • Reddit 帖子组成的 Reddit 网络,对每个帖子的社区进行推断。

    我们将 HGT 忽略其异质部分从而用于 base model。下表给出了 10% 标记数据的训练结果。可以看到:

    • 两个同质图的下游任务都可以从所有预训练框架中受益。
    • GPT-GNN 可以提供最大的性能提升。

  10. 我们给出 OAG 上预训练和微调的收敛曲线。

    下图给出了预训练期间每个 epoch 的验证误差曲线。结果表明:模型的验证损失不断下降,而不是很快地找到一个平凡解。这在某种程度上表明:生成式预训练任务足够艰巨,因此可以指导模型真正捕获数据的内在结构。整个GPT-GNN 预训练收敛大约需要 12 个小时。

    下图给出了微调期间的验证MRR 曲线(同时对比了没有预训练的验证 MRR 曲线)。可以看到,GPT-GNN 总是可以获得更泛化的模型,并且由于预训练的良好初始化,微调期间对于过拟合更鲁棒。

  11. 对于 OAG 数据集,我们的属性生成任务是生成论文标题,所以我们希望了解 GPT-GNN 如何学习生成标题,结果见下表。

    可以看到:模型仅通过查看部分邻域即可捕获需要预测的论文的主要含义。例如,对于第一句话,我们的模型成功地预测了本文的关键词,包括 person recognition, probabilistic 等。这表明图本身包含了丰富的语义信息,也解释了为什么预训练模型可以很好地泛化到下游任务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文