1 Star 0 Fork 12

officeciscn / PGL

forked from PaddlePaddle / PGL 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0
The logo of Paddle Graph Learning (PGL)

PyPi Latest Release License

文档 | 快速开始 | English

最新消息

PGL v2.1 2020.02.02

  • 更易用了!正式发布PGL 2.1版本,正式支持PaddlePaddle 2.0
  • 之前静态图版本(<2.0)的PGL放在“static_stable”分支

PGL v1.2 2020.11.20

  • PGL团队提出统一的消息传递模型UniMP,刷新OGB项榜单SOTA。你可以在这里看到详细的代码。

  • PGL团队提出基于ERNIEsage的二阶段召回与排序模型, 在COLING协办的TextGraphs2020比赛中取得第一名

  • PGL团队倾力开发了图神经网络公开课,带你七天高效入门图神经网络。课程详情请参考course

PGL v1.1 2020.4.29

  • ERNIESage是PGL团队最新提出的模型,可以用于建模文本以及图结构信息。你可以在这里看到详细的介绍。

  • PGL现在提供Open Graph Benchmark的一些例子,你可以在这里找到。

  • 新增了图级别的算子包括GraphPooling以及GraphNormalization,这样你就能实现更多复杂的图级别分类模型。

  • 新增PGL-KE工具包,里面包含许多经典知识图谱图嵌入算法,包括TransE, TransR, RotatE,详情可见这里


Paddle Graph Learning (PGL)是一个基于PaddlePaddle的高效易用的图学习框架

The Framework of Paddle Graph Learning (PGL)

在最新发布的PGL中引入了异构图的支持,新增MetaPath采样支持异构图表示学习,新增异构图Message Passing机制支持基于消息传递的异构图算法,利用新增的异构图接口,能轻松搭建前沿的异构图学习算法。而且,在最新发布的PGL中,同时也增加了分布式图存储以及一些分布式图学习训练算法,例如,分布式deep walk和分布式graphsage。结合PaddlePaddle深度学习框架,我们的框架基本能够覆盖大部分的图网络应用,包括图表示学习以及图神经网络。

对比于一般的模型,图神经网络模型最大的优势在于它利用了节点与节点之间连接的信息。但是,如何通过代码来实现建模这些节点连接十分的麻烦。PGL采用与DGL相似的消息传递范式用于作为构建图神经网络的接口。用于只需要简单的编写send还有recv函数就能够轻松的实现一个简单的GCN网络。如下图所示,首先,send函数被定义在节点之间的边上,用户自定义send函数会把消息从源点发送到目标节点。然后,recv函数负责将这些消息用汇聚函数 汇聚起来。

The basic idea of message passing paradigm

用户只需要下面简单几行代码,就可以实现一个求和聚合函数了。


    import pgl
    import paddle
    import numpy as np

    
    num_nodes = 5
    edges = [(0, 1), (1, 2), (3, 4)]
    feature = np.random.randn(5, 100).astype(np.float32)

    g = pgl.Graph(num_nodes=num_nodes,
        edges=edges,
        node_feat={
            "h": feature
        })
    g.tensor()

    def send_func(src_feat, dst_feat, edge_feat):
        return src_feat

    def recv_func(msg):
        return msg.reduce_sum(msg["h"]) 
     
    msg = g.send(send_func, src_feat=g.node_feat)

    ret = g.recv(recv_func, msg)

特色:易用性——原生支持异构图

图可以很方便的表示真实世界中事物之间的联系,但是事物的类别以及事物之间的联系多种多样,因此,在异构图中,我们需要对图网络中的节点类型以及边类型进行区分。PGL针对异构图包含多种节点类型和多种边类型的特点进行建模,可以描述不同类型之间的复杂联系。

支持异构图MetaPath walk采样

The metapath sampling in heterogeneous graph 上图左边描述的是一个购物的社交网络,上面的节点有用户和商品两大类,关系有用户和用户之间的关系,用户和商品之间的关系以及商品和商品之间的关系。上图的右边是一个简单的MetaPath采样过程,输入metapath为UPU(user-product-user),采出结果为 The metapath result 然后在此基础上引入word2vec等方法,支持异构图表示学习metapath2vec等算法。

支持异构图Message Passing机制

The message passing mechanism on heterogeneous graph 在异构图上由于节点类型不同,消息传递也方式也有所不同。如上图左边,它有五个邻居节点,属于两种不同的节点类型。如上图右边,在消息传递的时候需要把属于不同类型的节点分开聚合,然后在合并成最终的消息,从而更新目标节点。在此基础上PGL支持基于消息传递的异构图算法,如GATNE等算法。

特色:规模性——支持分布式图存储以及分布式学习算法

