Introduction

PyTorch Geometric Temporal 是 PyTorch Geometric 的时序图神经网络扩展库。它基于开源的深度学习和图处理库。PyTorch Geometric Temporal 由最先进的深度学习和参数学习方法组成,用于处理时空信号。它是第一个用于几何结构时空深度学习的开源库,并提供动态和静态图上的恒时差图神经网络。我们利用离散时间图快照来实现这一点。实施的方法涵盖了广泛的数据挖掘(WWW、KDD)、人工智能和机器学习(AAAI、ICONIP、ICLR)会议、研讨会和著名期刊的文章。

Citing

If you find PyTorch Geometric Temporal useful in your research, please consider adding the following citation:

>@inproceedings{rozemberczki2021pytorch,
                author = {Benedek Rozemberczki and Paul Scherer and Yixuan He and George Panagopoulos and Alexander Riedel and Maria Astefanoaei and Oliver Kiss and Ferenc Beres and Guzman Lopez and Nicolas Collignon and Rik Sarkar},
                title = {{PyTorch Geometric Temporal: Spatiotemporal Signal Processing with Neural Machine Learning Models}},
                year = {2021},
                booktitle={Proceedings of the 30th ACM International Conference on Information and Knowledge Management},
                pages = {4564–4573},
}

We briefly overview the fundamental concepts and features of PyTorch Geometric Temporal through simple examples.

Data Structures

PyTorch Geometric Temporal 的设计目的是提供易于使用的数据迭代器,这些迭代器以时空数据为参数。这些迭代器可以为单个图形或多个图形形成的快照提供服务,这些图形通过块对角批处理技巧被批处理在一起。

data snapshot 其含义是:

在含有时间维度的动态图或时间序列数据中,data snapshot指的是在某个特定时间点上,获取到的节点特征或邻接矩阵等图数据的快照(snapshot)。

换言之,data snapshot可以理解为动态图在时间维度上某一时刻的状态的一份“快照”。它记录了该时刻图数据的特征。

随着时间的推移,动态图会产生许多不同时间的data snapshot。将这些snapshot按时间顺序排列起来,就形成了动态图的时间演化过程数据。

所以,对于含时序数据的图神经网络,其输入是由不同时间的data snapshot组成的序列,网络学习到的就是如何建模图结构随时间变化的规律。

综上,“data snapshot”翻译成中文为“数据快照”,表示动态图在特定时间的状态快照,是研究图时间序列的重要概念

Temporal Signal Iterators

PyTorch Geometric Temporal 为包含时间快照的时空数据集提供数据迭代器。数据迭代器有三种类型:

静态图时态信号(StaticGraphTemporalSignal)- 用于在静态图上定义时态信号。

动态图时态信号(DynamicGraphTemporalSignal)- 用于动态图上定义的时态信号。

DynamicGraphStaticSignal - 为在动态图上定义的静态信号而设计。

Temporal Data Snapshots

时间数据快照是一个 PyTorch 几何数据对象。详情请查看自述文件。返回的时间快照具有以下属性:

edge_index - 用于节点特征聚合的边缘索引的 PyTorch LongTensor(可选)。

edge_attr - 用于节点特征聚合加权的边缘特征的 PyTorch FloatTensor(可选)。

x - 一个顶点特征的 PyTorch FloatTensor(可选)。

y - 顶点目标的 PyTorch FloatTensor 或 LongTensor(可选)。

Temporal Signal Iterators with Batches

PyTorch Geometric Temporal 为包含成批时间快照的成批时空数据集提供数据迭代器。有三种批处理数据迭代器:

StaticGraphTemporalSignalBatch - 专为在一批静态图形上定义的时间信号而设计。

DynamicGraphTemporalSignalBatch - 专为定义在一批动态图上的时间信号而设计。

DynamicGraphStaticSignalBatch - 设计用于在一批动态图形上定义静态信号。

Temporal Batch Snapshots

时间批快照是 PyTorch 几何批对象。详情请查看自述文件。返回的时序批快照具有以下属性:

