博客详情

主页 / 博客详情
blog

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实现某些论文,或者您有其他反馈和建议,可以填写此问卷