写点什么

PGL 图学习之图神经网络 ERNIESage、UniMP 进阶模型 [系列八]

作者:汀丶
  • 2022-11-26
    浙江
  • 本文字数:18143 字

    阅读完需:约 60 分钟

PGL 图学习之图神经网络 ERNIESage、UniMP 进阶模型[系列八]

原项目链接:fork 一下即可:https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType=1


相关项目参考:(其余图神经网络相关项目见主页)


关于图计算 &图学习的基础知识概览:前置知识点学习(PGL)[系列一] https://aistudio.baidu.com/aistudio/projectdetail/4982973?contributionType=1


图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二):https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1


图学习【参考资料 1】词向量 word2vec https://aistudio.baidu.com/aistudio/projectdetail/5009409?contributionType=1


图学习【参考资料 2】-知识补充与 node2vec 代码注解 https://aistudio.baidu.com/aistudio/projectdetail/5012408?contributionType=1

1.Open Graph Benchmark(OGB)

1.1 OGB 概述

如何进一步推进图学习的研究呢?从历史上看,高质量和大规模的数据集在推进研究中发挥了重要的作用,例如计算机视觉领域的 IMAGENET、MS COCO,自然语言处理领域的 GLUE BENCHMARK、SQUAD,语言处理领域的 LIBRISPEECH、CHIME 等。但是,当前在图学习研究中常用的数据集和评估程序可能会对未来的发展产生负面影响。


当前基准数据集存在的问题:


与实际应用中的图相比,大多数常用数据集都非常小。例如广泛使用的 Cora、Citeseer、Pubmed 数据集,在节点分类任务中只用 2700 至 20000 个节点。由于在这些小型数据集上广泛开发了模型,因此大多数模型都无法扩展到较大的图;其次,较小的数据集很难去严格地评估需要大量数据的模型,例如图神经网络(GNNs)。没有统一且通常遵循的实验协议。不同的研究采用自己的数据集划分、评估指标和交叉验证协议,因此比较各种研究报告的成绩具有挑战性。另外,许多研究使用随机分割来生成 train /test sets,这对于真实世界的应用是不现实的或无用的,并且通常导致过于乐观的性能结果。因此,迫切需要一套完整的现实世界基准测试套件,该套件将来自不同领域的各种大小的数据集组合在一起。数据拆分以及评估指标很重要,因此可以以一致且可重复的方式衡量进度。最后,基准测试还需要提供不同类型的任务,例如节点分类,链接预测和图分类。OGB 就这样应运而生。


开放图谱基准 (OGB) 是图机器学习的基准数据集、数据加载器和评估器的集合。数据集涵盖各种图形机器学习任务和实际应用。OGB 旨在提供涵盖重要图机器学习任务、多样化数据集规模和丰富领域的图数据集。


论文链接:https://arxiv.org/abs/2005.00687OGB官网:https://ogb.stanford.edu/GitHub地址:https://github.com/snap-stanford/ogb



  • Graph ML Tasks: 涵盖了三个基本的图机器学习任务:节点属性预测,链接属性预测,图属性预测。

  • Diverse scale: 小型图形数据集可以在单个 GPU 中处理,而中型和大型图形可能需要多个 GPU 或巧妙的采样/分区技术。分为 small、medium、large 三个规模,具体为 small:超过 10 万个节点和超过 100 万条边;medium:超过 100 万个节点或超过 1000 万条边;large:大约 1 亿个节点或 10 亿条边。

  • Rich domains: 图数据集来自从科学领域到社会/信息网络的不同领域,还包括异构知识图谱。nature:包含生物网络和分子图;society:包含学术图和电子商务网络;information:包含知识图谱等。


看一下 OGB 现在包含的数据集和数据集的统计明细:



1.2 OGB 数据集简介

1.2.1 OGB 节点属性预测

ogbn-products:亚马逊产品共同购买网络。


  • 节点代表在 Amazon 销售的产品,两个产品之间的边表示产品是一起购买的。节点特征是通过从产品描述中提取词袋特征来生成的,然后进行主成分分析将维度减小到 100。

  • 预测任务:在多类别分类设置中预测产品的类别,其中有 47 个顶级类别用于目标标签。

  • 数据集划分:使用销售排名(受欢迎程度)将节点划分为训练/验证/测试集,根据产品的销售排名对产品进行排序,并使用前 10%作为训练集,然后使用前 2%作为验证集,其余用于测试集。


ogbn-proteins:蛋白质关联网络


  • 节点代表蛋白质,边表示蛋白质之间不同类型的有生物学意义的联系。所有的边都具有 8 维特征,其中每个维度表示单个关联类型的强度,值在 0 到 1 之间。这些蛋白质来自 8 个物种。

  • 预测任务:在一个多标签二元分类系统中预测蛋白质功能的存在,该系统中总共有 112 种标签需要预测。通过 112 个任务的 ROC-AUC 分数的平均值来衡量性能。

  • 数据集分割:根据蛋白质来源的物种,将蛋白质节点分成训练/验证/测试集。


实验中为了简单起见,使用传入边的平均边缘特征作为节点特征。


ogbn-arxiv:论文引用网络


  • 每个节点都是一篇 Arxiv 论文,每条有向边表示一篇论文引用了另一篇论文。每篇论文都有一个 128 维的特征向量,它是通过对标题和摘要中单词的嵌入进行平均得到的。

  • 预测任务:预测 Arxiv 论文的主要类别,这是一个 40 类的分类问题。

  • 数据集分割:考虑一个基于论文发表日期的现实数据分割。建议将 2017 年及以前发表的论文作为训练集,将 2018 年发表的论文作为验证集,将 2019 年以后发表的论文作为测试集。


实验中为了简单起见,将有向图转换为无向图。从下面的结果可以看出,探索如何考虑边缘方向信息以及节点时间信息(例如论文发表的年份)以提高预测性能将是富有成效的。


ogbn-papers100M:论文引用网络


  • MAG(Microsoft Academic Graph)索引的 1.11 亿篇论文的有向引文图。此数据集的数量级比任何现有的节点分类数据集大。

  • 预测任务:预测在 Arxiv 中发表的论文的子集的主题领域。有 172 个 Arxiv 主题领域,这使预测任务成为 172 类分类问题。

  • 数据集分割:考虑一个基于论文发表日期的现实数据分割。建议将 2017 年及以前发表的论文作为训练集,将 2018 年发表的论文作为验证集,将 2019 年以后发表的论文作为测试集。


