本文翻译整理自:https://towardsdatascience.com/kgcns-machine-learning-over-knowledge-graphs-with-tensorflow-a1d3328b8f02
知识图谱卷积网络 (Knowledge Graph Convolutional Network KGCN) 框架旨在提供一种通用的方法以基于 Grakn 知识图谱执行学习任务。通过监督学习,KGCN可以用来创建任意标记 Grakn 实例的向量表示和嵌入。我们可以直接基于存储在 Grakn 中的实例训练 KGCN,进行分类或回归。KGCN 用 Python 编写,可通过 PyPi 安装。
Github 地址:https://github.com/vaticle/kglib/tree/master/kglib/kgcn
很多数据其实并不适合以表格的形式进行存储或分析,而知识图谱这种复杂且相互关联的形式可以完整存储每个数据点的上下文信息。
然而,许多现有的机器学习流程都依赖于每个示例的输入向量。然而创建这样的向量来表示知识图谱中的节点并非易事。
为了充分利用机器学习中现有的一些想法、工具和流程,所以我们需要一种构建这些向量的方法。通过这种方式,我们才能利用知识图谱中的上下文信息进行机器学习。
这就是 KGCN 的意义所在。给定知识图谱中的一个示例节点,收集该示例附近的节点及其上下文信息。并基于这些信息,确定向量表示以及嵌入。
KGCN 适用于两个广泛的学习任务:
1.从知识图谱中进行监督学习以进行预测,例如多分类、回归、链接预测;2.无监督学习知识图谱的嵌入构建,例如用于聚类和节点比较任务。
为了构建有用的表示,KGCN 需要进行一些学习。为此它需要一个优化函数。重新审视这两个任务,我们有不同的情况来进行学习:
1.在有监督的情况下,我们可以针对想要执行的确切任务进行优化。在这种情况下,嵌入是学习流程中的临时张量;2.为了构建无监督嵌入作为输出,我们将最小化图中的一些相似性度量。
方法
KGCN 实现的方法基于 GraphSAGE,它非常适合在知识图谱上工作。KGCN 不是在典型的属性图上工作,而是从存储在类型化超图 Grakn 中的上下文数据中进行学习。除此之外,它还能从 Grakn 推导出的事实中进行学习。
接下来我们将介绍关键组件以及它们如何进行交互。
KGCN
KGCN 将为一组实例推导嵌入(从而直接学习对它们进行分类)。我们首先查询 Grakn,找到一组示例节点。随后,收集有关每个示例的上下文数据。
我们从 Grakn(上图)检索到有关该社区的数据,包括遇到的每个相邻实例的层次结构类型、角色和属性值,以及推测出的邻居(上图用虚线表示)。这些数据被处理成数组作为神经网络的输入。
再通过聚合和组合,我们就可以构建实例的单个向量表示形式,其中包含着广泛的上下文信息。
在监督学习中,这些嵌入是直接优化来执行任务的。对于多分类,我们通过将嵌入传递到单个后续全连接层并通过 softmax 交叉熵(针对示例的标签)确定损失来实现的;然后,进行优化以最小化损失。
一个 KGCN 对象汇集了许多子组件,包括上下文构建器、邻居查找器、编码器和嵌入器。
嵌入器
为了创建嵌入,我们在 TensorFlow 中构建了一个网络,该网络可以连续聚合并组合来自 K hops 的特征,直到保留“摘要”表示(下图)。
为了创建流程,嵌入器为所纳入的邻居的 K hops 进行聚合和组合操作。例如,对于 2-hop 情况,就意味着 聚合-组合-聚合-组合。
上图展示了在监督分类的情况下的工作流程。
嵌入器负责串联聚合器和组合器。
聚合器
聚合器(如下图所示)是实例邻居子样本的向量表示。它将产生一个代表所有输入的向量。因为邻居是无序的,所以它必须以一种与顺序无关的方式来做到这一点。为了实现这一点,我们使用一个全连接层,并使用 maxpool 输出(maxpool 与顺序无关)。
组合器
一旦我们将实例的邻居聚合成单个向量表示,我们接下来则需要将其与该实例本身的向量表示相结合。组合器通过连接两个向量来实现这一点,并使用单个全连接层以降低维数。
有监督 KGCN 分类器
基于知识图谱的监督学习和传统的监督学习差不多,首先我们也将基于训练集进行学习,但在这种情况下,每个实例都是一个子图。我们需要先对 Grakn 进行检索,提取这些子图。
然后对这些图进行编码,并输出到 KGCN。最后,我们将得到具有预测节点属性值的同样的图。这些预测的性质可以用来回归或分类我们的子图的概念(即拟合)。利用这种方法,我们可以将关系预测作为一个节点存在性的分类任务。
下面是该流程简化版的 UML 图。
KGCN 的构建
学习使用 KGCN 最快的方式是直接看 GitHub 中的 README(https://github.com/vaticle/kglib/tree/master/kglib/kgcn)。
主要的代码框架,如下所述:
代码语言:javascript复制import kglib.kgcn.core.model as modelimport kglib.kgcn.learn.classify as classifyimport tensorflow as tfimport graknURI = "localhost:48555"client = grakn.Grakn(uri=URI)session = client.session(keyspace=training_keyspace)transaction = session.transaction(grakn.TxType.WRITE)kgcn = model.KGCN(neighbour_sample_sizes, features_size, example_things_features_size, aggregated_size, embedding_size, transaction, batch_size)optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)classifier = classify.SupervisedKGCNMultiClassSingleLabelClassifier(kgcn, optimizer, num_classes, log_dir, max_training_steps=max_training_steps)training_feed_dict = classifier.get_feed_dict(session, training_things, labels=training_labels)classifier.train(training_feed_dict)transaction.close()