图神经网络(11)— 在知识图谱上推理

目录

预测单跳查询(one-hop queries)

预测路径查询(path queries)

Traversing Knowledge Graphs in Vector Space(以TransE为例)

预测(多路)结合查询(conjunctive queries)

 Query2box**

思路:

算法概括:

box表示:

投影运算:

 intersection 操作:

实体到box的距离:

AND-OR QUERY( 拓展union操作)

如何训练 Query2box

如何产生训练样本


摘要:如何在知识图谱上进行推理,主要介绍Traversing Knowledge Graphs in Vector Space(以TransE为例) Query2box* 两个算法。

这篇文章,主要是讨论在不完整的知识图谱上推理,回答(预测)多跳的查询问题。

之后举的例子,都是以这个知识图为例子!

这个知识图谱有个特点:一种节点对应一种指向自己连边(interact不一样)

在知识图谱中的预测序列任务可以分为三种,单跳查询——从一个起始节点(实体)通过长度为1的边(关系)查询其他节点(实体);路径查询——从一个起始节点(实体)通过长度为n的边查询其他节点(实体);联合查询——从多个起始节点(实体)通过长度为n1,n2...的边查询共有的其他节点(实体)。下面是具体的示例:

预测单跳查询(one-hop queries)

        单跳查询——从一个起始节点(实体)通过长度为1的边(关系)查询其他节点(实体)

        这个问题很好解决,要回答单跳查询其实就等价于预测这两个节点之间是否有边连接。

预测路径查询(path queries)

        路径查询——从一个起始节点(实体)通过长度为n的边(关系)查询其他节点(实体)

 问题是,给我们一个知识图,怎么能找到最后的目标节点(实体)呢?

其实也很简单,就是从初始节点,按照关系r向前走就行!

但是,很不幸的是,知识图谱是不完整的,其中会缺少很多边。那么就会因此缺少很多应该得到的结果

我们也不可能先把知识图谱补充完整(太难了),再去推理结果。

因此我们需要一种在不完整的知识图谱上推理多跳结果的方法!

思路:把序列映射成向量,结果节点也映射成向量;序列embedding与之相对应的结果节点embedding应该接近。

Traversing Knowledge Graphs in Vector Space(以TransE为例)

其实就是利用TransE算出来各个实体(节点)和关系(边)的嵌入;那么序列的嵌入就等于起始节点嵌入加上多个边嵌入。

 例子:

TransE可以很轻易的处理多个关系结合(直接相加),所以可以处理多跳推理;但是对于TransR/DistMult/ComplEx 来说,不能处理多个关系的结合,所以不能处理多跳推理

预测(多路)结合查询(conjunctive queries)

多路结合查询只需要从多个节点开始,根据相应的关系向前推理,最后取交集。

 如果知识图谱是完整的话,就可以非常简单的得到结果,但是同样由于知识图谱不全,会漏掉结果。所以我们需要一个在不完整的知识图谱上预测的算法!

 Query2box**

更多细节可以看这篇论文,下载地址Query2box Reasoning over Knowledge Graphs in Vector Space Using Box Embeddings

思路:

Query2box把序列映射成boxes。而上面提到的拓展的transE算法,它是把序列映射成点(向量形式)

算法概括:

Query2box算法中,每一个box,它由中心点和偏移项表示实体(节点)被看作是没有容积的box,关系(边)被看作是一种投影运算—— 一个box通过关系的投影可以得到一个新的box。此外,还定义intersection操作。

以下面这个conjunctive queries 为例:

 我们可以把它简化成下面的形式: (intersection 表示交集)

 上图中每一个节点,他表示的不仅仅是一个实体(节点),他表示的是一个集合,表示的是一个范围。而在Query2box算法中,上图中每个节点都由一个boxs表示。

box表示:

每一个box,由中心点和偏移项表示,实体(节点)被看作是没有容积的box

下图是 由Fulvestrant造成的症状,我们用一个box表示。

投影运算:

关系(边)被看作是一种投影运算—— 一个box通过关系的投影可以得到一个新的box

 那么由知识图谱得到的表示方式,就可以化为在向量空间的表示:

 intersection 操作:

intersection操作,是获得多个box共有区域。这个共有区域要尽可能的小(offset小),并且交集box的中心要在一个“合理”的位置。

交集box中心:

 交集box偏移项:

实体到box的距离:

包括两个距离,实体到box边缘的距离和顶点到中心的距离。训练模型的时候,就是要使得模型得到的box到结果节点的距离最小。

