GLE的设计

GLE(图学习引擎)是一个用于大规模开发和实现图神经网络的分布式框架。GLE已成功应用于网络安全、知识图谱和搜索推荐等多种场景。它支持批量图上的采样,并支持离线或增量式GNN模型训练。GLE提供具有Python和C++接口的图采样操作,以及类似Gremlin的GSL(图采样语言)接口。GLE为GNN模型提供模型开发范式与流程,并与TensorFlow和PyTorch兼容。它提供数据层和模型层接口,以及多个模型示例。

graphlearn architecture

模型范式

大多数图神经网络(GNN)算法遵循消息传递或邻居聚合的计算范式,部分框架和论文将消息传递过程划分为聚合(aggregate)、更新(update)等步骤。但在实际应用中,不同GNN算法所需的具体计算过程并不完全相同。

在实际工业应用中,图的规模通常较大且图节点与边上的特征较为复杂(可能同时包含离散和连续特征),因此无法直接在原始图上进行消息传递/邻居聚合。一种可行且高效的方法是基于采样的思想,先从图中采样出一个子图,再基于该子图进行计算。采样出子图后,会先对该子图的节点和边特征进行预处理并统一处理成向量形式,之后便可基于该子图进行高效的消息传递计算。

总结来说,我们将图神经网络的范式归纳为三个阶段:子图采样、特征预处理和消息传递。

  1. 子图采样: 子图通过GraphLearn提供的GSL采样获得,该功能提供图数据遍历、邻居采样、负采样等功能。

  2. 特征预处理: 对节点和边的原始特征进行预处理,例如离散特征的向量化(嵌入查找)。

  3. 消息传递: 通过图的拓扑关系进行特征的聚合与更新。

根据子图采样中的邻居采样算子与消息传递中神经网络算子的差异,我们将子图组织为EgoGraph或SubGraph格式。EgoGraph由中心对象ego及其固定大小的邻居组成,是一种密集的组织格式。SubGraph是更通用的子图组织格式,由节点、边特征和边索引(由边的行索引和列索引组成的二维数组)构成,通常使用全邻居。基于SubGraph的卷积层通常使用稀疏神经网络算子。EgoGraph指的是由ego(中心节点)和k跳邻居组成的子图;SubGraph指的是用节点、边和edge_index表示的广义子图。

接下来,我们将介绍基于EgoGraph和SubGraph的两种不同计算范式。

基于EgoGraph的节点中心聚合

EgoGraph由中心节点(ego)和邻居节点组成,消息聚合路径由中心节点与邻居节点之间的潜在关系决定。k跳邻居只需聚合k+1跳邻居的消息,整个消息传递过程沿着从邻居指向自身的定向元路径进行。在这种方法中,采样的邻居跳数与神经网络层数需要完全一致。下图展示了GNNs的2跳邻居模型计算过程:原始节点向量记为h(0);第一层前向传播需要将2跳邻居聚合到1跳邻居,再将1跳邻居聚合到中心节点,不同跳数的邻居类型可能不同,因此第一层需要两个不同的卷积层(对于同构图,这两个卷积层相同),第一层处理后节点特征更新为h(1)作为第二层输入;在第二层需要聚合1跳邻居的h(1)来更新中心节点特征,最终输出的节点特征h(2)即为最终输出的中心节点嵌入表示。

egograph

基于子图的消息传递

与EgoGraph不同,SubGraph包含了图拓扑的edge_index,因此消息传递路径(前向计算路径)可以直接由edge_index确定,卷积层的实现可以直接通过edge_index和节点/边数据来完成。此外,SubGraph与PyG中的Data完全兼容,因此可以复用PyG的模型部分。

学习流程

一个GNN训练/预测任务通常包含以下步骤。

pipeline

使用GraphLearn的第一步是根据应用场景准备图数据。图数据以顶点表和边表的形式存在,一个应用场景通常会涉及多种类型的顶点和边。这些可以通过GraphLearn提供的接口逐一添加。图数据的构建是该过程中的关键部分,因为它决定了算法学习的上限。生成合理的边数据并选择与业务目标一致的特征非常重要。

图构建完成后,需要从图中采样以获取训练样本。建议使用GraphLearn Sample Language (GSL)来构建样本查询。GSL可以利用GraphLearn的异步多线程缓存采样查询功能,高效生成训练样本流。

GSL的输出为Numpy格式,而基于TensorFlow或PyTorch的模型需要张量格式的数据。因此,首先需要进行数据格式转换。此外,原始图数据的特征可能较为复杂,无法直接用于模型训练。例如,"id=123456, age=28, city=Beijing"等明文形式的节点特征需要通过嵌入查找处理为连续特征。GraphLearn提供了便捷的接口将原始数据转换为向量格式,在添加顶点或边数据源时,必须明确描述向量化后每个特征的类型、值空间和维度。

在GNN模型构建方面,GraphLearn封装了基于EgoGraph的层和模型,以及基于SubGraph的层和模型。在选择了适合需求的模型范式后,这些组件可用于构建GNN模型。该模型以EgoGraph或BatchGraph(小批量SubGraph)作为输入,并输出节点的嵌入表示。

在获取顶点的嵌入向量后,需要根据具体场景设计损失函数。常见场景可分为两大类:节点分类和链接预测。对于链接预测任务,所需输入包括"源顶点嵌入向量、目标顶点嵌入向量、负采样目标顶点嵌入向量",输出结果为损失值。该损失值通过训练器迭代优化。GraphLearn封装了一些常见损失函数,可在"常用损失函数"章节查阅。