神经网络的ImageNet?斯坦福大学等开源百万量级OGB基准测试数据集
在满是「MNIST」这样的小数据里,图神经网络也需要「ImageNet」这样的大基准?近日,斯坦福大学的 Jure Leskovec 教授在 NeurlPS 2019 大会演讲中宣布开源 Open Graph Benchmark,这是迈向图神经网络建模统一基准的重要一步。转载:公众号 阿泽的学习笔记
参考公众号 机器之心 https://zhuanlan.zhihu.com/p/98901680
目录
简介
1.OGB
1.1 Overview
1.2 Dataset
节点预测
连接预测
图预测
1.3 Leaderboard
数据加载与评估
PYG
DGL
节点分类:
链接预测:
图分类:
2.OGB+DGL
2.1 环境准备
2.2 数据准备
2.3 GCN
3.为什么说分割图数据是个问题?
4.Conclusion
简介图神经网络是近来发展较快的机器学习分支领域。通过将非结构数据转换为结构化的节点和边的图,然后采用图神经网络进行学习,往往能够取得更好的效果。
然而,图神经网络发展到现在,尚无一个公认的基准测试数据集。许多论文采用的方法往往是针对较小的、缺乏节点和边特征的数据集上进行的。因此,在这些数据集上取得的模型性能很难说是最好的,也不一定可靠,这对进一步发展造成阻碍。
在 NeurlPS 2019 大会的图表示学习演讲中,Jure Leskovec 宣布开源图神经网络的通用性能评价基准数据集 OGB(Open Graph Benchmark)。通过这一数据集,可以更好地评估模型性能等方面的指标。
- 项目地址:http://ogb.stanford.edu
- 图表示学习演讲合集:https://slideslive.com/38921872/graph-representation-learning-3
本次演讲的嘉宾为 Jure Leskovec,是斯坦福大学计算机科学的副教授。他主要的研究兴趣是社会信息网络的挖掘和建模等,特别是针对大规模数据、网络和媒体数据。
值得注意的是,OGB 数据集也支持了 PYG 和 DGL 这两个常用的图神经网络框架。DGL 项目的发起人之一、AWS 上海 AI 研究院院长,上海纽约大学张峥教授(学术休假中)说:「现阶段,我认为 OGB 的最大作用是促成学界走出玩具型数据集。一个统一的、更复杂、更多样的数据集会使得研究人员重新聚集力量,虽然还会有模型过拟合标准数据集带来的弊端,但对提升模型和算法效果、提高 DGL 等平台的能力有着重要作用。」
张峥教授表示,Open Graph Benchmark 这种多样与统一的基准,对于图神经网络来说,是非常有必要的一步。
1.OGB 1.1 OverviewOpen Graph Benchmark(以下简称 OGB)是斯坦福大学的同学开源的 Python 库,其包含了图机器学习(以下简称图 ML)的基准数据集、数据加载器和评估器,目的在于促进可扩展的、健壮的、可复现的图 ML 的研究。
OGB 包含了多种图机器学习的多种任务,并且涵盖从社会和信息网络到生物网络,分子图和知识图的各种领域。没有数据集都有特定的数据拆分和评估指标,从而提供统一的评估协议。
OGB 提供了一个自动的端到端图 ML 的 pipeline,该 pipeline 简化并标准化了图数据加载,实验设置和模型评估的过程。如下图所示:
下图展示了 OGB 的三个维度,包括任务类型(Tasks)、可扩展性(Scale)、领域(Rich domains)。
- odbn-proteins:蛋白质数据集,有着蛋白质之间的关联网络,而且包括了多种生物;
- odbn-wiki:维基百科数据形成的网络;
- ogbn-products:亚马逊客户同时购买的商品的网络。
目前该基准测试所包含的数据集。
从数据集的类型来看,涵盖了现有的几大需要图表示学习的领域:生物学/分子化学、自然语言处理,以及商品推荐系统网络等。此外,这些图数据的量也非常大。例如,ogbn-wiki 的数据量已达到百万级别(节点),而最小的 ogbn-proteins 也有 100K 了。这和之前的很多图数据相比都显得更加庞大,因此也能更好地评价模型的性能表现。
连接预测连接预测中的数据集则更多一些,包括:
- ogbi-ddi:药物相互作用网络;
- ogbi-biomed:人类生物医药知识图谱;
- ogbi-ppa:蛋白质之间的关系网络;
- ogbi-reviews:亚马逊的用户-商品评论数据集;
- ogbi-citations:微软学术的引用关系网络图谱。
相比节点数据集来说,连接预测的数据集更多一些,类型也更为多样。
图预测OGB 同时也提供了对图进行预测的任务数据集,分别有:
- ogbg-mol:对分子进行预测,来自 MoleculeNet;
- ogbg-code:代码段的语法树结构网络;
- ogbg-ppi:蛋白质之间的交互网络;
从总体来看,数据集中偏向医药和生物的数据集很多。张峥教授认为,这可能有两个原因,首先是项目主导者 Jure 等在这一领域做了比较多的工作,因此推动这些数据集开源顺理成章。另一个原因是药分子的图数据相对干净,噪声少。而药品的结构是 3D 的,可能需要比较复杂、层数更深的模型解决相关的问题。
对于未来会有哪些数据集加入,张教授认为现在关于异构图的数据还不够多,而现实中的很多数据都是异构图表示的。但是,OGB 的作用依然明显,它能够很好地提升开源图神经网络框架的能力,推动开源社区集中力量解决实际问题。
另外,OGB 数据集中缺少金融、征信等领域的数据集,特别是反欺诈类的。这可能是因为反欺诈数据集脱敏后特征丢失过多的问题所致,但瑕不掩瑜,OGB 无疑帮助图神经网络脱离了所谓的「玩具模型」阶段,开始逐渐进入工业应用。
1.3 Leaderboard 数据加载与评估OGB 如此庞大的数据量需要专门的代码进行提取。据悉,所有开源的数据集都可以用特定的代码进行提取和加载,使用过程和深度学习框架中的 data_loader 相似。不过在使用前,我们还需要简单地使用「pip install ogb」完成安装。目前 OGB 库主要依赖于 PyTorch、NumPy 和 Scikit-Learn 等常用建模库,当然图神经网络库也可以自由选择 DGL 或 PyTorch Geometric。
DGL:https://github.com/dmlc/dgl
PyG:https://github.com/rusty1s/pytorch_geometric
下面详细看一下 OGB 现在包含的数据集:
和数据集的统计明细:
现在以节点预测为例,OGB 同时支持 PYG 和 DGL 两个图表示学习框架中的数据加载方法,加载代码如下:
PYGfrom ogb.nodeproppred.dataset_pyg import PygNodePropPredDataset
dataset = PygNodePropPredDataset(name = d_name) num_tasks = dataset.num_tasks # obtaining number of prediction tasks in a dataset
splitted_idx = dataset.get_idx_split()train_idx, valid_idx, test_idx = splitted_idx["train"], splitted_idx["valid"], splitted_idx["test"]graph = dataset[0] # pyg graph object
DGL
from ogb.nodeproppred.dataset_dgl import DglNodePropPredDataset
dataset = DglNodePropPredDataset(name = d_name)num_tasks = dataset.num_tasks # obtaining number of prediction tasks in a dataset
splitted_idx = dataset.get_idx_split()train_idx, valid_idx, test_idx = splitted_idx["train"], splitted_idx["valid"], splitted_idx["test"]graph, label = dataset[0] # graph: dgl graph object, label: torch tensor of shape (num_nodes, num_tasks)
可以看出,代码非常简单,使用简便。其中「d_name」可以被替换成任何一个数据集的名字。
同时,项目提供了一些示例代码,以对每个数据集进行评估。如下所示:
from ogb.nodeproppred import Evaluator
evaluator = Evaluator(name = d_name) print(evaluator.expected_input_format) print(evaluator.expected_output_format)
这里,用户可以了解到针对这一数据集的输入和输出的特定格式。
然后,用户可以将输入字典(input dictionary)传递进评估器中,了解实际的性能:
# In most cases, input_dict is# input_dict = {"y_true": y_true, "y_pred": y_pred} result_dict = evaluator.eval(input_dict)
据悉,OGB 官方已指明上海 AWS AI 研究院主打的开源框架 DGL 作为数据导入的平台之一。目前 DGL 兼容 PyTorch、MxNet 作为后端引擎,TensorFlow 也在开发中。实际上 DGL 在异构图和可扩展性已经做了很久,因此下一步可能会和 OGB 在相关领域进行新的技术结合,推动开源框架的发展。
张峥说:「DGL 目前在制药领域已有了一个效果不错的模型库,有了 OGB 数据集对模型库进行迭代,之后应当可以进一步提升。」
OGB 也提供了标准化的评估人员和排行榜,以跟踪最新的结果,我们来看下不同任务下的部分 Leaderboard。
节点分类:官方给出的例子都是基于 PyG 实现的,我们这里实现一个基于 DGL 例子。
2.1 环境准备导入数据包
import dgl
import ogb
import math
import time
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from ogb.nodeproppred import DglNodePropPredDataset, Evaluator
查看版本
print(dgl.__version__)
print(torch.__version__)
print(ogb.__version__)
0.4.3post2
1.5.0+cu101
1.1.1
cuda 相关信息
print(torch.version.cuda)
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))
print(torch.cuda.current_device())
10.1
True
1
Tesla P100-PCIE-16GB
0
2.2 数据准备
设置参数
device_id=0 # GPU 的使用 id
n_layers=3 # 输入层 + 隐藏层 + 输出层的数量
n_hiddens=256 # 隐藏层节点的数量
dropout=0.5
lr=0.01
epochs=300
runs=10 # 跑 10 次,取平均
log_steps=50
定义训练函数、测试函数和日志记录
def train(model, g, feats, y_true, train_idx, optimizer):
""" 训练函数
"""
model.train()
optimizer.zero_grad()
out = model(g, feats)[train_idx]
loss = F.nll_loss(out, y_true.squeeze(1)[train_idx])
loss.backward()
optimizer.step()
return loss.item()
@torch.no_grad()
def test(model, g, feats, y_true, split_idx, evaluator):
""" 测试函数
"""
model.eval()
out = model(g, feats)
y_pred = out.argmax(dim=-1, keepdim=True)
train_acc = evaluator.eval({
'y_true': y_true[split_idx['train']],
'y_pred': y_pred[split_idx['train']],
})['acc']
valid_acc = evaluator.eval({
'y_true': y_true[split_idx['valid']],
'y_pred': y_pred[split_idx['valid']],
})['acc']
test_acc = evaluator.eval({
'y_true': y_true[split_idx['test']],
'y_pred': y_pred[split_idx['test']],
})['acc']
return train_acc, valid_acc, test_acc
class Logger(object):
""" 用于日志记录
"""
def __init__(self, runs, info=None):
self.info = info
self.results = [[] for _ in range(runs)]
def add_result(self, run, result):
assert len(result) == 3
assert run >= 0 and run
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?