实验中为了简单起见,将有向图转换为无向图。从下面的结果可以看出,SGC 严重拟合不足,表明使用更具表现力的 GNNs 可能会同时改善训练和测试准确性。


ogbn-mag:异构微软学术图(MAG)


  • 由 Microsoft Academic Graph (MAG)的一个子集组成的异构网络。它包含四种类型的实体(论文、作者、机构和研究领域),以及连接两种类型实体的四种有向关系。每一篇论文具有 128 维的特征。

  • 预测任务:根据给定的内容、参考文献、作者和作者的隶属关系来预测每篇论文的会议地点。ogbn-mag 中共有 349 个不同的会议地点,这使得该任务成为 349 类分类问题。

  • 数据集分割:遵循相同的基于时间的策略。用 2018 年之前发表的所有论文的训练模型,并用 2018 年和 2019 年以后发表的论文分别验证和测试模型。


对于 GCN 和 GRAPHSAGE,实验中在同构子图上应用模型。从下面的结果可以看出吗,利用图的异构性质对于在这个数据集上取得良好的性能是至关重要的。

1.2.2 OGB 链接属性预测

ogbl-ppa:蛋白质关联网络


  • 节点表示来自 58 个不同物种的蛋白质,边表示蛋白质之间的生物学上有意义的关联。每个节点都包含一个 58 维的 one-hot 特征向量,该向量指示相应蛋白质所来自的物种。

  • 预测任务:在给定训练边的情况下预测新的关联边。评估基于模型对 positive 测试边胜过 negative 测试边的等级。具体来说,针对 3,000,000 个随机采样的 negative 边对验证/测试集中的每个 positive 边进行排名,并计算排名在第 K 位或更高(Hits@K)的 positive 边的比率。发现 K=100 是评估模型性能的一个很好的阈值。

  • 数据集分割:根据边的生物学吞吐量分为训练/验证/测试边。


实验结果如下所示,GNN 训练效果不佳表明,仅靠 GNN 无法捕获的位置信息对于适应训练边并获得有意义的节点嵌入可能至关重要。


ogbl-collab:作者合作网络


  • 每个节点代表一个作者,边表示作者之间的合作。 所有节点都具有 128 维特征,这些特征是通过平均作者发表的论文的词嵌入获得的。所有边都与两种类型的元信息相关联:年份和边缘权重,代表当年发表的合作论文的数量。

  • 预测任务:根据给定的过去合作来预测未来的作者合作关系。评估指标类似于 ogbl-ppa,希望该模型将真实协作的等级高于虚假协作。 具体来说,在 100,000 个随机采样的 negative 协作中对每个真实协作进行排名,并计算排名在 K 位或更高(Hits@K)的 positive 边的比率。在初步实验中,发现 K=50 是一个很好的阈值。

  • 数据集分割:根据时间拆分数据,以便在协作推荐中模拟实际应用。具体来说,将直到 2017 年的合作作为训练边,将 2018 年的合作作为验证边,并将 2019 年的合作作为测试边。


实验结果如下图,值得注意的是,MATRIXFACTORIZATION 可以达到近乎完美的训练结果,但是即使应用大量的正则化处理,也无法将良好的结果转移到验证和测试拆分中。总体而言,探索将位置信息注入 GNN 并开发更好的正则化方法是富有成果的。


ogbl-ddi:药品交互网络


  • 节点代表 FDA 批准的或实验药物,边代表药物之间的相互作用,并且可以解释为一种现象,其中将两种药物合用的联合效果与预期的药物彼此独立起作用的效果有很大不同。

  • 预测任务:在已知药物相互作用的基础上预测药物相互作用。评估指标与 ogbl-collab 相似,希望该模型将真实药物相互作用的排名高于非相互作用药物对。具体来说,在大约 100,000 个随机采样的 negative 药物相互作用中对每个真实药物相互作用进行排名,并计算在 K 位或更高(Hits@K)处排名的 positive 边缘的比率。在初步实验中,发现 K = 20 是一个很好的阈值。

  • 数据集分割:开发了一种蛋白质-靶标拆分,这意味着根据那些药物在体内靶向的蛋白质来拆分药物边缘。


实验结果如下所示,有趣的是,GNN 模型和 MATRIXFACTORIZATION 方法都比 NODE2 VEC 获得了明显更高的训练结果。但是,只有 GNN 模型才能在某种程度上将这种性能传递给测试集,这表明关系信息对于使模型推广到看不见的交互作用至关重要。


ogbl-citation:论文引用网络


  • 从 MAG 提取的论文子集之间的引文网络,与 ogbn-arxiv 相似,每个节点都是具有 128 维 WORD2VEC 特征的论文,该论文总结了其标题和摘要,并且每个有向边都表示一篇论文引用了另一篇论文。所有节点还带有表示相应论文发表年份的元信息。

  • 预测任务:根据给定的现有引用来预测缺少的引用。具体来说,对于每篇原始论文,将随机删除其两个参考文献,并且希望模型将缺失的两个参考文献的排名高于 1,000 个 negative 参考候选集。negetive 引用是从源论文未引用的所有先前论文中随机抽取的。评估指标是 Mean Reciprocal Rank(MRR),其中针对每份原始论文计算真实参考文献在 negative 候选者中的互惠等级,然后取所有原始论文的平均值。

  • 数据集分割:为了模拟引文推荐中的实际应用,会根据时间划分边缘(例如,用户正在撰写一篇新论文,并且已经引用了几篇现有论文,但希望被推荐为其他参考)。为此,使用最新论文(2019 年发表)作为要推荐参考文献的原始论文。对于每篇原始论文,从参考文献中删除两篇——所得到的两个下降边(从原始论文指向删除的论文)指向分别用于验证和测试。 其余所有边缘均用于训练。


从下面的实验结果可以看出,mini-batch 技术的性能要比 full-batch 差,这与节点分类数据集(例如 ogbn-products 和 ogbn-mag)相反,基于小批量的模型有更强的泛化性能。与用于节点预测的技术不同,这种限制为将小批处理技术应用于链接预测提出了一个独特的挑战。


