之前一直在几个玩具数据集上跑模型,发现了很多问题。看了OGB论文里的一些描述,我也深有体会,感觉很多东西都说到我心里去了。预计再发展几年吧,OGB也能像ImageNet那样,成为图表示学习领域中的一个统一的标准。
Hu W, Fey M, Zitnik M, et al. Open graph benchmark: Datasets for machine learning on graphs[J]. arXiv preprint arXiv:2005.00687, 2020.
数据集是模型的根基,而OGB数据集我认为又是相当重要的,所以必须要好好整理整理笔记。结合毕设,一直在做引文网络相关的节点分类任务,所以看的时候也有一些自己的侧重点,主要看了1、2、3、4、7这几部分。
简要介绍了OGB数据集。我觉得最主要的还是两点:
第一点给现有的模型带来了挑战;第二点为数据集的使用提供了便利。正因如此,OGB数据集才能够得到更多研究者的青睐。
引言部分其实把作者想说的都说了,后面的部分都是进行细化和展开论述的。这部分虽然比较烦杂,但是只要紧紧抓住「问题+解决」这个思路,就能够比较清楚地发现作者到底在表达什么。
现有的数据集最大的特点就是「小」。因为规模比较小,它和现实世界中web规模的图相差甚远,这对数据驱动的模型的研究以及解决实际问题来说都是不利的。
总之,在做了一些实验之后,我自己是有点苦不堪言。归根结底,还是之前的数据集太垃圾了。
和之前的数据集相比,最大的特点当然就是「大」。当然,除此之外,还有一些其他的考虑和改进。
新的数据集给图表示学习领域带来了新的挑战。
最后,OGB提供了一套标准化流程,这个对于实验来说很重要。通俗来说,我们按照这个流程,照猫画虎/照葫芦画瓢,实验也能够很快的跑起来了。
主要是前4个步骤,最后一个是鼓励大神们开源代码的,里面有很多参考代码,不过之前如果已经有PyG基础了,基本上直接看官方示例就ok了。流程很简单,大致是这样的:首先选择一个数据集,然后调包侠载入数据集并返回一个PyG或DGL的dataset对象,之后作为model的输入进行训练。训练完成之后,用数据集专属测试器进行测试和验证,得到acc等表现结果。
针对不同级别的任务,分别分析了这些数据集的缺点和现状,我这里只关注了节点级任务。
之前一直用的引文网络数据集:Cora、Citeseer、Pubmed,真的是一言难尽。这几个数据集的规模都很小,并且它的标准划分的训练集是每个类别随机抽取20个节点(默认),这样训练集一共就百八十个节点,这还训练啥啊。。
其实很多人早就发现之前的引文网络数据集不太行了。所以后面又出现了大一些的数据集:PPI、Reddit、Amazon2M。
综上,因为数据规模、数据集划分等原因,现有的数据集并不适合作为benchmark dataset。
可用的数据集信息,包括数据集划分依据和比例、任务类型、包含的属性信息等等。
可用数据集的图统计信息,包括图的个数、节点数、边数、节点的平均度、聚类系数、图直径等等。
文档和项目地址汇总:
ogbn-是节点级任务的数据集,后面会主要关注这一类。
此外,文章中还提到了另一个数据集TUDataset:https://chrsmrrs.github.io/datasets/。
这一部分是对ogbn-这一类数据集的详细介绍。
ogbn-主要包含了5个数据集。但是由于ogbn-proteins没有节点特征X(并且是2分类问题),ogbn-mag是异构图(含有多种类型的节点和边),这2个数据集并不在我的考虑范围之内。而剩下的3个正好也是Society这一类的小型(ogbn-arxiv)、中型(ogbn-products)、大型(ogbn-papers100M)数据集,其中ogbn-arxiv和ogbn-papers100M是引文网络(Citation Network)。
进一步,在实验中,由于GPU显存和算力的限制,大型数据集ogbn-papers100M暂时还跑不了,所以实验主要用了ogbn-arxiv和ogbn-products这两个数据集。
官方使用「baseline」对OGB数据集进行了实验。这几个baseline比较有代表性,这里需要提一下。
可以发现,GNN模型主要分为2种——full-batch和minibatch。full-batch可以跑一些小型数据集(11GB显存能放下),但是中型和大型数据集就必须使用minibatch(划分+采样–>子图)了,否则GPU显存装不下。model的隐藏层维数为256,使用2-3层图卷积层,dropout为0.5。
ogbn-products是一个无向无权图,它来自亚马逊商品的联合采购网络,是中型数据集。节点代表商品,边代表联合采购。节点特征X为商品描述的降维词袋向量。
主要是预测商品的类别,这是一个47分类问题。
数据集按照「销售排名」进行划分。排名前8%的用来train,再往后2%是valid,剩下的用来test(8/2/90),这样划分更贴近真实世界。
注意,full-batch需要至少33GB的GPU显存!
从实验结果中可以看出,train和test之前的泛化差异还是很大的,从9x直接到7x了。这个其实是因为数据集划分导致的。这种现实的划分方式和之前的随机划分不同,现实划分会导致不同的节点分布,对模型来说更有挑战性。
minibatch的效果要比full-batch好,这可能是因为minibatch在采样的过程中其实是在进行正则化的操作——噪声和丢弃边。如何进行sample才能得到最好的正则化效果?以及对于需要大感知域的模型应该如何去sample?这些都是需要去研究的问题。
ogbn-arxiv是一个有向的引文网络,是MAG的一个子集,也是一个小型数据集。节点代表论文,边代表引用关系。节点特征是一个128维的向量,由单词嵌入表示的平均值组成,每个单词的embedding使用word2vec模型生成。
主要是预测论文的类别,是一个40分类问题。
数据集是根据「发表日期」进行划分的。2017年以及之前的用来train,2018年用来valid,2019用来test(54/18/28)。这也是一种比较现实的划分方式。
实验中,一般把有向的引文网络处理成无向图。和MLP相比有很大的提升,说明图结构信息是有用的。这种现实的数据集划分方式更具有挑战性,我们也可以去想想如何去利用边的方向信息和节点的时间信息。
ogbn-papers100M是一个大型的引文网络数据集,有1.11亿个节点(包括150万个arxiv论文节点),它比现有的OGB数据集还要大几个数量级!
主要是来预测arxiv论文的类别,是一个172分类问题。
数据集是根据「发表日期」进行划分的。对于Arxiv论文的节点,2017年以及之前的用来train,2018年用来valid,2019用来test(78/8/14)。
在实验中,由于这个数据集过于庞大,大多数GNN模型都跑不了。baseline只跑了MLP和SGC(简化版的GCN),并且SGC需要100GB的显存来存储节点嵌入表示。。
此外,准确率也不高,说明SGC严重的欠拟合,我们需要去想办法将更先进的GNN模型扩展到Web规模的图上面,以提高表达能力。
这一部分是关于OGB代码库及其使用方法的介绍,我觉得有必要单独出一期来实践一下,这里就先简单提一下吧。
实验当中,一定要把握住之前的标准化流程,包括数据加载、模型评估等等。OBG是支持PyG和DGL的,所以调包侠们可以很轻松的一行代码就得到dataset对象。
主要是负责数据集的下载、处理(包括数据集的划分)、存储以及返回dataset对象,一条龙服务,不需要自己手工处理。在处理当中会进行数据集的标准划分,一般来说也不用特意去管他,默认就好。之后就可以按照PyG的套路去训练模型了。
在训练结束之后,我们不需要手工计算准确率之类的,只需要调用具体数据集所适配的evaluatior,传入固定格式的参数(一般是传入一个字典dict,y_true和y_pred的信息),就可以得到模型的表达能力了,也是十分方便。
关于OGB数据集的介绍就到这了。
今天是大年三十,提前祝大家新年快乐!