edge_index - 用于节点特征聚合的边缘索引的 PyTorch LongTensor(可选)。

edge_attr - 用于节点特征聚合加权的边缘特征 PyTorch FloatTensor(可选)。

x - 一个顶点特征的 PyTorch FloatTensor(可选)。

y - 顶点目标的 PyTorch FloatTensor 或 LongTensor(可选)。

batch - 批量索引的 PyTorch LongTensor(可选)。

Benchmark Datasets(基准数据集)

我们发布并收录了一些数据集,可用于比较时空图神经网络算法的性能。相关的机器学习任务是节点和图级监督学习。

Newly Released Datasets

为了对图神经网络进行基准测试,我们发布了以下数据集:

匈牙利水痘数据集

PedalMe 伦敦数据集

维基百科生命数学数据集

风车输出数据集

Integrated Datasets

我们还整合了现有的数据集进行性能评估:

The Hungarian Chickenpox Dataset can be loaded by the following code snippet. The dataset returned by the public get_dataset method is a StaticGraphTemporalSignal object.

from torch_geometric_temporal.dataset import ChickenpoxDatasetLoader

loader = ChickenpoxDatasetLoader()

dataset = loader.get_dataset()

Spatiotemporal Signal Splitting

我们提供了创建数据迭代器时间分割的函数。这些函数返回训练数据迭代器和测试数据迭代器,使用固定的训练-测试比率对原始迭代器进行拆分。较早时间段的快照贡献给训练数据集,较晚时间段的快照贡献给测试数据集。这样,就能在类似现实生活的场景中对时间预测进行评估。函数 split_temporal_signal 接收静态图时态信号(StaticGraphTemporalSignal)或动态图时态信号(DynamicGraphTemporalSignal)对象,并根据 train_ratio 指定的分割比例返回两个迭代器。

from torch_geometric_temporal.dataset import ChickenpoxDatasetLoader
from torch_geometric_temporal.signal import temporal_signal_split

loader = ChickenpoxDatasetLoader()

dataset = loader.get_dataset()

train_dataset, test_dataset = temporal_signal_split(dataset, train_ratio=0.8)

这段话的意思是,pytorch_geometric_temporal提供了函数来创建数据迭代器的时间分割。这些函数会根据指定的训练-测试集分割比例train_ratio,返回训练集和测试集的数据迭代器,从而分割原始的数据迭代器。

具体来说:

  • 将更早时间段的快照(snapshots)贡献给训练数据集,将更晚时间段的快照贡献给测试数据集。

  • 这样可以在一个更加逼近真实场景的设置下评估模型对时间序列的预测。

  • split_temporal_signal函数会接收一个StaticGraphTemporalSignal对象或DynamicGraphTemporalSignal对象作为输入。

  • 根据传入的train_ratio进行分割,返回两个迭代器,分别用于训练和测试。

总结一下,该框架提供了根据时间顺序智能分割训练和测试集的功能。早期时间段的数据用于训练,晚期时间段的数据用于测试。这种分割可以让模型在一个更加真实的设置下进行时序预测任务的评估。

Applications

在下文中,我们将概述 PyTorch Geometric Temporal 可用于解决现实世界中相关机器学习问题的两个案例研究。其中一个是流行病预测,另一个是网络流量预测。

Epidemiological Forecasting

本案例研究使用的是匈牙利水痘病例数据集。我们将使用递归图卷积网络训练一个回归器来预测各县每周报告的病例。首先,我们将加载数据集,并创建适当的时空分割。

from torch_geometric_temporal.dataset import ChickenpoxDatasetLoader
from torch_geometric_temporal.signal import temporal_signal_split

loader = ChickenpoxDatasetLoader()

dataset = loader.get_dataset()

train_dataset, test_dataset = temporal_signal_split(dataset, train_ratio=0.2)