ogbl-wikikg:Wikidata 知识图


  • 从 Wikidata 知识库中提取的知识图(KG)。它包含一组三元组边缘(头部、关系、尾部)其捕获了世界各实体之间的不同类型的关系。检索了 Wikidata 中的所有关系语句,并过滤掉稀有实体。该 KG 中包含了 2,500,604 个实体和 535 个关系类型。

  • 预测任务:在给定训练边缘的情况下预测新的三元组边缘。评估指标遵循 KG 中广泛使用的标准过滤指标。具体来说,通过用随机采样的 1,000 个 negative 实体(头部为 500 个,尾部为 500 个)替换其头部或尾部来破坏每个测试三元组边缘,同时确保生成的三元组不会出现在 KG 中。目标是将真实的头部(或尾部)实体排名高于 negative 实体,该排名由平均互惠排名(MRR)衡量。

  • 数据集分割:根据时间划分三元组,模拟一个现实的 KG 完成方案,该方案旨在填充在某个时间戳上不存在的缺失三元组。具体来说,在三个不同的时间戳 17(2015 年 5 月,8 月和 11 月)下载了 Wikidata,并构建了三个 KG,其中仅保留最早出现在 5 月 KG 中的实体和关系类型。使用五月 KG 中的三元组进行训练,并使用八月和 11 月 KG 中的三元组分别进行验证和测试。


实验结果如下表所示,从表的上半部分可以看到,当使用有限的嵌入维数时,COMPLEX 在四个基线中表现最佳。从表的下半部分可以看出,随着维数的增加,所有四个模型都能够在训练、验证和测试集上实现更高的 MRR。这表明使用足够大的嵌入维数在此数据集中实现良好性能的重要性。


ogbl-biokg:生物医学知识图


  • 是一个知识图(KG),使用了大量生物医学数据库中的数据创建了该图。它包含 5 种类型的实体:疾病(10,687 个节点)、蛋白质(17,499 个节点)、药物(10,533 个节点)、副作用(9,969 个节点)和蛋白质功能(45,085 个节点)。有 51 种类型的有向关系将两种类型的实体联系起来,包括 39 种药物相互作用,8 种蛋白质相互作用等 。所有关系都被建模为有向边,其中连接相同实体类型(例如蛋白质-蛋白质,药物-药物,功能-功能)的关系始终是对称的,即边是双向的。KG 中的三元组来自具有各种置信度级别的来源,包括实验读数,人工策划的注释以及自动提取的元数据。

  • 预测任务:在给定训练三元组的情况下预测新的三元组。评估协议 ogbl-wikikg 完全相同,这里只考虑针对相同类型的实体进行排名。例如,当破坏蛋白质类型的头部实体时,仅考虑 negative 蛋白质实体。

  • 数据集分割:对于此数据集,采用随机分割。虽然根据时间划分三元组是一种有吸引力的选择,但注意到,要获得有关何时进行三元组的个别实验和观察的准确信息非常困难。努力在 OGB 的未来版本中提供其他数据集拆分。


实验结果如下图所示,在这四个模型中,COMPLEX 达到了最佳的测试 MRR,而 TRANSE 与其他模型相比,性能明显差。TRANSE 的较差性能可以通过以下事实来解释:TRANSE 无法为该数据集中普遍存在的对称关系建模,例如,蛋白质-蛋白质和药物-药物关系都是对称的。总体而言,进一步提高模型性能具有重大的实践意义。 一个有前途的方向是为异构知识图开发一种更专门的方法,该方法中存在多个节点类型,并且整个图遵循预定义的架构。

1.2.3OGB 图属性预测

ogbg-mol:分子图*


  • ogbg-molhiv 和 ogbg-molpcba 是两个大小不同的分子属性预测数据集:ogbg-molhiv (small)和 ogbg-molpcba(medium)。所有分子均使用 RDKIT 进行预处理。每个图表示一个分子,其中节点表示原子,而边表示化学键。输入节点特征为 9 维,包含原子序数和手性,以及其他附加原子特征,例如形式电荷和原子是否在环中。输入边特征是 3 维的,包含键类型,键立体化学以及指示键是否共轭的附加键特征。

  • 预测任务:尽可能准确地预测目标分子特性,其中分子特性被标记为二元标记,例如分子是否抑制 HIV 病毒复制。对于 ogbg-molhiv,使用 ROC-AUC 进行评估。 对于 ogbg-molpcba,由于类平衡严重偏斜(仅 1.4%的数据为 positive),并且数据集包含多个分类任务,因此将任务平均后的精确召回曲线(PRC)-AUC 作为评估指标。

  • 数据集分割:采用支架分割程序,该程序根据分子的二维结构框架风格分子。支架分割试图将结构上不同的分子分为不同的子集,这在预期的实验环境中提供了对模型性能的更现实的估计。总体而言,OGB 与它们的数据加载器一起提供了有意义的数据拆分和改进的分子功能,从而使对 MOLECULENET 数据集的评估和比较更加容易和标准化。


实验结果如下图所示,可以看到具有附加功能的 GIN 和虚拟节点在两个数据集中提供了最佳性能。


ogbg-ppa:蛋白质关联网络


  • 从 1,581 个不同物种的蛋白质关联网络中提取的一组无向蛋白质关联邻域,涵盖了 37 个广泛的生物分类群。从每种物种中随机选择了 100 种蛋白质,并以每个选定的蛋白质为中心构建了 2-hop 蛋白质关联邻域。然后,从每个邻域中删除中心节点,并对邻域进行二次采样,以确保最终的蛋白质关联图足够小(少于 300 个节点)。每个蛋白质关联图中的节点表示蛋白质,边表示蛋白质之间的生物学上有意义的关联。边与 7 维特征相关,其中每个元素取 0 到 1 之间的值,并代表特定类型的蛋白质关联的强度。

  • 预测任务:给定一个蛋白质关联邻域图,该任务是一个 37-way 多分类,以预测该图源自哪个分类组。

  • 数据集分割:与 ogbn-proteins 类似,采用物种分割方法,其中验证和测试集中的邻域图是从在训练过程中未发现但属于 37 个分类组之一的物种蛋白质关联网络中提取的。


实验结果如下表,类似于 ogbg-mol *数据集,带有 VIRTUAL NODE 的 GIN 提供了最佳性能。尽管如此,泛化差距仍然很大(将近 30 个百分点)。


