输入数据训练模型时,Pytorch-Geometric 中不使用训练掩码(文档)

Training mask not used in Pytorch-Geometric when inputting data to train model (Docs)

我正在研究 Pytorch-Geometric 文档 (here)。

在下面的代码中,我们看到 data 在没有 train_mask 的情况下传递给模型。但是,当将输出和标签传递给损失函数时,train_mask 将应用于两者。在将 train_mask 输入到模型中时,我们不应该将 train_mask 应用于 data 吗?在我看来,这应该不是问题。但是,看起来我们正在将计算浪费在未用于训练模型的输出上。

model.train()
for epoch in range(200):
    optimizer.zero_grad()
    out = model(data)
    loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])
    loss.backward()
    optimizer.step()

我认为主要的答案是它使代码更加复杂。

你不能简单地说 out = model(data[data.train_mask])。 (这会引发异常,因为 Data 对象不支持这种切片方式)。

您可以有单独的对象 train_data test_data 等,但这会使代码复杂得多。

我认为 Pytorch Geometric 示例中仅计算所有节点的输出的主要原因与另一个答案中提出的“无数据切片问题”不同。您需要比 train_mask 包含的更多节点的隐藏表示(由图卷积派生)。因此,您不能简单地只提供这些节点的特征(分别是数据)。但是可以进行一些优化,我将在最后讨论。

我假设您设置的是节点分类(如示例代码和您问题中的 link)。

例子

让我们使用一个小玩具示例,其中包含五个节点和以下边:

A<->B
B<->C
C<->D
D<->E

并假设您使用只有节点 A 的 2 层 GNN 作为训练。要计算 A 的 GNN 输出,您需要 B 的第一个隐藏表示,它使用 C 的输入特征。因此,您需要 A 的 2 跳邻域来计算其输出。

可能的优化

如果你有多个训练节点(通常有)并且你有一个 k 层 GNN,它通常(并不总是以稀释的 GNN 为例)在 k-hop 邻域上运行。然后,您可以通过为每个训练节点组合 k-hop 邻域来计算连接的节点集。由于这是模型相关的并且需要一些代码,我猜它没有包含在“实例介绍”中。无论如何,您可能只会看到对较大图形的影响,而对像 Cora 这样的图形的影响可以忽略不计。