【图神经网络】图神经网络框架DGL1.0初体验
迪丽瓦拉
2025-05-29 10:58:29
0

图神经网络框架DGL1.0初体验

  • DGL 1.0: Empowering Graph Machine Learning For Everyone
  • DGL中的两种GNN范式
  • DGL Sparse:为图机器学习设计的稀疏矩阵库
  • 图卷积网络(Graph Convolutional Network)
  • 基于图扩散的GNN
  • 超图神经网络
  • 图 Transformer
  • DGL Sparse 的关键特性
  • 内容来源

DGL 1.0: Empowering Graph Machine Learning For Everyone

DGL 1.0 总结了过去三年学术界或工业界对图深度学习和图神经网络(GNN)技术的各类需求。从最先进模型的学术研究到将 GNN 扩展到工业级应用,DGL 1.0 为所有用户提供全面且易用的解决方案,以更好的利用图机器学习的优势。
Different levels of user requests and what DGL 1.0 provides to fulfill them
DGL 1.0 为不同场景提供的解决方案。

DGL 1.0 采用分层和模块化的设计,以满足各种用户需求。本次发布的关键特性包括:

  • 100 多个开箱即用的 GNN 模型示例,15 多个在 Open Graph Benchmark(OGB)上排名靠前的基准模型;
  • 150 多个 GNN 常用模块,包括 GNN 层、数据集、图数据转换模块、图采样器等,可用于构建新的模型架构或基于 GNN 的解决方案;
  • 灵活高效的消息传递和稀疏矩阵抽象,用于开发新的 GNN 模块;
  • 多 GPU 和分布式训练能力,支持在百亿规模的图上进行训练。

DGL 1.0技术栈图如下:
DGL 1.0
DGL github 代码地址:https://github.com/dmlc/dgl

此版本的亮点之一是引入了DGL-Sparse,这是一个全新的编程接口,使用了稀疏矩阵作为核心的编程抽象。DGL-Sparse不仅可以简化现有的GNN模型(例如图卷积网络)的开发,而且还适用于最新的模型,包括基于扩散的GNN,超图神经网络和图Transformer。
DGL install

# If you have installed dgl-cuXX package, please uninstall it first.
pip install  dgl -f https://data.dgl.ai/wheels/cu113/repo.html
pip install  dglgo -f https://data.dgl.ai/wheels-test/repo.html

DGL中的两种GNN范式

DGL中包含两种主流的GNN范式,即消息传递视图(The Message Passing View)矩阵视图(The Matrix View)。这些范式可以帮助研究人员更好地理解 GNN 的内部工作机制,而矩阵视角也是DGL Sparse开发的动机之一。

电影《降临》中有这么一句话:「你所使用的语言决定了你的思维方式,并影响了你对事物的看法。」这句话也适合GNN。

表示图神经网络有两种不同的范式:

  • 第一种称为消息传递视图,从细粒度、局部的角度表达 GNN 模型,详细描述如何沿边交换消息以及节点状态如何进行相应的更新。
  • 第二种是矩阵视角,由于图与稀疏邻接矩阵具有代数等价性,许多研究人员选择从粗粒度、全局的角度来表达 GNN 模型,强调涉及稀疏邻接矩阵和特征向量的操作。

消息传递视角和矩阵视角
消息传递视角揭示了 GNN 与 Weisfeiler Lehman (WL)图同构测试之间的联系,后者也依赖于从邻居聚合信息。而矩阵视角则从代数角度来理解 GNN,引发了一些有趣的发现,比如过度平滑问题。

总之,这两种视角都是研究 GNN 不可或缺的工具,它们互相补充,帮助研究人员更好地理解和描述 GNN 模型的本质和特性。正是基于这个原因,DGL 1.0 发布的主要动机之一就是在已有的消息传递接口基础之上,增加对于矩阵视角的支持

DGL Sparse:为图机器学习设计的稀疏矩阵库

DGL 1.0 版本中新增了一个名为 DGL Sparse 的库(dgl.sparse),它和 DGL 中的消息传递接口一起,完善了对于全类型的图神经网络模型的支持。DGL Sparse 提供专门用于 图机器学习的稀疏矩阵类和操作,使得在矩阵视角下编写 GNN 变得更加容易。在下一节中,作者演示多个 GNN 示例,展示它们在 DGL Sparse 中的数学公式和相应的代码实现。

图卷积网络(Graph Convolutional Network)

GCN 是 GNN 建模的先驱之一。GCN 可以同时用消息传递视图和矩阵视图来表示。下面的代码比较了 DGL 中用这两种方法实现的区别。
Graph Convolution Network
1)DGL message passing functions

class GCNLayer(nn.Module):...def forward(self, g, X):g.ndata['X'] = Xg.ndata['deg'] = g.in_degrees().float()g.update_all(self.message, fn.sum('m', 'X_neigh'))X_neigh = g.ndata['X_neigh']return F.relu(self.W(X_neigh))def message(self, edges):c_ij = (edges.src['deg'] * edges.dst['deg']) ** -0.5return {'m' : edges.src['X'] * c_ij}