ogbg-code:源代码的抽象语法树


  • 从大约 45 万个 Python 方法定义中获得的抽象语法树(AST)的集合。方法是从 GITHUB 上最受欢迎的项目的总共 13,587 个不同的存储库中提取的。Python 方法集合来自 GITHUB Code Search-Net,它是用于基于机器学习的代码检索的数据集和基准的集合。

  • 预测任务:给定 AST 表示的 Python 方法主体及其节点特征,任务是预测组成方法名称的子标记——节点类型(来自 97 种类型的池)、节点属性(例如变量名,词汇量为 10002),AST 中的深度、预遍历索引

  • 数据集分割:采用项目分割,其中训练集的 AST 是从 GITHUB 项目中获得的,这些项目未出现在验证和测试集中。这种划分尊重实际情况,即在大量源代码上训练模型,然后将其用于在单独的代码库上预测方法名称。

1.3 OGB Package

OGB Package 包旨在通过自动化数据加载和评估部分,使研究人员易于访问 OGB 管道。OGB 与 Pytorch 及其关联的图形库完全兼容:PyG 和 DGL。OGB 还提供了与库无关的数据集对象,可用于任何其他 Python 深度学习框架(如 Tensorflow 和 Mxnet)。下面,将解释数据加载和评估。为简单起见,专注于使用 PyG 进行图属性预测的任务。有关其他任务详见官网。


OGB 数据加载器:OGB Package 使获取与 PyG 完全兼容的数据集对象变得容易仅用一行代码即可完成操作,最终用户只需指定数据集的名称即可。然后,OGB Package 将下载、处理、存储并返回所请求的数据集对象。此外,可以从数据集对象中轻松获得标准化的数据集分割。


OGB 评估器:OGB 还可以通过 ogb.*.Evaluator 类实现标准化和可靠的评估。如下面的代买所示,最终用户首先指定他们要评估其模型的数据集,然后用户可以了解需要传递给 Evaluator 对象的输入格式。输入格式取决于数据集,例如,对于 ogbg-molpcba 数据集,Evaluator 对象需要输入一个字典,其中包含 y_true(存储真实二进制标签的矩阵)和 y_pred(存储模型输出的分数的矩阵)。最终用户通过指定的词典作为输入后,评估程序对象将返回适合手头数据集的模型性能,例如 ogbg-molpcba 的 PRC-AUC。

2.ERNIESage (邻居聚合)

2.1 模型概述

ERNIE-Sage 是 ERNIE SAmple aggreGatE 的简称,该模型可以同时建模文本语义与图结构信息,有效提升 Text Graph 的应用效果。


论文链接:https://aclanthology.org/2020.textgraphs-1.11/论文介绍了百度 PGL 团队设计的系统,该系统在 TextGraphs 2020 共享任务中获得第一名。 该任务的重点是为基础科学问题提供解释。 给定一个问题及其相应的正确答案,被要求从大型知识库中选择可以解释为什么该问题和回答 (QA) 的答案是正确的事实。 为了解决这个问题,PGL 团队使用预训练的语言模型来回忆每个问题的前 K 个相关解释。 然后,他们采用基于预训练语言模型的重新排序方法对候选解释进行排序。 为了进一步提高排名,还开发了一种由强大的预训练变压器和 GNN 组成的架构,以解决多跳推理问题。

2.2 原理介绍

在很多工业应用中,往往出现如下图所示的一种特殊的图:Text Graph。顾名思义,图的节点属性由文本构成,而边的构建提供了结构信息。如搜索场景下的 Text Graph,节点可由搜索词、网页标题、网页正文来表达,用户反馈和超链信息则可构成边关系。



ERNIE-Sage 是 ERNIE 与 GraphSAGE 碰撞的结果,是 ERNIE SAmple aggreGatE 的简称,它的结构如下图所示,主要思想是通过 ERNIE 作为聚合函数(Aggregators),建模自身节点和邻居节点的语义与结构关系。ERNIE-Sage 对于文本的建模是构建在邻居聚合的阶段,中心节点文本会与所有邻居节点文本进行拼接;然后通过预训练的 ERNIE 模型进行消息汇聚,捕捉中心节点以及邻居节点之间的相互关系;最后使用 ERNIESage 搭配独特的邻居互相看不见的 Attention Mask 和独立的 Position Embedding 体系,就可以轻松构建 TextGraph 中句子之间以及词之间的关系。



使用 ID 特征的 GraphSAGE 只能够建模图的结构信息,而单独的 ERNIE 只能处理文本信息。通过 PGL 搭建的图与文本的桥梁,ERNIESage 能够很简单的把 GraphSAGE 以及 ERNIE 的优点结合一起。以下面 TextGraph 的场景,ERNIESage 的效果能够比单独的 ERNIE 以及 GraphSAGE 模型都要好。



ERNIE-Sage 可以很轻松地在 PGL 中的消息传递范式中进行实现,目前提供了 4 个版本的 ERNIESage 模型:


  • ERNIE-Sage v1: ERNIE 作用于 text graph 节点上;

  • ERNIE-Sage v2: ERNIE 作用在 text graph 的边上;

  • ERNIE-Sage v3: ERNIE 作用于一阶邻居及起边上;

  • ERNIE-Sage v4: ERNIE 作用于 N 阶邻居及边上;



模型效果


TextGraph 2020 效果当时的 SOTA



应用场景


文本匹配、Query 推荐等


2.3 如何对 Text Graph 进行建模

上个项目讲到的 GraphSage 只关注结构信息,无法完成语义理解,而 NLP 对应的预训练模型却反之,这时候 ErnieSage 就能很好实现两者达到图语义理解


简单提一下 Ernie 1.0 核心是知识增强,通过词级别的 Masked Language Model(MLM)任务以及持续学习思想取得优异性能


Transformer 基础结构


transformer 好比全连通图,图节点类比 token 外加了自注意机制。



持续学习效果



将 ERNIE 作用于 Graph 的各大元素:


  1. ERNIESage V1 模型核心流程---ERNIE 作用于 Text Graph 的 Node(节点) 上


  • ERNIE 提取节点语义 -> GNN 聚合