在大规模的图网络学习中,通常需要多机图存储以及多机分布式训练。如下图所示,PGL提供一套大规模训练的解决方案,我们利用PaddleFleet(支持大规模分布式Embedding学习)作为我们参数服务器模块以及一套简易的分布式存储方案,可以轻松在MPI集群上搭建分布式大规模图学习方法。

The distributed frame of PGL

丰富性——覆盖业界大部分图学习网络

下列是框架中部分已经实现的图网络模型,更多的模型在这里可以找到。详情请参考这里

模型 特点
ERNIESage 能同时建模文本以及图结构的ERNIE SAmple aggreGatE
GCN 图卷积网络
GAT 基于Attention的图卷积网络
GraphSage 基于邻居采样的大规模图卷积网络
unSup-GraphSage 无监督学习的GraphSAGE
LINE 基于一阶、二阶邻居的表示学习
DeepWalk DFS随机游走的表示学习
MetaPath2Vec 基于metapath的表示学习
Node2Vec 结合DFS及BFS的表示学习
Struct2Vec 基于结构相似的表示学习
SGC 简化的图卷积网络
GES 加入节点特征的图表示学习方法
DGI 基于图卷积网络的无监督表示学习
GATNE 基于MessagePassing的异构图表示学习

上述模型包含图表示学习,图神经网络以及异构图三部分,而异构图里面也分图表示学习和图神经网络。

依赖

PGL依赖于:

  • paddle >= 2.0.0
  • cython

PGL支持Python 3。

安装

你可以简单的用pip进行安装。

pip install pgl

团队

PGL由百度的NLP以及Paddle团队共同开发以及维护。

联系方式 E-mail: nlp-gnn[at]baidu.com

License

PGL uses Apache License 2.0.

from __future__ import absolute_import from __future__ import print_function from __future__ import unicode_literals import argparse import io, re import sys, os import subprocess import platform COPYRIGHT = ''' Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ''' LANG_COMMENT_MARK = None NEW_LINE_MARK = None COPYRIGHT_HEADER = None if platform.system() == "Windows": NEW_LINE_MARK = "\r\n" else: NEW_LINE_MARK = '\n' COPYRIGHT_HEADER = COPYRIGHT.split(NEW_LINE_MARK)[1] p = re.search('(\d{4})', COPYRIGHT_HEADER).group(0) process = subprocess.Popen(["date", "+%Y"], stdout=subprocess.PIPE) date, err = process.communicate() date = date.decode("utf-8").rstrip("\n") COPYRIGHT_HEADER = COPYRIGHT_HEADER.replace(p, date) def generate_copyright(template, lang='C'): if lang == 'Python': LANG_COMMENT_MARK = '#' else: LANG_COMMENT_MARK = "//" lines = template.split(NEW_LINE_MARK) BLANK = " " ans = LANG_COMMENT_MARK + BLANK + COPYRIGHT_HEADER + NEW_LINE_MARK for lino, line in enumerate(lines): if lino == 0 or lino == 1 or lino == len(lines) - 1: continue if len(line) == 0: BLANK = "" else: BLANK = " " ans += LANG_COMMENT_MARK + BLANK + line + NEW_LINE_MARK return ans + "\n" def lang_type(filename): if filename.endswith(".py"): return "Python" elif filename.endswith(".h"): return "C" elif filename.endswith(".c"): return "C" elif filename.endswith(".hpp"): return "C" elif filename.endswith(".cc"): return "C" elif filename.endswith(".cpp"): return "C" elif filename.endswith(".cu"): return "C" elif filename.endswith(".cuh"): return "C" elif filename.endswith(".go"): return "C" elif filename.endswith(".proto"): return "C" else: print("Unsupported filetype %s", filename) exit(0) PYTHON_ENCODE = re.compile("^[ \t\v]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)") def main(argv=None): parser = argparse.ArgumentParser( description='Checker for copyright declaration.') parser.add_argument('filenames', nargs='*', help='Filenames to check') args = parser.parse_args(argv) retv = 0 for filename in args.filenames: fd = io.open(filename, encoding="utf-8") first_line = fd.readline() second_line = fd.readline() if "COPYRIGHT (C)" in first_line.upper(): continue if first_line.startswith("#!") or PYTHON_ENCODE.match( second_line) != None or PYTHON_ENCODE.match(first_line) != None: continue original_contents = io.open(filename, encoding="utf-8").read() new_contents = generate_copyright( COPYRIGHT, lang_type(filename)) + original_contents print('Auto Insert Copyright Header {}'.format(filename)) retv = 1 with io.open(filename, 'w') as output_file: output_file.write(new_contents) return retv if __name__ == '__main__': exit(main())

简介

Paddle Graph Learning (PGL)是一个基于PaddlePaddle的高效易用的图学习框架 展开 收起
Python
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Python
1
https://gitee.com/officeciscn/PGL.git
git@gitee.com:officeciscn/PGL.git
officeciscn
PGL
PGL
main

搜索帮助