异质图上的节点分类
本教程指导如何利用AutoGL来对Deep Graph Library (DGL)中的异质图进行自动学习。
创建一个异质图
AutoGL支持DGL内的数据集。我们分别对HAN和HGT这两个模型提供了两个数据集,分别叫做 hetero-acm-han
和 hetero-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.