<img src="https://ai-studio-static-online.cdn.bcebos.com/0ab25a4f0c1647acbcfacc1be2066d47e98ec4f1931d4dcebd209347dc1b5448" alt="图片替换文本" width="300" height="313" align="bottom" />



  • 利用 ERNIE 获得节点表示

  • 聚合邻居特征,进行消息传递

  • 将当前节点和聚合后的邻居特征进行 concat,更新节点特征


  1. ERNIESage V2 核心代码---------ERNIE 聚合 Text Graph 的 Edge(边) 上信息


  • GNN send 文本 id -> ERNIE 提取边语义 -> GNN recv 聚合邻居语义 -> ERNIE 提取中心节点语义并 concat


<img src="https://ai-studio-static-online.cdn.bcebos.com/24d5cca257624cc6bb94eeea7a7c3f84512534070c5949a5a9aca8fc8455f52e" alt="图片替换文本" width="500" height="313" align="bottom" />


为了使得大家对下面有关 ERNIE 模型的部分能够有所了解,这里先贴出 ERNIE 的主模型框架图。




  • 利用 ERNIE 获取中心节点的文本特征表示

  • 特征交互:中心节点和邻居节点一同作为 ERNIE 输入,计算交互特征

  • 聚合邻居特征

  • 将当前节点和聚合后的邻居特征 concat,更新节点特征


ERNIESage Node 与 ERNIESage Edge 对比


大部分单塔模型优于双塔模型因为含有特征交互信息更充分,做链接预测问题思路:将两个节点进行內积得到一个值,和阈值对比假设大于 0.5 则边存在



  1. ERNIESage V3 核心过程--------ERNIE 聚合节点的 1 Neighbor( 一阶邻居) 信息


  • GNN send 文本 id 序列 -> GNN recv 拼接文本 id 序列 -> ERNIE 同时提取中心和多个邻居语义表达



将中心节点的文本与所有一阶邻居节点文本进行单塔拼接,再利用 ERNIE 做消息聚合;这样就会遇到:


  1. 如何确保在输入时邻居不带有顺序?

  2. 如果邻居数量过多,如何建模?


解决方案如下:针对问题一采用独立位置编码,邻居节点编码相同不受顺序影响;针对问题提二:进行邻居采样


2.4 基于 PGL 算法实现

PGL&paddle 2.x+版本

ErnieSage 可以很轻松地在基于 PaddleNLP 构建基于 Ernie 的图神经网络,目前 PaddleNLP 提供了 V2 版本的 ErnieSage 模型:


ErnieSage V2: ERNIE 作用在 text graph 的边上;


核心部分包含:


  • 数据集部分


  1. example_data - 简单的输入文件,格式为每行 query \t answer,可作简单的运行实例使用。


  • 模型文件和配置部分


  1. ernie_config.json - ERNIE 模型的配置文件。

  2. vocab.txt - ERNIE 模型所使用的词表。

  3. ernie_base_ckpt/ - ERNIE 模型参数。

  4. config/ - ERNIESage 模型的配置文件


  • 代码部分


  1. local_run.sh - 入口文件,通过该入口可完成预处理、训练、infer 三个步骤。

  2. preprocessing 文件夹 - 包含 dump_graph.py,在预处理部分,首先需要进行建图,将输入的文件构建成一张图。由于所研究的是 Text Graph,因此节点都是文本,将文本表示为该节点对应的 node feature(节点特征),处理文本的时候需要进行切字,再映射为对应的 token id。

  3. dataset/ - 该文件夹包含了数据 ready 的代码,以便于在训练的时候将训练数据以 batch 的方式读入。

  4. models/ - 包含了 ERNIESage 模型核心代码。

  5. train.py - 模型训练入口文件。

  6. learner.py - 分布式训练代码,通过 train.py 调用。

  7. infer.py - infer 代码,用于 infer 出节点对应的 embedding。


  • 评价部分


  1. build_dev.py - 用于将的验证集修改为需要的格式。

  2. mrr.py - 计算 MRR 值。部分结果展示:


[2022-11-23 14:18:01,252] [    INFO] - global step 890, epoch: 27, batch: 25, loss: 0.005078, speed: 1.70 step/s[2022-11-23 14:18:06,836] [    INFO] - global step 900, epoch: 28, batch: 3, loss: 0.004688, speed: 1.79 step/s[2022-11-23 14:18:12,588] [    INFO] - global step 910, epoch: 28, batch: 13, loss: 0.004492, speed: 1.74 step/s[2022-11-23 14:18:18,633] [    INFO] - global step 920, epoch: 28, batch: 23, loss: 0.005273, speed: 1.65 step/s[2022-11-23 14:18:24,022] [    INFO] - global step 930, epoch: 29, batch: 1, loss: 0.004687, speed: 1.86 step/s[2022-11-23 14:18:29,897] [    INFO] - global step 940, epoch: 29, batch: 11, loss: 0.004492, speed: 1.70 step/s[2022-11-23 14:18:35,727] [    INFO] - global step 950, epoch: 29, batch: 21, loss: 0.007814, speed: 1.72 step/s[2022-11-23 14:18:41,339] [    INFO] - global step 960, epoch: 29, batch: 31, loss: 0.012500, speed: 1.78 step/sINFO 2022-11-23 14:18:47,170 launch.py:402] Local processes completed.INFO 2022-11-23 14:18:47,170 launch.py:402] Local processes completed.
复制代码


运行完毕后,会产生较多的文件,这里进行简单的解释。


  1. graph_workdir/ - 这个文件夹主要会存储和图相关的数据信息。

  2. output/ - 主要的输出文件夹,包含了以下内容:


  • (1)模型文件,根据 config 文件中的 save_per_step 可调整保存模型的频率,如果设置得比较大则可能训练过程中不会保存模型;

  • (2)last 文件夹,保存了停止训练时的模型参数,在 infer 阶段会使用这部分模型参数;

  • (3)part-0 文件,infer 之后的输入文件中所有节点的 Embedding 输出。


预测结果见/output part-0,部分结果展示:


