异质图上的节点分类

本教程指导如何利用AutoGL来对Deep Graph Library (DGL)中的异质图进行自动学习。

创建一个异质图

AutoGL支持DGL内的数据集。我们分别对HAN和HGT这两个模型提供了两个数据集,分别叫做 hetero-acm-hanhetero-acm-hgt [1]。

下面的代码片断提供了一个加载异质图的例子:

from autogl.datasets import build_dataset_from_name
dataset = build_dataset_from_name("hetero-acm-han")

你也可以通过访问存储在数据集对象中的数据来了解更多细节:

g = dataset[0]

node_type = dataset.schema["target_node_type"]
labels = g.nodes[node_type].data['label']
num_classes = labels.max().item() + 1
num_features=g.nodes[node_type].data['feat'].shape[1]

train_mask = g.nodes[node_type].data['train_mask']
val_mask = g.nodes[node_type].data['val_mask']
test_mask = g.nodes[node_type].data['test_mask']

你也可以通过在 AutoGL/autogl/datasets/_heterogeneous_datasets/_dgl_heterogeneous_datasets.py 目录下添加文件来建立自己的数据集并进行特征工程。我们建议用户参考DGL的官方文档,创建一个类型为 torch_geometric.data.HeteroData 的数据对象。

构建异质图神经网络模块

AutoGL集成了常用的异质图神经网络模型,例如HeteroRGCN (Schlichtkrull et al., 2018) [2],HAN (Wang et al., 2019) [3]和HGT (Hu et al., 2029) [4]:

from autogl.module.model.dgl import AutoHAN
model = AutoHAN(
    dataset=dataset,
    num_features=num_features,
    num_classes=num_classes,
    device = args['device'],
    init=True
).model

然后你可以对模型进行100次的训练:

# Define the loss function.
loss_fcn = torch.nn.CrossEntropyLoss()
# Define the loss optimizer.
optimizer = torch.optim.Adam(model.parameters(), lr=1e-2,
                             weight_decay=1e-2)

# Training.
for epoch in range(100):
    model.train()
    logits = model(g)
    loss = loss_fcn(logits[train_mask], labels[train_mask])

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    val_loss, val_acc, _, _ = evaluate(model, g, labels, val_mask, loss_fcn)

最后,你可以评估该模型:

_, test_acc, _, _ = evaluate(model, g, labels, test_mask, loss_fcn)

你也可以通过在 AutoGL/autogl/module/model/dgl/hetero 目录下添加文件来定义自己的异质图神经网络模型。

节点分类任务的自动搜索

在上述模块的基础上,我们提供了一个高级API求解器来控制整个流水线。我们将构建异质图神经网络模块部分的训练过程封装在求解器 AutoHeteroNodeClassifier 中,它支持自动超参数优化,特征工程及集成。 在这一部分,我们将使用ACM学术图数据集,来向你展示如何使用 AutoHeteroNodeClassifier 自动预测一篇论文发表在哪个会议上。

首先,我们得到预先定义的模型超参数:

from helper import get_encoder_decoder_hp
model_hp, _ = get_encoder_decoder_hp(args.model)

你也可以在一个字典(dict)中定义你自己的模型超参数:

model_hp = {
            "num_layers": 2,
            "hidden": [256],
            "heads": 4,
            "dropout": 0.2,
            "act": "leaky_relu",
        }

然后,在下面的例子中,直接使用 AutoHeteroNodeClassifier 来构建自动异质图神经网络模型:

from autogl.solver import AutoHeteroNodeClassifier
solver = AutoHeteroNodeClassifier(
            graph_models=["han"],
            hpo_module="random",
            ensemble_module=None,
            max_evals=1,
            device=args.device,
            trainer_hp_space=fixed(
                max_epoch=100,
                early_stopping_round=101,
                lr=1e-3,
                weight_decay=1e-2
            ),
            model_hp_spaces=[fixed(**model_hp)]
        )

最后,对模型进行拟合和评估:

solver.fit(dataset)
acc = solver.evaluate()

参考文献:

[1] https://data.dgl.ai/dataset/ACM.mat

[2] Schlichtkrull, Michael, et al. “Modeling relational data with graph convolutional networks.” European semantic web conference. Springer, Cham, 2018.

[3] Wang, Xiao, et al. “Heterogeneous graph attention network.” The World Wide Web Conference. 2019.

[4] Yun, Seongjun, et al. “Graph transformer networks.” Advances in Neural Information Processing Systems 32 (2019): 11983-11993.