2)DGL sparse matrix package

import dgl.sparse as dglsp  # DGL 1.0 sparse matrix packageclass GCNLayer(nn.Module):...def forward(self, A, X):D_invsqrt = dglsp.diag(A.sum(1)) ** -0.5A_norm = D_invsqrt @ A @ D_invsqrtreturn F.relu(self.W(A_norm @ X))

基于图扩散的GNN

图扩散是沿边传播或平滑节点特征或信号的过程。PageRank 等许多经典图算法都属于这一类。一系列研究表明,将图扩散与神经网络相结合是增强模型预测有效且高效的方法。下面的等式描述了其中比较有代表性的模型 APPNP 的核心计算。它可以直接在 DGL Sparse 中实现。
基于图扩散的GNN

class APPNP(nn.Module):...def forward(self, A, X):Z_0 = Z = self.f_theta(X)for _ in range(self.num_hops):A_drop = dglsp.val_like(A, self.A_dropout(A.val))Z = (1 - self.alpha) * A_drop @ Z + self.alpha * Z_0return Z

超图神经网络

超图是图的推广,其中边可以连接任意数量的节点(称为超边)超图在需要捕获高阶关系的场景中特别有用,例如电子商务平台中的共同购买行为,或引文网络中的共同作者等。超图的典型特征是其稀疏的关联矩阵,因此超图神经网络 (HGNN) 通常使用稀疏矩阵定义。以下是超图卷积网络(Feng et al., 2018)和其代码实现。
超图神经网络

class HypergraphConv(nn.Module):...def forward(self, H, X):d_V = H.sum(1)  # node degreed_E = H.sum(0)  # edge degreen_edges = d_E.shape[0]D_V_invsqrt = dglsp.diag(d_V**-0.5)  # D_V ** (-1/2)D_E_inv = dglsp.diag(d_E**-1)  # D_E ** (-1)W = dglsp.identity((n_edges, n_edges))L = D_V_invsqrt @ H @ W @ D_E_inv @ H.T @ D_V_invsqrtreturn self.Theta(L @ X)

图 Transformer

Transformer 模型已经成为自然语言处理中最成功的模型架构。研究人员也开始将 Transformer 扩展到图机器学习。Dwivedi 等人开创性地提出将所有多头注意力限制为图中连接的节点对。通过 DGL Sparse 工具,只需 10 行代码即可轻松实现该模型。
图Transformer

class GraphMHA(nn.Module):...def forward(self, A, h):N = len(h)q = self.q_proj(h).reshape(N, self.head_dim, self.num_heads)q *= self.scalingk = self.k_proj(h).reshape(N, self.head_dim, self.num_heads)v = self.v_proj(h).reshape(N, self.head_dim, self.num_heads)attn = dglsp.bsddmm(A, q, k.transpose(1, 0))  # [N, N, nh]attn = attn.softmax()out = dglsp.bspmm(attn, v)return self.out_proj(out.reshape(N, -1))

DGL Sparse 的关键特性

相比scipy.sparsetorch.sparse等稀疏矩阵库,DGL Sparse 的整体设计是为图机器学习服务,其中包括了以下关键特性:

  • 自动稀疏格式选择:DGL Sparse 的设计让用户不必为了选择正确的数据结构存储稀疏矩阵(也称为稀疏格式)而烦恼。用户只需要记住 dgl.sparse.spmatrix 创建稀疏矩阵,而 DGL 在内部则会根据调用的算子来自动选择最优格式;
  • 标量或矢量非零元素:很多 GNN 模型会在边上学习多个权重(如 Graph Transformer 示例中演示的多头注意力向量)。为了适应这种情况,DGL Sparse 允许非零元素具有向量形状,并扩展了常见的稀疏操作,例如稀疏 - 稠密 - 矩阵乘法(SpMM)等。可以参考 Graph Transformer 示例中的 bspmm 操作。

通过利用这些设计特性,与之前使用消息传递接口的矩阵视图模型的实现相比,DGL Sparse 将代码长度平均降低了 2.7 倍。简化的代码还使框架的开销减少 43%。此外DGL Sparse 与 PyTorch 兼容,可以轻松与 PyTorch 生态系统中的各种工具和包集成。

接下来,我们将正式开始使用DGL 1.0。可以使用 pip 或 conda 轻松安装。除了前面介绍的示例之外,DGL Sparse 的第一个版本还包括 5 个教程和 11 个端到端示例,所有教程都可以在 Google Colab 中直接体验,无需本地安装。

内容来源

  1. https://www.dgl.ai/release/2023/02/20/release.html
  2. https://mp.weixin.qq.com/s/DmjpGfBjytZZYKVnEC50Hw

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...