1  干部走读之所以成为“千夫所指”,是因为这种行为增加了行政成本。  0.08133 -0.18362 0.00346 -0.01038 -0.05656 -0.05691 -0.09882 0.12029 0.05317 -0.02939 -0.14508 -0.07692 -0.02769 -0.04896 0.09963 -0.14497 -0.13574 0.02424 0.10587 -0.07323 -0.06388 0.01103 0.00944 -0.07593 -0.00731 -0.11897 0.11635 -0.05529 0.04156 0.01942 -0.07949 -0.02761 0.00033 -0.06539 0.05739 0.02487 0.03389 0.18369 0.05038 -0.02183 0.02685 0.09735 -0.13134 0.01999 -0.04034 -0.03441 0.07738 0.14992 0.06287 -0.20294 -0.05325 0.07003 0.02595 0.01826 0.12306 0.06234 -0.11179 -0.09813 0.14834 -0.16425 0.13985 0.06430 0.01662 -0.01184 0.02659 0.13431 0.05327 -0.07269 0.06539 -0.12416 -0.03247 0.12320 -0.06268 -0.06711 -0.01775 -0.02475 0.12867 0.05980 0.09311 0.11515 -0.06987 0.07372 0.09891 -0.10539 -0.03451 0.02539 -0.05701 -0.06300 0.03582 0.13427 -0.07082 -0.01588 -0.10033 0.04229 -0.02681 0.22213 0.00073 0.00075 -0.16839 0.12594 0.00807 -0.00040 -0.07686 0.08944 -0.04361 -0.13446 -0.15051 -0.08336 0.13476 -0.07999 0.00719 0.04443 -0.21426 -0.02944 0.04165 0.14448 -0.07233 -0.07226 -0.01737 -0.05904 -0.08729 0.01087 0.11581 -0.00041 -0.04341 0.01526 -0.01272 -0.150891  承担县人大常委会同市人大常委会及乡镇人大的工作联系。  0.06494 -0.25502 -0.00777 -0.02933 -0.03097 -0.08472 -0.15055 0.03232 0.04819 -0.03571 -0.18642 0.01614 0.07226 0.04660 0.06138 -0.14811 -0.01807 -0.00931 0.11350 0.04235 -0.14285 0.08077 0.10746 -0.03673 -0.12217 -0.05147 0.15980 -0.02051 -0.08356 0.00127 0.02313 0.14206 0.02116 -0.02332 -0.02032 0.03704 0.04234 0.05832 -0.03426 -0.02491 0.07948 0.11802 0.10158 -0.06468 -0.11558 0.00161 0.02030 0.06531 -0.04109 -0.13033 -0.04947 0.10836 -0.06057 0.01797 0.00183 0.18616 -0.13693 -0.17120 0.02910 0.01781 0.24061 -0.03953 0.10843 0.05329 -0.08753 -0.09504 0.05383 -0.11522 0.05172 -0.02633 0.06554 0.18186 -0.03937 -0.09151 -0.01045 -0.01857 0.10766 0.04191 0.10127 -0.00513 -0.02739 -0.10974 0.07810 -0.17015 -0.07228 -0.05809 -0.08627 -0.02947 -0.01907 0.12695 -0.09196 0.03067 -0.09462 0.15618 -0.05241 0.17382 -0.06615 0.02156 0.07060 0.09616 -0.02560 0.01197 -0.00582 -0.06037 -0.11539 -0.11853 -0.16872 0.00075 0.13284 0.02941 -0.01361 -0.01200 -0.12901 0.06944 -0.03066 0.09824 -0.01635 0.04351 -0.08985 0.08947 0.00923 -0.02436 0.10783 0.00891 0.10256 0.01953 -0.06292 -0.04989
复制代码


# 接下来,计算MRR得分。# 注意,运行此代码的前提是,已经将config对应的yaml配置文件中的input_data参数修改为了:"train_data.txt"# 并且注意训练的模型是针对train_data.txt的,如果不符合,请重新训练模型。!python mrr.py --emb_path output/part-0
# 由于仅是为了提供一个可运行的实例,计算出来的MRR值可能比较小,需要的同学可以自己更换数据集来测试更多的结果。1021it [00:00, 19102.78it/s]46it [00:00, 68031.73it/s]100%|█████████████████████████████████████████| 46/46 [00:00<00:00, 2397.52it/s]MRR 0.22548099768841945
复制代码

PGL&paddle 1.x+版本

提供多版本供大家学习复现,含核心模型代码讲解


项目链接:


https://aistudio.baidu.com/aistudio/projectdetail/5097085

3.UniMP(标签迁移)

UniMP:融合标签传递和图神经网络的统一模型


论文名:Masked Label Prediction:用于半监督分类的统一消息传递模型


论文链接:https://arxiv.org/abs/2009.03509


图神经网络(GNN)和标签传播算法(LPA)都是消息传递算法,在半监督分类中取得了优越的性能。GNN 通过神经网络执行特征传播来进行预测,而 LPA 使用跨图邻接矩阵的标签传播来获得结果。然而,目前还没有有效的方法将这两种算法直接结合起来。为了解决这个问题,提出了一种新颖的统一消息传递模型 (UniMP),它可以在训练和推理时结合特征和标签传播。首先,UniMP 采用 Graph Transformer 网络,将 feature embedding 和 label embedding 作为输入信息进行传播。其次,为了在自循环输入标签信息中不过度拟合地训练网络,UniMP 引入了一种屏蔽标签预测策略,其中一定比例的输入标签信息被随机屏蔽,然后进行预测。UniMP 在概念上统一了特征传播和标签传播,并且在经验上是强大的。它在 Open Graph Benchmark (OGB) 中获得了新的最先进的半监督分类结果。


此外,提出 UniMP_large 通过增加来扩展基本模型的宽度,并通过合并 APPNPhead_num 使其更深。此外,他们首先提出了一种新的基于注意力的 APPNP 来进一步提高模型的性能。


APPNP:Predict then Propagate: Graph Neural Networks meet Personalized PageRank https://arxiv.org/abs/1810.05997


用于图形半监督分类的神经消息传递算法最近取得了巨大成功。然而,为了对节点进行分类,这些方法仅考虑距离传播几步之遥的节点,并且这个使用的邻域的大小很难扩展。在本文中,利用图卷积网络 (GCN) 与 PageRank 之间的关系,推导出一种基于个性化 PageRank 的改进传播方案。利用这种传播过程来构建一个简单的模型、神经预测的个性化传播 (PPNP) 及其快速近似 APPNP。模型的训练时间与以前的模型相同或更快,其参数数量与以前的模型相同或更少。它利用一个大的、可调整的邻域进行分类,并且可以很容易地与任何神经网络相结合。表明,在迄今为止对类 GCN 模型所做的最彻底的研究中,该模型优于最近提出的几种半监督分类方法。的实施可在线获得。
复制代码

3.1 背景介绍



