近日,阿里巴巴开源了简化 GNN 应用的新框架 Graph-Learn。该框架可从实际案例中提取解决方案,应用于推荐系统、反欺骗等多个领域。相关代码已经可以在 GitHub 上下载。
近年来,图神经网络(GNN)已经在图像分类、语义分割、推荐系统、程序推理乃至分子结构预测等领域,都有着越来越广泛的应用。GNN 一般是将底层图形作为计算图,通过在图上传递、转换和聚合节点特征信息学习神经网络基元以生成单个节点嵌入。生成的节点嵌入可以作为输入,用于如节点分类或连接预测的任何可微预测层,完整的模型可以通过端到端的方式训练。
近日,阿里巴巴团队开源了 Graph-Learn(以下简称 GL),这是一个用以简化图神经网络应用的新框架。它能够从实际的案例中提取出解决方案,并且这些解决方案已在推荐、反欺骗和知识图谱系统领域得到了应用和验证。
GL 的可移植性和灵活性对于开发者来说十分友好,在该框架的基础上,开发者可以更轻松地实现 GNN 算法、自定义与图相关的运算符,并且更轻松地拓展现有模块。Container 和物理机上都可以安装 GL。
项目地址:https://github.com/alibaba/graph-learn
模型示例
GCN
图卷积网络被认为是基于深度学习的图形结构化数据方法最突出的进展之一。GCN 上的卷积算子是频谱图卷积的部分近似。从空间角度来看,相邻节点的嵌入被聚合在一起用以更新节点的自嵌入。
GAT
图注意力网络是 GCN 接下来的主要工作。GAT 将注意力机制融入了 GCN。通过计算节点之间的注意力系数,GAT 对节点及其相邻进行加权汇总,从而使得每个节点都能专注于最相关的相邻项从而进行决策。
GraphSAGE
GraphSAGE 是一个通用的归纳框架,可以有效地为之前无法可视化的数据生成节点嵌入。为了利用大规模图形数据,GraphSAGE 会建议从原始图形数据中采样计算子图形,然后进行逐批训练。以及它还提出了通过几个 aggregators 来有选择地聚合相邻项的嵌入。
快速开始
以最流行的图神经网络模型 GCN 为例,这部分展示一下如何基于 low-level 的 GL API 和深度学习框架(比如 TensorFlow)构建图学习模型。
如何创建一个基于学习的模型
需要执行以下四个步骤:
采样:使用内置采样函数采样子图(称为 EgoGraph)。
团队抽象了四个基本函数,包括 sample_seed,positive_sample,negative_sample 和 receptive_fn。sample_seed 用于生成初始 Nodes 以及 Edges(一系列节点或边缘),然后 positve_sample 将其用作输入以生成样本 Edges。negative_sample 函数可对非监督模型的负 Nodes 或 Edges 进行采样。GNN 需要聚集 nodes(edges)的相邻信息以便更新 nodes 及 edges 嵌入,因此提供了 acceptive_fn 来采样相邻信息。种子 Nodes 和 Edges 以及采样被统一组织为 EgoGraph。
图形流:使用 EgoFlow 时会根据不同的后端将 EgoGraph 转换为 EgoTensor。
GL 建模是基于 TensorFlow 等深度学习框架之上的。因此,需要将采样的 EgoGraphs 转换为张量格式 EgoTensor。团队将 EgoFlow 进行此转换。EgoFlow 还生成用于迭代训练和 pipeline 的 iterator。
定义编码器:使用 EgoGraph 编码器和功能编码器对 EgoTensor 进行编码。
获取 EgoTensor 之后,需要定义从原始数据到嵌入的转换例程。而对于 GNN 模型,此步骤是聚合节点并将其与自身节点的 nodes/edges 合并。
定义损失函数和训练:将编码的嵌入内容提供给损失函数及训练。
GL 内置了一些常见的损失函数和优化器,也可以自定义自己的损失函数和优化器。同时支持本地和分布式培训。
主要概念
源数据
GL 支持多种数据格式,用以简化从原始数据到 Graph 对象的整个构建过程。源数据放置在文件系统上,建模时,加载程序会将文件读取为 StructuredAccessFile。
对于用户而言,提供了两类源数据:Node Source 以及 Edge Source。这里将其描述为 Node Source 和 Edge Source 支持的数据格式。
通常情况下,节点包含一个 ID 以及多个描述实体的属性。Edge 包含两个 ID,用于描述两个节点之间的关系。Edges 也可能附加了属性。例如,「用户在星期六早上购买了产品」。它使用了用户和产品 ID 描述 Edge,「星期六早上」是该 Edge 的属性。
除属性外,GL 还支持源数据中的权重和标签。权重对于许多采样算法很重要,而标签是监督训练的必备条件。
如上所述,GL 使用 WEIGHTED,LABELED 和 ATTRIBUTED 作为基本 ID 的可选扩展。
图形对象
Graph 是一个组织原始数据的单元,用以启用高级操作。GL 作业中只能存在一个且是唯一的 Graph 对象。能够支持所有类型的图,包括同构图,具有不同类型 nodes 或 edges 的异构图或是以及具有附加在 nodes 或 edges 上属性的图。提供丰富的 API 来提取有关图形的信息。
通常来说,创建图形对象需要以下三个步骤:
声明一个 Graph 对象
描述出其拓扑性
初始化数据
分布式模式
GL 支持分布式模式运行的服务器或客户端以及其任意组合。服务器角色负责加载和管理图形。客户端与深度学习框架在同一过程中运行,以提供图形数据进行训练。在训练期间,将从客户端生成数据的查询或采样请求,在服务器中对其进行处理。最后,服务器的结果被聚合回客户端。
「服务器」和「客户端」只是 GL 中的逻辑层面的角色,它们也可以放在同一台机器上。