Skip to main content

DHG 是图神经网络和超图神经网络的深度学习框架。

项目描述

发布版本 PyPI 版本 网站建设状态 文件状态 下载 访问徽章 执照

网站| 文档| 教程|中文文档| 官方示例| 讨论

消息

  • 2022-09-25 -> v0.9.2现已推出!包括更多数据集、SOTA 模型和可视化!
  • 2022-09-25 -> v0.9.2正式发布!包含更多数据集、最新模型和可视化功能!
  • 2022-08-25 -> DHG 的第一个版本v0.9.1现已推出!
  • 2022-08-25 -> DHG的第一个版本v0.9.1正式发布!

DHG (DeepHypergraph)是基于PyTorch构建的深度学习库,用于学习图神经网络和超图神经网络。它是一个通用框架,支持低阶和高阶消息传递,例如从顶点到顶点从一个域中的顶点到另一个域中的顶点、从顶点到超边从超边到顶点从顶点集到顶点集.

它支持多种结构,如低阶结构(图、有向图、二分图等)、高阶结构(超图等)。各种基于谱的操作(如基于拉普拉斯的平滑)和基于空间的操作(如从域到域的消息 psssing)集成在不同的结构中。它为不同任务的性能评估提供了多种通用指标。实施了许多最先进的模型,并且可以很容易地用于研究。我们还为低阶结构和高阶结构提供各种可视化工具。

此外,DHG 的dhg.experiments模块(在Optuna上实现Auto-ML)可以帮助您在训练中自动调整模型的超参数,并轻松超越最先进的模型。


强调

  • 支持结构上的高阶消息传递:DHG 支持图结构上的成对消息传递和超图结构上的超成对消息传递。

  • 与 Pytorch 框架共享生态系统:DHG 建立在 Pytorch 之上,任何基于 Pytorch 的模型都可以集成到 DHG 中。如果您熟悉 Pytorch,则可以轻松使用 DHG。

  • 用于设计 GNN 和 HGNN 的强大 API:DHG 提供各种拉普拉斯矩阵和消息传递函数,分别帮助您构建基于光谱/空间的模型。

  • 图和超图 的可视化 DHG 为图和超图提供了强大的可视化工具。您可以轻松地可视化图形和超图的结构。

  • 弥合图和超图之间的差距:DHG 提供了从图构建超图和从超图构建图的功能。也许将图提升为超图可以利用那些潜在的高阶连接并提高模型的性能。

  • 将基于光谱/空间的操作附加到结构:在 DHG 中,那些拉普拉斯矩阵和消息传递函数附加到图/超图结构。一旦您使用 DHG 构建结构,这些功能就可以在构建模型的过程中使用。

  • 全面、灵活、方便:DHG 提供随机图/超图生成器、各种最先进的图/超图卷积层和模型、各种公共图/超图数据集和各种评估指标。

  • 支持使用 Auto-ML 调整结构和模型:Optuna 库赋予 DHG 自动 ML 能力。DHG 支持自动搜索构建图/超图结构的最佳配置以及模型和训练的最佳超参数。

安装

目前,DHG的稳定版本为 0.9.2。pip您可以按如下方式安装它:

pip install dhg

您还可以尝试使用DHG库的每晚版本(0.9.3),pip如下所示:

pip install git+https://github.com/iMoonLab/DeepHypergraph.git

Nightly 版本是DHG的开发版本。它可能包括最新的 SOTA 方法和数据集,但也可能不稳定且未经过全面测试。如果您发现任何错误,请在GitHub 问题中向我们报告。

快速开始

可视化

您可以使用 DHG 的可视化工具绘制图形、超图、有向图和二分图。更多细节见教程

图和超图的可视化

import matplotlib.pyplot as plt
import dhg
# draw a graph
g = dhg.random.graph_Gnm(10, 12)
g.draw()
# draw a hypergraph
hg = dhg.random.hypergraph_Gnm(10, 8)
hg.draw()
# show figures
plt.show()

有向图和二部图的可视化

import matplotlib.pyplot as plt
import dhg
# draw a directed graph
g = dhg.random.digraph_Gnm(12, 18)
g.draw()
# draw a bipartite graph
g = dhg.random.bigraph_Gnm(30, 40, 20)
g.draw()
# show figures
plt.show()

学习低阶结构