在半监督图节点分类场景下,节点之间通过边相连接,部分节点被打上标签。任务要求模型通过监督学习的方式,拟合被标注节点数据,并对未标注的节点进行预测。如下图所示,在一般机器学习的问题上,已标注的训练数据在新数据的推断上,并不能发挥直接的作用,因为数据的输入是独立的。然而在图神经网络的场景下,已有的标注数据可以从节点与节点的连接中,根据图结构关系推广到新的未标注数据中。


一般应用于半监督节点分类的算法分为图神经网络和标签传递算法两类,它们都是通过消息传递的方式(前者传递特征、后者传递标签)进行节点标签的学习和预测。其中经典标签传递算法如 LPA,只考虑了将标签在图上进行传递,而图神经网络算法大多也只是使用了节点特征以及图的链接信息进行分类。但是单纯考虑标签传递或者节点特征都是不足够的。


百度 PGL 团队提出的统一消息传递模型 UniMP,将上述两种消息统一到框架中,同时实现了节点的特征与标签传递,显著提升了模型的泛化效果。UniMP 以 Graph Transformer 模型作为基础骨架,联合使用标签嵌入方法,将节点特征和部分节点标签同时输入至模型中,从而实现了节点特征和标签的同时传递。


简单的加入标签信息会带来标签泄漏的问题,即标签信息即是特征又是训练目标。实际上,标签大部分是有顺序的,例如在引用网络中,论文是按照时间先后顺序出现的,其标签也应该有一定的先后顺序。在无法得知训练集标签顺序的情况下,UniMP 提出了标签掩码学习方法。UniMP 每一次随机将一定量的节点标签掩码为未知,用部分已有的标注信息、图结构信息以及节点特征来还原训练数据的标签。最终,UniMP 在 OGB 上取得 SOTA 效果,并在论文的消融实验上,验证了方法的有效性。


通过:Masked Label Prediction 解决标签泄露问题


模型结构



论文一些数据仿真展示:【数据集情况等】





3.2 原理介绍


部分作者提出质疑也是值得探讨的:


3.3 基于码源详细阐释

3.3.1 为何引入 MaskLabel?

简单的加入标签信息会带来标签泄漏的问题,即标签信息即是特征又是训练目标。可以想象直接将标签作为网络输入,要求输出也向标签靠拢,势必会造成“1=1”的训练结果,无法用于预测。


在引用网络中,论文是按照时间先后顺序出现的,其标签也应该有一定的先后顺序。在无法得知训练集标签顺序的情况下,UniMP 提出了 MaskLabel 学习方法。每一次随机将一定量的节点标签掩码为未知,用部分已有的标注信息、图结构信息以及节点特征来还原训练数据的标签。


def label_embed_input(self, feature):  label = F.data(name="label", shape=[None, 1], dtype="int64")  label_idx = F.data(name='label_idx', shape=[None, 1], dtype="int64")  label = L.reshape(label, shape=[-1])  label_idx = L.reshape(label_idx, shape=[-1])
embed_attr = F.ParamAttr(initializer=F.initializer.NormalInitializer(loc=0.0, scale=1.0)) embed = F.embedding(input=label, size=(self.out_size, self.embed_size), param_attr=embed_attr) feature_label = L.gather(feature, label_idx, overwrite=False) feature_label = feature_label + embed feature = L.scatter(feature, label_idx, feature_label, overwrite=True) lay_norm_attr = F.ParamAttr(initializer=F.initializer.ConstantInitializer(value=1)) lay_norm_bias = F.ParamAttr(initializer=F.initializer.ConstantInitializer(value=0)) feature = L.layer_norm(feature, name='layer_norm_feature_input', param_attr=lay_norm_attr, bias_attr=lay_norm_bias) return feature
复制代码


在上面的代码中可以看到,对于已知标签的节点,首先将其 embedding 成和节点特征同样维度(这里是 100 维),然后就可以直接与节点特征相加,进而完成了标签信息与特征信息的融合,一块送入 graph_transformer 进行消息传递。


改进:这里,最核心的一句代码是 feature_label = feature_label + embed,它完成了标签和特征的融合,由此可以想到控制两者的权重,得到:


feature_label = alpha*feature_label + (1-alpha)*embed
复制代码


alpha 可以设定为固定值,也可以通过学习获得。参考 model_unimp_large.py 中的门控残差连接:


if gate:  temp_output = L.concat([skip_feature, out_feat, out_feat - skip_feature], axis=-1)  gate_f = L.sigmoid(linear(temp_output, 1, name=name + '_gate_weight', init_type='lin'))  out_feat = skip_feature * gate_f + out_feat * (1 - gate_f)else:  out_feat = skip_feature + out_feat
复制代码


可以写出:


temp = L.concat([feature_label,embed,feature_label-embed], axis=-1)alpha = L.sigmoid(linear(temp, 1, name='alpha_weight', init_type='lin'))feature_label = alpha*feature_label + (1-alpha)*embed
复制代码


当然也可以直接经过一层 FC 后再将两者相加:


feature_label = L.fc(feature_label, size=100) + L.fc(embed, size=100)
复制代码


而做这些的目的,都是为了寻找能使标签信息和特征信息融合的更好的方式。

3.3.2 Res 连接 &Dense 连接?

(1)残差网络(或称深度残差网络、深度残差学习,英文 ResNet)属于一种卷积神经网络。相较于普通的卷积神经网络,残差网络采用了跨层恒等连接,以减轻卷积神经网络的训练难度。残差网络的一种基本模块如下所示:



实现起来比较简单,这里不予赘述。


(2)DenseNet 原文:Densely Connected Convolutional Networks


相比 ResNet,DenseNet 提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。DenseNet 的网络结构如下所示:



以下代码实现了 Dense 连接:


dense=[feature]for i in range(self.num_layers - 1):  ngw = pgl.sample.edge_drop(graph_wrapper, edge_dropout)   res_feature = feature
feature, _, cks = graph_transformer(str(i), ngw, feature, hidden_size=self.hidden_size, num_heads=self.heads, concat=True, skip_feat=True, layer_norm=True, relu=True, gate=True) if dropout > 0: feature = L.dropout(feature, dropout_prob=dropout, dropout_implementation='upscale_in_train')
dense.append(feature) feature = L.fc(dense, size=self.hidden_size, name="concat_feature")
复制代码

3.3.3 注意力机制?