接下来,我们将定义用于解决监督任务的递归图神经网络架构。构造器定义了一个 DCRNN 层和一个前馈层。值得注意的是,最终的非线性并没有整合到递归图卷积操作中。这一设计原则一直沿用至今,它来自 PyTorch Geometric。因此,我们在递归层和线性层之间手动定义了 ReLU 非线性。最后的线性层后面没有非线性,因为我们解决的是零均值目标的回归问题。

import torch
import torch.nn.functional as F
from torch_geometric_temporal.nn.recurrent import DCRNN

class RecurrentGCN(torch.nn.Module):
    def __init__(self, node_features):
        super(RecurrentGCN, self).__init__()
        self.recurrent = DCRNN(node_features, 32, 1)
        self.linear = torch.nn.Linear(32, 1)

    def forward(self, x, edge_index, edge_weight):
        h = self.recurrent(x, edge_index, edge_weight)
        h = F.relu(h)
        h = self.linear(h)
        return h

让我们定义一个模型(我们有 4 个节点特征),并对其进行 200 次训练(时间快照的前 20%)。当每个时间快照的损失累积到一定程度时,我们进行反向传播。我们将使用学习率为 0.01 的 Adam 优化器。tqdm 函数用于测量每个训练历元所需的运行时间。

from tqdm import tqdm

model = RecurrentGCN(node_features = 4)

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

model.train()

for epoch in tqdm(range(200)):
    cost = 0
    for time, snapshot in enumerate(train_dataset):
        y_hat = model(snapshot.x, snapshot.edge_index, snapshot.edge_attr)
        cost = cost + torch.mean((y_hat-snapshot.y)**2)
    cost = cost / (time+1)
    cost.backward()
    optimizer.step()
    optimizer.zero_grad()

我们将利用保持结果来评估训练有素的递归图卷积网络的性能,并计算所有空间单元和时间段的均方误差。

model.eval()
cost = 0
for time, snapshot in enumerate(test_dataset):
    y_hat = model(snapshot.x, snapshot.edge_index, snapshot.edge_attr)
    cost = cost + torch.mean((y_hat-snapshot.y)**2)
cost = cost / (time+1)
cost = cost.item()
print("MSE: {:.4f}".format(cost))
>>> MSE: 1.0232

Web Traffic Prediction

本案例研究使用的是维基百科数学数据集。我们将训练一个递归图神经网络,利用递归图卷积网络预测维基百科页面的每日浏览量。首先,我们将加载数据集,并使用 14 个滞后流量变量。接下来,我们将创建一个适当的时空分割,使用 50%的天数来训练模型。

from torch_geometric_temporal.dataset import WikiMathsDatasetLoader
from torch_geometric_temporal.signal import temporal_signal_split

loader = WikiMathsDatasetLoader()

dataset = loader.get_dataset(lags=14)

train_dataset, test_dataset = temporal_signal_split(dataset, train_ratio=0.5)

接下来,我们将定义用于解决监督任务的递归图神经网络架构。构造器定义了一个 GConvGRU 层和一个前馈层。需要再次指出的是,非线性并没有整合到递归图卷积操作中。卷积模型有固定数量的滤波器(可以参数化),并考虑二阶邻域。

import torch
import torch.nn.functional as F
from torch_geometric_temporal.nn.recurrent import GConvGRU

class RecurrentGCN(torch.nn.Module):
    def __init__(self, node_features, filters):
        super(RecurrentGCN, self).__init__()
        self.recurrent = GConvGRU(node_features, filters, 2)
        self.linear = torch.nn.Linear(filters, 1)

    def forward(self, x, edge_index, edge_weight):
        h = self.recurrent(x, edge_index, edge_weight)
        h = F.relu(h)
        h = self.linear(h)
        return h

让我们定义一个模型(我们有 14 个节点特征),并在训练分区(前 50% 的时间快照)上对其进行 50 个历时的训练。我们从每个时间快照中分别反向传播损失。我们将使用学习率为 0.01 的 Adam 优化器。tqdm 函数用于测量每个训练历元所需的运行时间。

from tqdm import tqdm

model = RecurrentGCN(node_features=14, filters=32)

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

model.train()