在图结构上,您可以使用 GCN 的拉普拉斯矩阵平滑给定的顶点特征:

import torch
import dhg
g = dhg.random.graph_Gnm(5, 8)
X = torch.rand(5, 2)
X_ = g.smoothing_with_GCN(X)

在图结构上,您可以通过以下方式将消息从一个顶点传递到另一个顶点mean

import torch
import dhg
g = dhg.random.graph_Gnm(5, 8)
X = torch.rand(5, 2)
X_ = g.v2v(X, aggr="mean")

在有向图结构上,您可以通过以下方式通过聚合将消息从顶点传递到顶点mean

import torch
import dhg
g = dhg.random.digraph_Gnm(5, 8)
X = torch.rand(5, 2)
X_ = g.v2v(X, aggr="mean")

在二分图结构上,您可以使用 GCN 的拉普拉斯矩阵平滑顶点特征:

import torch
import dhg
g = dhg.random.bigraph_Gnm(3, 5, 8)
X_u, X_v = torch.rand(3, 2), torch.rand(5, 2)
X = torch.cat([X_u, X_v], dim=0)
X_ = g.smoothing_with_GCN(X, aggr="mean")

在二分图结构上,您可以通过聚合将消息从U集合中的顶点传递到集合中的顶点:Vmean

import torch
import dhg
g = dhg.random.bigraph_Gnm(3, 5, 8)
X_u, X_v = torch.rand(3, 2), torch.rand(5, 2)
X_u_ = g.v2u(X_v, aggr="mean")
X_v_ = g.u2v(X_u, aggr="mean")

学习高阶结构

在超图结构上,您可以使用 HGNN 的拉普拉斯矩阵平滑给定的顶点特征:

import torch
import dhg
hg = dhg.random.hypergraph_Gnm(5, 4)
X = torch.rand(5, 2)
X_ = hg.smoothing_with_HGNN(X)

在超图结构上,您可以通过mean聚合将消息从顶点传递到超边:

import torch
import dhg
hg = dhg.random.hypergraph_Gnm(5, 4)
X = torch.rand(5, 2)
Y_ = hg.v2e(X, aggr="mean")

mean然后,您可以通过以下方式将消息从超边传递到具有聚合的顶点:

X_ = hg.e2v(Y_, aggr="mean")

或者,您可以通过以下方式将消息从顶点集传递到具有mean聚合的顶点集:

X_ = hg.v2v(X, aggr="mean")

例子

构建 GCN 的卷积层

class GCNConv(nn.Module):
    def __init__(self,):
        super().__init__()
        ...
        self.reset_parameters()

    def forward(self, X: torch.Tensor, g: dhg.Graph) -> torch.Tensor:
        # apply the trainable parameters ``theta`` to the input ``X``  
        X = self.theta(X)
        # smooth the input ``X`` with the GCN's Laplacian
        X = g.smoothing_with_GCN(X)
        X = F.relu(X)
        return X

构建 GAT 的卷积层

class GATConv(nn.Module):
    def __init__(self,):
        super().__init__()
        ...
        self.reset_parameters()

    def forward(self, X: torch.Tensor, g: dhg.Graph) -> torch.Tensor:
        # apply the trainable parameters ``theta`` to the input ``X``
        X = self.theta(X)
        # compute attention weights for each edge
        x_for_src = self.atten_src(X)
        x_for_dst = self.atten_dst(X)
        e_atten_score = x_for_src[g.e_src] + x_for_dst[g.e_dst]
        e_atten_score = F.leaky_relu(e_atten_score).squeeze()
        # apply ``e_atten_score`` to each edge in the graph ``g``, aggragete neighbor messages
        #  with ``softmax_then_sum``, and perform vertex->vertex message passing in graph 
        #  with message passing function ``v2v()``
        X = g.v2v(X, aggr="softmax_then_sum", e_weight=e_atten_score)
        X = F.elu(X)
        return X

构建 HGNN 的卷积层

class HGNNConv(nn.Module):
    def __init__(self,):
        super().__init__()
        ...
        self.reset_parameters()

    def forward(self, X: torch.Tensor, hg: dhg.Hypergraph) -> torch.Tensor:
        # apply the trainable parameters ``theta`` to the input ``X``
        X = self.theta(X)
        # smooth the input ``X`` with the HGNN's Laplacian
        X = hg.smoothing_with_HGNN(X)
        X = F.relu(X)
        return X

