2022年4月更新说明
用于GNN的分组可逆残差连接
我们添加了一个新的模块GroupRevRes
,该模块首次在Training Graph Neural Networks with 1000 Layers中提出。它可以包装任何GNN模块,并提供分组、可逆和残差连接(示例如下)。
import dgl
import torch
class GNNLayer(torch.nn.Module):
def __init__(self, in_size, dropout=0.2):
super(GNNLayer, self).__init__()
# Use BatchNorm and dropout to prevent gradient vanishing
# In particular if you use a large number of GNN layers
self.norm = torch.nn.BatchNorm1d(in_size)
self.conv = dgl.nn.GraphConv(in_size, in_size)
self.dropout = torch.nn.Dropout(dropout)
def forward(self, g, x):
x = self.norm(x)
x = self.dropout(x)
return self.conv(g, x)
g = ... # some graph
x = torch.randn(g.num_nodes(), 32)
reversible_conv = dgl.nn.GroupRevRes(GNNLayer(32 // 4), 4) # 4 groups
y = reversible_conv(g, x) # forward
开发者推荐:
GroupRevRes
模块是可逆的,这意味着反向传播不需要存储前向激活。这可以显著减少GNN的内存使用,使得在单个普通GPU上训练多达1000层的超深GNN成为可能。
拉普拉斯位置编码
我们添加了一个新的数据转换模块LaplacianPE
,该模块首次在Benchmarking Graph Neural Networks中提出。它计算图的拉普拉斯位置编码。除了数据转换模块,我们还提供一个函数式API。请参阅下面的使用示例
import dgl
# data transform
dataset = dgl.data.CoraGraphDataset(
transform=dgl.transforms.LaplacianPE(k=2, feat_name='PE'))
g = dataset[0] # positional encodings will be generated as an ndata
pe = g.ndata['PE']
# functional API
pe = dgl.laplacian_pe(g, k=2)
开发者推荐: 拉普拉斯位置编码通过使用k个最小非平凡拉普拉斯特征向量作为附加节点特征来提高GNN的表达能力。
随机游走位置编码
我们添加了一个新的数据转换模块RandomWalkPE
,该模块在Graph Neural Networks with Learnable Structural and Positional Representations中提出。它计算基于随机游走的图位置编码。除了数据转换模块,我们还提供一个函数式API。请参阅下面的使用示例
import dgl
# data transform
dataset = dgl.data.CoraGraphDataset(
transform=dgl.transforms.RandomWalkPE(k=2, feat_name='PE'))
g = dataset[0] # positional encodings will be generated automatically
pe = g.ndata['PE']
# Functional API
pe = dgl.random_walk_pe(g, k=2) # functional API
开发者推荐: 随机游走位置编码通过使用节点在1、2、……、K步内回到自身的概率作为附加节点特征来提高GNN的表达能力。
GraphSAINT采样器
我们添加了一个新的采样器SAINTSampler
,该采样器在GraphSAINT: Graph Sampling Based Inductive Learning Method中提出。SAINTSampler
提供了三种策略来从图中提取诱导子图——通过随机选择节点集、随机选择边集或通过随机游走到达的节点。请参阅下面的使用示例
import torch
import dgl
from dgl.dataloading import SAINTSampler, DataLoader
sampler = SAINTSampler(
mode='node', # Can be 'node', 'edge' or 'walk'
budget=200,
prefetch_ndata=['feat', 'label'] # optionally, specify data to prefetch
)
data_index = torch.arange(1000) # 1000 mini-batches
g = dgl.data.CoraGraphDataset()[0]
dataloader = DataLoader(g, data_index, sampler, num_workers=4)
for sg in dataloader:
train(sg)
开发者推荐: GraphSAINT是子图采样领域中最先进的采样方法之一。与邻居采样(或节点级采样)相比,子图采样避免了指数级邻居扩展的问题,从而节省了数据传输成本,并使得更深层次GNN的小批量训练成为可能。
E(n)等变卷积层
我们添加了一个新的GNN模块EGNNConv
,该模块在E(n) Equivariant Graph Neural Networks中提出。它对节点嵌入和坐标嵌入执行等变变换。请参阅下面的使用示例
import dgl
import torch
g = ... # some graph
h = torch.randn(g.num_nodes(), 10) # node features
x = torch.randn(g.num_nodes(), 4) # node coordinates
a = torch.randn(g.num_edges(), 2) # edge features
conv = dgl.nn.EGNNConv(10, 10, 10, 2)
h, x = conv(g, h, x, a)
开发者推荐: 具有等变变换能力的GNN在具有坐标的现实世界结构数据(例如,分子、点云等)中具有广泛应用。EGNN简化了之前的尝试,并提出了一个对N维坐标的旋转、平移、反射和排列等变的设计,同时考虑了节点特征和节点坐标。
主邻域聚合层
我们添加了一个新的GNN模块PNAConv
,该模块在Principal Neighbourhood Aggregation for Graph Nets中提出。下面的代码展示了一个使用示例
import dgl
import torch
g = ... # some graph
x = torch.randn(g.num_nodes(), 10) # node features
conv = dgl.nn.PNAConv(10, 10,
aggregators=['mean', 'max', 'sum'],
scalers=['identity', 'amplification'],
delta=2.5)
h = conv(g, x)
开发者推荐: 主邻域聚合(PNA)通过结合多种聚合函数和度量标量来提高GNN的表达能力,使其成为许多图分类任务中最先进的基线方法。
问卷调查
如果您希望DGL实现某些论文,或者您有其他反馈和建议,可以填写此问卷。
18 四月