Graph4NLP:业内首个针对NLP场景的GNN开源软件库

导读:随着图神经 络GNN的兴起,GNN在人工智能领域中获得了广泛的应用,并获得了极大的成功。近年来GNN在NLP领域的各个任务中都取得了不错的成绩。团队总结了GNN在NLP中的各类应用场景,开发出了业内首个针对NLP场景的GNN开源软件包。核心开发团队来自于各个高校和企业,包括Pinterest、IBM Research、Meta、浙江大学、南京大学、同济大学、香港科技大学等。

今天的介绍会围绕下面五点展开:

  • Graph4NLP背景介绍
  • Graph4NLP概况
  • Graph4NLP模块解析
  • 应用案例
  • 未来规划

  • 01

    Graph4NLP背景介绍

    首先带大家简单回顾一下Graph4NLP开源软件库的发展历程。

    在2020年6月启动了Graph4NLP项目,2021年6月正式对外发布了第一个官方版本——V0.4.1(在此正式版本之前,有一些内部版本)。2021年9月上线了DLG4NLP(Deep Learning on Graphs for NLP) 站,在 站上分享了很多DLG4NLP领域的学习资料,包括survey paper,Graph4NLP库教程以及相关workshop信息。在接下来的1年时间中,陆陆续续对Graph4NLP库进行了升级迭代,提高了其使用效率、稳定性和易用程度。在即将发布的V0.6版本中,将为用户提供更加统一的配置系统,能够更好的支持multi-relational GNN、AMR图的构建等。

    感兴趣的同学可以持续关注Graph4NLP的更新动态。此外,团队将在明年推出Graph4NLP的教科书,希望大家到时能够关注支持。

    02

    Graph4NLP概况

    1. 整体架构

    下面正式介绍Graph4NLP:

    Graph4NLP是基于PyTorch和DGL的,其中PyTorch是业内广泛应用的深度学习框架,DGL是使用最广泛的图神经 络开源软件库。上图展示了Graph4NLP的整体架构,其核心包含了4个层:数据层(data layer)、模块层(module layer)、模型层(model layer)、应用层(application layer):

  • 数据层:主要提供了对最底层图数据及数据集的支持。核心包括GraphData和Dataset两个类。其中GraphData使用户能比较灵活的构建图,对图进行修改,以及基于图进行一些计算。Dataset给用户提供了一个简单统一的接口对数据集进行处理,如数据集下载、预处理等。
  • 模块层:包含图构建、图神经 络(GNN)、预测、损失函数、评估5个部分。其中图构建部分的主要目的是将初始的数据转化成图结构,这样图神经 络才能够处理图结构的数据。GNN层中实现了很多常见图神经 络算法,能够供不同场景的NLP任务使用。预测层主要分为2大类:分类任务和生成任务,以适应不同的NLP任务。损失函数和评估模块实现了NLP领域比较常用的损失函数及评估指标。
  • 模型层:开发了一些high-level的接口,能够支持Graph2Seq(输入为图结构数据,输出为序列数据)场景、Graph2Tree(输入为图结构数据,输出为树结构数据)学习范式,并计划在未来支持Graph2Graph(输入为图结构数据,输出为图结构数据)范式。
  • 应用层:支持NLP不同任务场景的图神经 络算法,包括文本分类、语义解析、机器翻译、知识库扩充、自然语言生成等。
  • 以上是对Graph4NLP体系结构的简单介绍。在底层硬件部分,是支持在CPU和GPU上进行训练推理,未来也会尝试支持在计算集群上的训练和推理;在后端深度学习框架上,目前仅支持PyTorch,未来计划支持其他的框架,如tensorflow等。

    2. 主要特性

    上图总结了Graph4NLP的4个特点

  • 灵活性和易用度:提供了先进的GNN模型及代码示例,并且提供灵活的接口以支持用户针对自己的应用开发GNN模型。将GNN在NLP领域的应用分解成了不同的步骤,最后形成一个完整流程,在各个流程环节都提供了相应的API供用户调用,用户也可以轻松通过对API的扩展以实现定制化需求。
  • 丰富学习资料:提供了丰富的学习资料,包括代码示例,代码文档,教程及视频资料,以及GNN用于NLP领域的survey paper。
  • 运行效率及可扩展性:Graph4NLP是基于工业级别的开源库DGL构建的,在运行效率及可扩展性上得益于DGL。
  • 丰富代码示例:针对不同的NLP任务提供了丰富的代码示例,使新用户能快速了解和操作。
  • (如果想了解更多内容,可以访问ppt下方的链接)

    上图展示了Graph4NLP的数据流情况:

    input为raw data,在不同NLP领域的初始输入数据是不一样的,可能是纯文本,也有可能已经是某种程度的图结构数据(但图结构可能也不够完整、理想);调用图构建模块,将特定任务的输入数据转换成图结构数据,存储在GraphData类中;然后是GNN的embedding模块,模块输入是比较原始的节点或者一些边的特征,通过调用特定的GNN算法,学习更好的节点和边的表征,使得模型在NLP任务上能达到最优性能,其中学习到的节点和边的表征会存储在GraphData类中;接下来是特定NLP任务的预测层(可以是分类任务,也可以是生成任务);在拿到模型预测结果后,Graph4NLP支持一些常用的损失函数,通过Graph4NLP的评估模块来评估模型在测试集上的性能。

    Graph4NLP支持GNN应用于NLP任务的全流程,在不同环节都有相应接口可供使用,用户也能很方便的扩展这些接口。

    上图展示了Graph4NLP的计算流情况:

    输入是纯文本数据(sequence of tokens)或者是图结构数据(有噪声/不完整),在图构建部分(输入的初始数据转换成图结构数据的过程)支持以下两种方式:

  • 静态图构建:静态图构建是基于某种先验知识在数据预处理阶段就将原始数据构建成图结构,这个过程本身是不能学习的,故称为静态图构建。简单举例,可以选择将输入的文本数据转换成dependency tree(依存树),也可以选择其他parser,如将文本数据转换成AMR图等,以上方式都使用了先验知识将输入数据转换成图结构数据,故统称为静态图构建。静态图构建过程在数据预处理阶段就完成且不可学习。
  • 动态图构建:动态图构建的最大特点是其图构建过程是可以学习的,可以和模型的其他部分一起训练,优点在于所构建的图可以根据下游任务进行优化。
  • 静态方式构建的图并不一定适合下游任务,但动态图的构建过程是可以学习的,是数据驱动的学习过程,所以一定程度解决了这个问题。

    如上所述,图构建过程可分为静态图构建和动态图构建两类,Graph4NLP对这两类方式都进行支持;完成图构建的过程后,需要对图的节点或者边的表征进行初始化,Graph4NLP也提供了一些初始化方法;在给定初始化的节点或者边的表征后,可以调用GNN 络对节点和边的表征进行学习;得到更好的节点或者边的表征后,可以用于下游任务,如节点/边/图的分类任务,或者机器翻译等生成任务。

    值得注意的一点是:

    静态图和动态图的构建并不是完全割裂的,Graph4NLP可以同时结合静态图和动态图的优点。静态图的优点是可以利用先验知识,当我们知道某种静态图构建的方式对任务有帮助,可以将先验知识融入到数据中,使得在下游任务中取得更好的成果。Graph4NLP支持静态图和动态图相结合的图构建方式,同时拥有了两种构图方式各自的优点。

    3. NLP任务应用性能

    上表罗列了Graph4NLP在不同NLP任务及不同数据集的表现。在不同的NLP任务上进行了广泛测试,也测试了不同的GNN模型(GAT、SAGE、GGNN、GCN等)和不同的图构建方式(dependency、constituency、dynamic等),都取得了很好的结果。

    Graph4NLP可以帮助我们快速测试常用算法,并进行迭代。同时可以利用Graph4NLP针对特定的NLP任务开发基于GNN的模型。

    03

    Graph4NLP模块解析

    上图展示了Graph4NLP的层级结构。Graph4NLP有不同的模块,如图构建模块,图表征初始化模块,图表征学习模块等,有不同模型层面的API,如Graph2Seq,Graph2Tree等。下面将重点介绍几个比较重要的模块。

    1. 图构建模块

    第一个是图构建模块。前文也有提到这个模块有静态图和动态图两种方式。Graph4NLP可支持不同的静态图构建方式 (dependency、constituency、IE),也支持2种不同的动态图构建方式:

  • node embedding based:将初始的节点特征映射到一个嵌入空间中,然后在嵌入空间中去学习两两之间的相似度,基于学习到的相似度去构建邻接矩阵,该邻接矩阵就代表了动态图的拓扑结构。此外,也能对该邻接矩阵进行一些操作,如稀疏化的处理,正则化的约束等,使学习到的动态图更有意义。
  • node embedding based refined:本方法结合了静态图和动态图构建的优势,属于一种混合构图的方式。
  • 代码示例截图中展示了调用两种图构建方法的方式,可以直接在参数列表中指定构建图的方式。

    2. 图嵌入初始化模块

    上图展示了图嵌入初始化模块。

    本模块提供了统一接口来同时支持single-token(节点只包含1个token)和multi-token (节点可能包含的是一句话)两种节点/边的表示方式。Graph4NLP提供了常用的初始化节点/边表征的方法,如word2vec,BERT-embedding,BiLSTM-embedding,或者结合这些方式。代码示例片段截图中展示了一些调用参数,可以通过修改参数来很方便的指定初始化表征的方法。

    3. 图嵌入学习模块

    上图展示了图表征学习模块。

    Graph4NLP支持很多常用的神经 络,除了无向边图,Graph4NLP对有向边图神经 络也提供了支持,包括bi-fuse,bi-sep等。在以往经验中针对有向边图结构,使用一般的图神经 络如GCN/GAT的效果不一定是最优的,但相应的有向边版本,如bi-fuse版本的GCN/GAT/GraphSAGE,结果会比无向边版本的GNN模型要好。

    此外,Graph4NLP还支持使用边上的权重信息,这对动态图构建来说是非常重要的,因为动态图构建不仅是学习节点与节点间连接的拓扑结构,还学习到了节点间边的权重信息,这个权重信息对于学习更好的图表征是很有帮助的。

    4. 预测模块

    简单介绍一下Graph4NLP的预测模块:

    可以分为分类模型和生成模型,在两大类模型中也支持了相应的一些比较常用的预测模块。在如生成任务中,支持序列生成和树生成,支持的常见操作有attention机制,copy机制,coverage机制等,并提供了统一接口给用户进行调用。同时也会提供一些高级的模型层面API,如Graph2Seq,Graph2Tree等。

    5. 数据集

    上图展示了Graph4NLP的Dataset模块:不同的NLP任务的输入输出数据是不一样的,如输入为文本输出为标签,输入为文本输出为树/序列结构等。Graph4NLP提供了一些不同类型的Dataset层面的API来匹配不同类型的NLP任务,用户也能通过Graph4NLP的底层API定制自己的Dataset API。

    6. 推断

    最后上图展示了Graph4NLP的推理模块:针对不同的任务(生成/分类),Graph4NLP提供了相应的推理模块,使用户可以比较方便的部署在线模型。用户训练完一个模型后可以很方便地调用wrapper API对模型进行部署上线,该API本身是一种“raw-data-in final-prediction-out”的形式。

    04

    应用案例

    最后快速和大家分享2个demo:

    第一个是文本分类,另一个是math word problem(可以clone图中的GitHub地址,对demo资源进行下载,安装好Graph4NLP开源库以及相关的软件就可以尝试运行demo)。由于篇幅关系不做详细说明,具体过程可以参照GitHub内容。这两个任务均为常见的NLP任务,且适用于整个pipeline。

    对分类任务而言,比较重要的模块为图构建、图表征以及预测模块,对应模块都可以调用相应的API。对math word problem任务而言,输入是文本输出是树状结构,天然比较适合Graph2Tree的模型,可以直接调用Graph4NLP提供的Graph2Tree API,进行相应的配置即可。

    下面展示了两个demo中的一些具体代码片段,可以非常简单的用模块化的方式构造模型。

    1. 案例1

    2. 案例2

    05

    未来规划

    最后简单说明以下未来计划:

    有更好的可扩展性;更多定制化的NLP任务;提高软件库的scalability,支持多GPU、多节点的训练;使部署过程更加流畅;提供更多的预训练语言模型接口;囊括更多的NLP任务,实现更多的GNN模型。

    欢迎大家提意见,并参与到开源软件库的开发过程中。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年8月16日
    下一篇 2022年8月16日

    相关推荐