注意力机制就是将注意力集中于局部关键信息的机制,可以分成两步:第一,通过全局扫描,发现局部有用信息;第二,增强有用信息并抑制冗余信息。SENet 是一种非常经典的注意力机制下的深度学习方法。它可以通过一个小型的子网络,自动学习得到一组权重,对特征图的各个通道进行加权。其含义在于,某些特征通道是较为重要的,而另一些特征通道是信息冗余的;那么,我们就可以通过这种方式增强有用特征通道、削弱冗余特征通道。SENet 的一种基本模块如下所示:



值得指出的是,通过这种方式,每个样本都可以有自己独特的一组权重,可以根据样本自身的特点,进行独特的特征通道加权调整。


Unimp 中的注意力机制出现在 Graph Transformer 以及最后的输出层 attn_appnp,attn_appnp 的代码为:


def attn_appnp(gw, feature, attn, alpha=0.2, k_hop=10):  """Attention based APPNP to Make model output deeper  Args:    gw: Graph wrapper object (:code:`StaticGraphWrapper` or :code:`GraphWrapper`)    attn: Using the attntion as transition matrix for APPNP    feature: A tensor with shape (num_nodes, feature_size).    k_hop: K Steps for Propagation  Return:    A tensor with shape (num_nodes, hidden_size)  """  def send_src_copy(src_feat, dst_feat, edge_feat):    feature = src_feat["h"]    return feature
h0 = feature attn = L.reduce_mean(attn, 1) for i in range(k_hop): msg = gw.send(send_src_copy, nfeat_list=[("h", feature)]) msg = msg * attn feature = gw.recv(msg, "sum") feature = feature * (1 - alpha) + h0 * alpha return feature
复制代码


在调用函数时,其中的 alpha 为前面的 graph_transformer 学习到的参数,用于更好的融合各层特征。

3.4 基于 PGL 算法实现

3.4.1 基于斯坦福 OGB (1.2.1) 基准测试

实验基于斯坦福 OGB (1.2.1) 基准测试,


To_do list:


  • UniMP_large in Arxiv

  • UniMP_large in Products

  • UniMP_large in Proteins

  • UniMP_xxlarge


这里给出 giyhub 官网代码链接:https://github.com/PaddlePaddle/PGL/tree/main/ogb_examples/nodeproppred/unimp


因为在安装环境中需要安装 torch,在 aistudio 上尝试多次仍无法运行,下面给出代码流程和官网结果。感兴趣同学私下本地运行吧。比较吃算力!


超参数介绍:


Arxiv_dataset(Full Batch):          Products_dataset(NeighborSampler):          Proteins_dataset(Random Partition):--num_layers        3               --num_layers                3               --num_layers                7                   --hidden_size       128             --hidden_size               128             --hidden_size               64               --num_heads         2               --num_heads                 4               --num_heads                 4--dropout           0.3             --dropout                   0.3             --dropout                   0.1--lr                0.001           --lr                        0.001           --lr                        0.001--use_label_e       True            --use_label_e               True            --use_label_e               True--label_rate        0.625           --label_rate                0.625           --label_rate                0.5 --weight_decay.     0.0005
复制代码


结果展示:


OGB 的仿真性能:



改进 OGBN 蛋白质的更多技巧


评估中的随机分区大小,随机分区在训练过程中表现得像 DropEdge,发现的模型可以从这种策略中受益。,但在评估中,发现较小的分区大小可以提高分数。


# To compare 
python train.py --place 0 --use_label_e --log_file eval_partition_5 --eval_partition 5
python train.py --place 0 --use_label_e --log_file eval_partition_3 --eval_partition 3
复制代码


使用 Self-Attention 聚合 Neighbor FeatureOGBN-Proteins 中 UniMP 和其他类似 DeeperGCN 的原始代码使用平均边缘特征作为初始节点特征。采用这些模块作为可学习的聚合器。为每个节点采样大约 64 个边,并使用变换器 [3 * (Self-Attention + Residual + ReLU + LayerNorm) + Mean Pooling] 作为聚合器来获取初始化节点特征。简单地称它为 CrossEdgeFeat。你可以在 cross_edge_feat.py 最初的 ogbn-proteins 工具获得了大约 0.9175 的验证分数和 0.864 的测试分数。并且通过 CrossEdgeFeat,可以促进快速收敛并获得更高的分数。


# To compare
python train.py --place 0 --use_label_e --log_file with_cross_edge_feat --cross_edge_feat 3
python train.py --place 0 --use_label_e --log_file without_cross_edge_feat --cross_edge_feat 0
复制代码


训练曲线(验证 AUC)如下:


3.4.2 图学习之基于 PGL-UniMP 算法的论文引用网络节点分类任务[系列九]

内容过多引到下一篇项目


项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5116458?contributionType=1


fork 一下即可

4.OGB 最新榜单部分展示

这里就展示了节点预测的,更多的可以自行去官网查看获得最新模型




5.总结

通过以上两个版本的模型代码简单的讲解,可以知道他们的不同点,其实主要就是在消息传递机制的部分有所不同。ERNIESageV1 版本只作用在 text graph 的节点上,在传递消息(Send 阶段)时只考虑了邻居本身的文本信息;而 ERNIESageV2 版本则作用在了边上,在 Send 阶段同时考虑了当前节点和其邻居节点的文本信息,达到更好的交互效果。


为了实现可扩展的,健壮的和可重现的图学习研究,提出了 Open Graph Benchmark (OGB)——具有规模大、领域广、任务类别多样化的现实图数据集。在特定于应用程序的使用案例的驱动下,对给定的数据集采用了实际的数据分割方法。通过广泛的基准实验,强调 OGB 数据集对于图学习模型在现实的数据分割方案下处理大规模图并进行准确的预测提出了重大挑战。总而言之,OGB 为未来的研究提供了丰富的机会,以推动图学习的前沿。


OGB 还在不断的扩展中,相信之后会有更多数据集,也将产生更多优秀的模型,推动图学习的研究,了解和掌握相关内容还是很有必要的。


原项目链接:fork 一下即可:https://aistudio.baidu.com/aistudio/projectdetail/5096910?contributionType=1

用户头像

汀丶

关注

还未添加个人签名 2022-01-06 加入

还未添加个人简介

评论

发布
暂无评论
PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]_深度学习_汀丶_InfoQ写作社区