构建 HGNN 的卷积层 $^+$

class HGNNPConv(nn.Module):
    def __init__(self,):
        super().__init__()
        ...
        self.reset_parameters()

    def forward(self, X: torch.Tensor, hg: dhg.Hypergraph) -> torch.Tensor:
        # apply the trainable parameters ``theta`` to the input ``X``
        X = self.theta(X)
        # perform vertex->hyperedge->vertex message passing in hypergraph
        #  with message passing function ``v2v``, which is the combination
        #  of message passing function ``v2e()`` and ``e2v()``
        X = hg.v2v(X, aggr="mean")
        X = F.relu(X)
        return X

数据集

目前,我们添加了以下数据集:

  • Cora:用于顶点分类任务的引文网络数据集。

  • PubMed:用于顶点分类任务的引文网络数据集。

  • Citeseer:用于顶点分类任务的引文网络数据集。

  • BlogCatalog:用于顶点分类任务的社交网络数据集。

  • Flickr:用于顶点分类任务的社交网络数据集。

  • Github:用于顶点分类任务的协作网络数据集。

  • Facebook:用于顶点分类任务的社交网络数据集。

  • MovieLens1M:用于用户项目推荐任务的电影数据集。

  • AmazonBook:用于用户项目推荐任务的亚马逊数据集。

  • Yelp2018:用于用户项目推荐任务的餐厅评论数据集。

  • Gowalla:用户项目推荐任务的位置反馈数据集。

  • TecentBiGraph:用于顶点分类任务的社交网络数据集。

  • CoraBiGraph:用于顶点分类任务的引文网络数据集。

  • PubmedBiGraph:用于顶点分类任务的引文网络数据集。

  • CiteseerBiGraph:用于顶点分类任务的引文网络数据集。

  • Cooking200:用于顶点分类任务的烹饪食谱数据集。

  • CoauthorshipCora:用于顶点分类任务的引文网络数据集。

  • CoauthorshipDBLP:用于顶点分类任务的引文网络数据集。

  • CocitationCora:用于顶点分类任务的引文网络数据集。

  • CocitationPubmed:用于顶点分类任务的引文网络数据集。

  • CocitationCiteseer:用于顶点分类任务的引文网络数据集。

  • YelpRestaurant:用于顶点分类任务的餐厅评论网络数据集。

  • WalmartTrips:用于顶点分类任务的用户产品网络数据集。

  • HouseCommittees:用于顶点分类任务的委员会网络数据集。

  • News20:用于顶点分类任务的报纸网络数据集。

指标

分类指标

推荐指标

  • Precision@k:计算预测的precision@k。

  • Recall@k:计算预测的召回@k。

  • NDCG@k:计算预测的归一化折现累积增益@k。

检索指标

  • Precision@k:计算预测的precision@k。

  • Recall@k:计算预测的召回@k。

  • mAP@k:计算预测的 mAP@k。

  • NDCG@k:计算预测的归一化折现累积增益@k。

  • mRR@k:计算预测的平均倒数 Rank@k。

  • PR-Curve:计算预测的精确召回曲线。

实施模型

关于低阶结构

关于高阶结构

引用

如果您发现DHG在您的研究中有用,请考虑引用:

@article{gao2022hgnn,
  title={HGNN $\^{}+ $: General Hypergraph Neural Networks},
  author={Gao, Yue and Feng, Yifan and Ji, Shuyi and Ji, Rongrong},
  journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
  year={2022},
  publisher={IEEE}
}
@inproceedings{feng2019hypergraph,
  title={Hypergraph neural networks},
  author={Feng, Yifan and You, Haoxuan and Zhang, Zizhao and Ji, Rongrong and Gao, Yue},
  booktitle={Proceedings of the AAAI conference on artificial intelligence},
  volume={33},
  number={01},
  pages={3558--3565},
  year={2019}
}

DHG 团队

DHG由风一帆张新伟严杰龙纪舒一、高岳戴琼海等DHG核心团队开发。它由清华大学iMoon-Lab维护。您可以通过电子邮件联系我们。

执照

DHG 使用 Apache 许可证 2.0。

发布历史 发布通知| RSS订阅

这个版本

0.9.2