AND-OR QUERY( 拓展union操作)

在知识图谱上的推理,除了求交集外,也有求并集的时候。例如说,What drug can treat breast cancer or lung cancer?  它用的or就对应着并集,而上面提到的交集一般对应着and。有Conjunctive 和disjunction的queries,被称作为Existential Positive First-order (EPFO) queries,也成为AND-OR QUERY。

问题:值得注意的是,在box的表示形式下,使用union操作的话,那么我们的嵌入空间维度会很大,节点越多维度越大。而在知识图谱中,节点非常多。

例如,在二维空间,是无法使用union,得到下图中仅包含v2和v4的box。在三维空间,便可以得到这四个节点任意两个节点的union box。

 解决方法:把union操作放到最后一步——也就是把AND-OR 查询 转换成 DNF形式。

 对于AND-OR queries,实体(节点)到box的距离就变成:实体(节点)到其中任意一个子box的最小距离。

 实体到box的距离很近,就表示这个实体(节点)是box所表示的queries的答案。对于实行union操作的子box,实体(节点)接近任意一个子box的都是答案。

处理流程: 

如何训练 Query2box

如何产生训练样本

 首先定义一些模板:

 然后根据模板实例化得到query:

1. 首先实例化answer节点:在KG上随机采样一个节点作为answer节点。

2.根据模板,由answer节点反着向前推理得到anchor节点。

3.由anchor节点根据KG推理得到所有的answer节点。

4. 负采样,选择answer节点之外的节点,作为query的错误answer。

举例说明。如果你想得到下面这个query作为样本。假设我们随机抽样,抽样到Fulvestrant作为answer节点,然后根据模板,反着推理。从Fulvestrant可以反推到anchor节点short of breath 和节点breast cancer。节点breast cancer可以接着反推到anchor节点ESR2。然后,我们再利用两个anchor节点,顺着推理得到 answer节点集(最右边的四个节点)。接着我们就能负采样不属于answer节点集的节点。

### 使用Python进行图神经网络知识图谱的开发 #### 开发环境搭建 对于图神经网络(GNNs)与知识图谱(KGs)的操作,推荐使用Linux或MacOS系统作为操作系统,因为这些平台提供了更丰富的开发工具和支持[^2]。确保安装最新的Python版本(建议使用Python 3.x),并配置必要的依赖库。 为了支持图卷积神经网络(GCNs)和其他类型的GNN算法,需安装PyTorch及其扩展包`torch_geometric`以及其他辅助库: ```bash pip install torch torchvision torchaudio -U pip install torch-scatter torch-sparse torch-cluster torch-spline-conv torch-geometric pip install numpy scikit-learn ``` #### 图神经网络基础概念 Graph Convolutional Neural Networks (GCNs) 是一种专门设计用于处理图形结构化数据的方法,在Web规模的推荐系统中有广泛应用[^1]。通过学习节点特征表示来捕捉复杂的关系模式,从而提高预测性能。 #### 实现简单GCN模型 下面是一个简单的GCN模型实现例子,该模型可以应用于各种基于图的任务上: ```python import torch from torch.nn import Linear import torch.nn.functional as F from torch_geometric.nn import GCNConv from torch_geometric.nn import global_mean_pool class GCN(torch.nn.Module): def __init__(self, input_dim, hidden_channels, output_dim): super(GCN, self).__init__() # 初始化两层GCN层 self.conv1 = GCNConv(input_dim, hidden_channels) self.conv2 = GCNConv(hidden_channels, output_dim) def forward(self, x, edge_index, batch=None): # 前向传播过程 h = self.conv1(x, edge_index).relu() h = F.dropout(h, p=0.5, training=self.training) h = self.conv2(h, edge_index) return h.log_softmax(dim=-1) # 定义损失函数和优化器 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) ``` 此代码片段展示了如何构建一个基本的GCN架构,并定义相应的训练流程。实际应用中还需要考虑更多细节,比如超参数调整、正则化技术等以应对特定挑战如稀疏性和大规模图数据等问题。 #### 知识图谱简介 知识图谱是一种语义网络的知识库,它不仅存储实体之间的关系信息而且能够表达复杂的逻辑推理能力。其在SEO、推荐系统等多个领域有着重要地位[^3]。 要创建自己的小型知识图谱,可以从定义域内的核心概念出发建立三元组形式的数据集——即主体(subject),谓词(predicate),客体(object)构成的事实陈述。之后利用现有的框架如RDFLib来进行管理和查询操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值