for epoch in tqdm(range(50)):
    for time, snapshot in enumerate(train_dataset):
        y_hat = model(snapshot.x, snapshot.edge_index, snapshot.edge_attr)
        cost = torch.mean((y_hat-snapshot.y)**2)
        cost.backward()
        optimizer.step()
        optimizer.zero_grad()

我们将使用保留流量数据评估训练有素的递归图卷积网络的性能,并计算所有网页和天数的均方误差。

model.eval()
cost = 0
for time, snapshot in enumerate(test_dataset):
    y_hat = model(snapshot.x, snapshot.edge_index, snapshot.edge_attr)
    cost = cost + torch.mean((y_hat-snapshot.y)**2)
cost = cost / (time+1)
cost = cost.item()
print("MSE: {:.4f}".format(cost))
>>> MSE: 0.7760

External Resources - Architectures

  • Yaguang Li, Rose Yu, Cyrus Shahabi, Yan Liu: Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting PaperTensorFlow CodePyTorch Code

  • Youngjoo Seo, Michaël Defferrard, Xavier Bresson, Pierre Vandergheynst: Structured Sequence Modeling With Graph Convolutional Recurrent Networks PaperCodeTensorFlow Code

  • Jinyin Chen, Xuanheng Xu, Yangyang Wu, Haibin Zheng: GC-LSTM: Graph Convolution Embedded LSTM for Dynamic Link Prediction Paper

  • Jia Li, Zhichao Han, Hong Cheng, Jiao Su, Pengyun Wang, Jianfeng Zhang, Lujia Pan: Predicting Path Failure In Time-Evolving Graphs PaperCode

  • Aynaz Taheri, Tanya Berger-Wolf: Predictive Temporal Embedding of Dynamic Graphs Paper

  • Aynaz Taheri, Kevin Gimpel, Tanya Berger-Wolf: Learning to Represent the Evolution of Dynamic Graphs with Recurrent Models PaperCode

  • Aldo Pareja, Giacomo Domeniconi, Jie Chen, Tengfei Ma, Toyotaro Suzumura, Hiroki Kanezashi, Tim Kaler, Tao B. Schardl, Charles E. Leiserson: EvolveGCN: Evolving Graph Convolutional Networks for Dynamic Graphs PaperCode

  • Bing Yu, Haoteng Yin, Zhanxing Zhu: Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting PaperCode

  • Ling Zhao, Yujiao Song, Chao Zhang, Yu Liu, Pu Wang, Tao Lin, Min Deng, Haifeng Li: T-GCN: A Temporal Graph Convolutional Network for Traffic Prediction PaperCode

  • Jiawei Zhu, Yujiao Song, Ling Zhao, Haifeng Li: A3T-GCN: Attention Temporal Graph Convolutional Network for Traffic Forecasting PaperCode

  • Shengnan Guo, Youfang Lin, Ning Feng, Chao Song, Huaiyu Wan: Attention Based Spatial-Temporal Graph Convolutional Networks for Traffic Flow Forecasting PaperCode

  • Chuanpan Zheng, Xiaoliang Fan, Cheng Wang, Jianzhong Qi: GMAN: A Graph Multi-Attention Network for Traffic Prediction PaperCode

  • Zonghan Wu, Shirui Pan, Guodong Long, Jing Jiang, Xiaojun Chang, Chengqi Zhang: Connecting the Dots: Multivariate Time Series Forecasting with Graph Neural Networks PaperCode

  • Lei Bai, Lina Yao, Can Li, Xianzhi Wang, Can Wang: Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting PaperCode

  • George Panagopoulos, Giannis Nikolentzos, Michalis Vazirgiannis: Transfer Graph Neural Networks for Pandemic Forecasting PaperCode

  • Lei Shi, Yifan Zhang, Jian Cheng, Hanqing Lu: Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition PaperCode

  • Le Yu, Leilei Sun, Bowen Du, Chuanren Liu, Hui Xiong, Weifeng Lv: Predicting Temporal Sets with Deep Neural Networks PaperCode

External Resources - Datasets

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