我想创建一个神经网络,它以知识楔子图(不同类型的节点和不同类型的边)作为输入来预测某些属性。例如,图中的输入可以是:
:Mike :likes :chocolate;
:studies :Biology.
假设我们有 n 个节点和 r 个关系类型。我如何将其作为神经网络的输入提供,以及神经网络的架构将是什么样子。
我想创建一个神经网络,它以知识楔子图(不同类型的节点和不同类型的边)作为输入来预测某些属性。例如,图中的输入可以是:
:Mike :likes :chocolate;
:studies :Biology.
假设我们有 n 个节点和 r 个关系类型。我如何将其作为神经网络的输入提供,以及神经网络的架构将是什么样子。
您可以将这种类型的知识图表示为二进制张量。(如果有帮助,您可以将其视为 3D 矩阵。)
第一个维度是关系左侧的节点,第二个维度是关系类型,第三个维度是关系右侧的节点。然后,您可以通过在正确的索引中插入一个节点来表示两个节点之间的任何关系。
为了演示,假设我们有 4 个节点:Mike索引 0、Sully索引 1、chocolate索引 2 和Biology索引 3。
假设我们有 2 个关系:(likes索引 0),studies(索引 1)。
我们将首先创建一个用零填充的张量:
import torch
graph = torch.zeros([4, 2, 4], dtype=torch.bool)
""" Output:
tensor([[[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False]]])
"""
为了表示这种关系:Mike :likes :chocolate;,我们将在位置 [0, 0, 2] 处插入一个 1(0 表示 Mike,0 表示喜欢,2 表示巧克力)。
为了表示:Mike :studies :Biology,我们在 [0, 1, 3] 处有一个。
# :Mike :likes :chocolate
graph[0, 0, 2] = 1
# :Mike :studies :Biology
graph[0, 1, 3] = 1
""" graph:
tensor([[[False, False, True, False],
[False, False, False, True]],
[[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False]],
[[False, False, False, False],
[False, False, False, False]]])
"""
当然,我们可以表示 2 个节点之间的任何关系。让我们再添加一些:
# Mike and Sully are friends
# :Sully :likes :Mike
graph[1, 0, 0] = 1
# :Mike :likes :Sully
graph[0, 0, 1] = 1
# I suppose chocolatogoly is a subject in Biology
# :Biology :studies :chocolate
graph[3, 1, 2] = 1
关于架构,至少有两种可行的方法可以将此表示提供给神经网络。您可以展平整个图形并将其视为一维输入。另一种选择是保留 3 维并使用卷积层(或其他东西)来提取特征(3D 卷积的工作原理与 2D 卷积一样)。
至于其余的架构,这取决于你!