论文阅读12---TransE(知识图谱嵌入),IterE,AMIE

TransE

TransE: Translating Embedding,将实体与关系嵌入到低维向量空间中,并对向量空间中的三元组(h,r,l)进行操作,把关系 r 视为“翻译”来进行建模的知识表示方法。

Motivation: 处理在低维向量空间中嵌入的实体和多关系数据的关系的问题【知识图谱(KG)是其中的重要的研究对象】
Advantage: 相比之前存在的诸多三元组的训练表示方法,更易于训练,且包含较少的参数,可以扩展到非常大的数据库,并且,在现实世界中存在的知识图谱上的链接预测方面可以显著优于发表时的最先进的方法。

1.论文摘要

      我们考虑在低维向量空间中嵌入多关系数据的实体和关系的问题。我们的目标是提出一种易于训练、包含较少数量的参数并且可以扩展到非常大的数据库的规范模型。因此,我们提出了 TransE,一种通过将关系解释为对实体的低维嵌入进行操作的翻译来对关系进行建模的方法。尽管很简单,但这种假设被证明是有效的,因为大量的实验表明 TransE 在两个知识库的链接预测方面显着优于最先进的方法。此外,它可以在包含 1M 实体、25k 关系和超过 17M 训练样本的大规模数据集上成功训练。

2.TransE 向量空间假设

TransE 对三元组(h,r,t)中的实体和关系映射到向量空间作了一些假设:

每一个三元组(h,r,t)都能表示为(h,r,t),其中,h是指头实体的向量表示,r是指关系的向量表示,t是指尾实体的向量表示

         通过不断调整来构建三元组(其中三元组的实体和关系都来自源知识图谱),来发现向量空间中,头实体向量 h加上关系 r等于尾实体向量 t的三元组,这个过程称为翻译,如果在向量空间这种关系成立,就说明三元组(h,r,t)所代表的知识表示可以看作是正确的,以此来发现实体间新的关系,如下图所示:

                                

      TransE 的功用在于:

      通过词向量表示知识图谱中已存在的三元组(所以TransE可以看作知识表示方法

     ② 扩大知识图谱中的关系网,扩充构建多元关系数据。其中,关系数据包括单一关系数据(single-relational data)和多元关系数据(multi-relational data)(单一关系通常是结构化的,可以直接进行简单的推理,多元关系则依赖于多种类型的实体和关系,因此需要一种通用的方法能够同时考虑异构关系)(所以TransE可以看作“活的”或“更高级的”的知识表示方法,因为可以做知识图谱上的链接预测,或作为媒介完善知识图谱)。

实验的训练集使用的是知识图谱中的实体集和关系集进行构造:

Given a training set S of triplets (h, l, t)
composed of two entities h, t ∈ E (the set of entities) and a relationship l ∈ L (the set of relationships)
即训练集中头实体向量和尾实体向量都来源于原知识图谱中的实体集,l 来自于知识图谱现有的关系集。

知识图谱(KG)中现存的关系构成关系集,实体构成实体集,我们抽取两个集合来构造三元组,让知识图谱(KG)中的成对的实体与每个关系做向量的运算,如果近似达到要求,就连接两个实体来补充完善知识图谱,从而挖掘或者说是发现实体间的多元关系,扩大知识图谱实体间的关系网,发挥链接预测的作用。

3.TransE原理分析

    ① 对知识图谱中的现有关系进行表示

在知识图谱的实体向量集中,随机取得头实体向量  尾实体向量并对初始三元组的对应向量进行替换(一次替换一个,另一种设计方案,替换关系 r ,也可以,原理一样),得到若干三元组d ( h’ + r,t’ ),构成训练集进行训练。

论文中提到了两类样本,即正样本三元组和负样本三元组,主观理解如下:

正样本三元组: 翻译关系成立的三元组称为正样本三元组(KG中原本存在的关系一定满足,另外,新构建的三元组一部分也满足翻译关系),这些样本从某种程度可以看作一类样本,可用于完善知识图谱或做链接预测表明两个实体存在这种关系。

负样本三元组: 通过均匀负采样技术得到: 随机替换 KG 中现有的三元组中的头实体向量或尾实体向量构建的样本视为错误的样本,即错误的样本【当然也有可能正好替换为正确的样本,对训练造成影响,这也是 TransE 的槽点之一吧,后期有通过改进这种负采样技术的方法】,这些错误的样本在这些三元组样本中,部分样本的翻译关系是不成立的(三元组中两个实体不存在这种关系),来辅助训练。

负采样过程示例:

里边有个负采样(替换)的过程,来构建出负样本三元组(替换的过程也会无意构成正样本三元组,因为这种无意充满不确定性,因此训练时影响最终的真实模型精度,因此在测试中也应该过滤掉,文中称为Filter),和正样本三元组一起构成训练集。训练的过程对每个三元组进行打分,因此这要进行打分函数的设计,训练中朝着确保正样本三元组的得分尽可能小,负样本三元组的得分尽可能大的方向进行,这样模型最终效果才会好,采用 mini-batch SGD来更新参数,找到相应的三元组,使得模型快速收敛。同时,在分类边界,损失函数中也设置间隔作为容错机制,使得最近的样本间隔最远,以此可使得模型对两者的分类效果或精度达到不错的水平,损失函数也相应越小。模型最终使用场景,输入头实体向量和关系,输出约十个置信度较高(通过排名得到)的尾实体向量的预测,同时去掉数据集(包括训练集,测试集和验证集)中的负样本三元组。因此在测试集中,可以通过看真实值在预测值里的命中率来评估。

这里我们也能看出 TransE 的另一个槽点:

由于头尾实体向量(统称为实体向量)在一个集合(ent2id 即 实体-id 词典)中,负采样也是在这个词典进行。
正如从 [ h + r ≈ t ] 的二维向量空间展示图中可以看到那样,如果 h + r ≈ t 代表 h 和 t 存在父子关系,谁父谁子是体现不了的。
作者提到知识图谱中可能没有箭头指向,更多关注这种存在的关系。

得分函数的设计 :

                         

算法流程:

注:d ( h + r,t ) = || h + r - t ||,距离公式 d ( h + r,t ) 可以取 L1 或 L2 范数,论文中的设置是 d ( h + r,t ) = || h + r - t ||( L1 / L2 可自行选择 ) = f (h,r,t),这是个小细节,我们可以看到正样本三元组距离函数值几乎为 0,负样本三元组的距离函数值较大,经过 L1 或 L2正则化确定最终的得分函数值,正则化后的值最终用于损失函数(这样可以避免训练出现过拟合),通过梯度下降朝着损失函数最小的方向更新参数(通过负采样,最小化损失函数来构建训练集,实际上,采集的样本随着参数的更新,在时序推进中,正样本的 d 会越来越小,负样本的 d 会越来越大),直至模型收敛,从而达到理想的精度。

                    

         L1/L2正则化以平方误差函数作为损失函数,分别加入 L1 正则项和 L2 正则项举例,目标是让损失函数最小,同时使得最终训练的模型避免过拟合现象,关键原理如下:

同理可得,对 r 和 t 的梯度。

损失函数更新的参数,是所有 entities 和 relations 的 Embedding 数据,包括h、r、t,每一次SGD更新的参数就是一个Batch中所有embedding的值,总参数是最初我们画的那俩矩阵的所有元素的个数之和。

       

损失函数的设计:

4. 实验部分

   数据集:WordNet 和 FreeBase

   评估:

1.在测试集中,不断从实体向量集中【原知识图谱中正确的三元组】替换头实体向量,我们可以通过损失函数的大小来判断新构建的三元组关系成立的可能性,给替换后的三元组的打分并升序排列,并保存可使得三元组关系成立的实体的得分。替换尾实体向量也是这个原理。
2.预测得分的平均值和和排在前10位的三元组中,关系成立的三元组的占比。
3.移除所有的训练集和验证集或者测试集中不成立的三元组,保证它们不属于数据集。

这相当于对头实体向量和尾实体向量做了预测,实验结果如图所示:

测试环节中,可将测试集分为Raw及Filter两种情况,Filter是指过滤corrupted triplets中在training, validation,test三个数据集中出现的正确的三元组。这是因为只是图谱中存在1对N的情况,当在测试一个三元组的时,用其他实体去替换头实体或者尾实体,这个新生成的反例corrupted triple确可能是一个正确triple,因此当遇见这种情况时,将这个triple从测试中过滤掉,从而得到Filter测试结果。 

按照元组中关系的类型,将测试集的按结果分类更细,或者将关系细化,作者展示了结果: 

 针对尾实体预测中的1-TO-M,按自己理解写了一个例子:

         

在划分好的测试集中验证泛化性能,左边是输入头实体和关系向量【来自于知识图谱中对应的向量或矩阵表示】,右侧的尾实体向量是在训练集中按照排名规则,最有可能是真实的一些尾实体(Top 10)。加粗的尾实体是测试集中与头实体和关系向量真正对应或者真实的尾实体,由此可验证模型的质量如何。

在少量样本中,给定头实体向量和关系,预测尾实体向量,左图表示测试集的平均排名情况(Loss),右图表示测试集Hits@top10中正确的比例(Accuracy)。可以发现当训练集越大,测试集中 TransE 的平均排名(或者说预测的平均损失值)下降的最快,右图表明,TransE模型的学习速度很快,在只有10个新关系的例子中,hits@10已经是达到约 18%,并且随着训练集中提供的样本数量的增加,效果改善明显。

 5.总结

TransE 方法的优缺点
优点
① 解决多关系数据的处理问题,是一种简单高效的 KG 表示学习方法
② 能够完成多种关系的链接预测任务,能够自动且很好地捕捉推理特征
③ 适合在大规模复杂的 KG 上推广,是一种有效的 KG 推理手段

缺点
表达能力不足,不能够有效充分的捕捉实体对间语义关系,无法有效处理一对多、多对一、多对多的关系以及自反关系。
处理图像信息效果差、负样本三元组的质量低、嵌入模型不能快速收敛、泛化能力差、边缘识别能力…

IterE

    这篇工作将知识图谱推理的两种典型方法,即表示学习和规则进行了结合,提出了IterE,并实现了两者的优势互补。

1 论文摘要

     推理对于大型知识图谱的开发至关重要,尤其是对于补全,其目的是根据现有的三元组推断出新的三元组。规则和嵌入都可以用于知识图推理,它们都有各自的优点和困难。基于规则的推理是准确且可解释的,但由于搜索空间巨大,通过图搜索进行规则学习总是会降低效率。基于嵌入的推理更具可扩展性和效率,因为推理是通过嵌入之间的计算进行的,但它很难学习稀疏实体的良好表示,因为良好的嵌入很大程度上依赖于数据的丰富性。基于这一观察,本文探讨了如何将嵌入和规则学习结合在一起,并利用各自的优势来弥补彼此的困难。我们提出了一种迭代学习嵌入和规则的新颖框架 IterE,其中规则是通过适当的修剪策略从嵌入中学习的,嵌入是从现有三元组和规则推断的新三元组中学习的。对 IterE 嵌入质量的评估表明,规则有助于提高稀疏实体嵌入的质量及其链接预测结果。我们还评估了 IterE 与 AMIE+ 相比的规则学习效率和规则质量,表明 IterE 能够更有效地生成高质量规则。实验表明,迭代学习嵌入和规则在学习和预测过程中是互惠互利的。

2 研究思路

    本文结合表示学习和规则挖掘的思路建立于我们发现了基于线性变换假设的表示学习模型对于规则挖掘具有很好的友好性,线性变换假设即将一个知识图谱中的三元组(h,r,t)中的头尾实体h和t表示为向量ht并将关系r表示为矩阵Mr,且假设对于正确的三元组满足 hMr=t。本文的规则类型参考了OWL2中的定义,选择了7种类型的规则,对于这7种规则,从线性变换假设中我们都可以得出一个特殊的结论如下表所示:

在KGE模型中,作者将常见的model分成两大类:1)translation-based assumption(例如TransE等) ℎ+r=t ;2)linear map assumption(例如ComplEx) Mℎ⋅Mr=Mt 。作者这里是采用了基于linear map assumption based的model,因为论文中是基于这一假设得到rule相应的conclusion的。

上表中的rule conclusion是本文从表示学习结果中学习规则的重要依据。

下面介绍本文的核心想法,如下图所示:

         

主要包含三个模块,Embedding Learning模块,Axiom Induction模块,以及Axiom Injection模块,下面分别简单介绍一个这三个模块的核心功能:

  • Embedding Learning模块:通过知识图谱中存在的三元组,随机负采样出来的反例以及规则推理出的三元组进行知识图谱的表示学习,本文采用的是基于线性变换假设的表示学习模型ANALOGY。

  • Axiom Induction模块:通过Embedding Learning模块学到的表示结果参考上文介绍的7种规则所对应的结论计算出置信度较高的规则。为了提高规则计算的效率,本文还设计了一个潜在规则集合的生成策略来有效地生成候选规则池。

  • Axiom Injection模块:根据Axiom Induction模块生成的规则集合为稀疏的实体推理出新的三元组并添加到知识图谱中以减小其对应的实体稀疏度,并为每一个新生成的三元组标上合适的真值标签。最后将添加了新的三元组的知识图谱再次送到Embedding Learning模块中以更新表示学习的结果。

从上面的介绍中可以看出,本文提出的方法是一个迭代进行表示学习和规则挖掘并进行互相增强的过程,所以我们将本文提出的方法命名为IterE。

 关于公理的演绎模块。其首先是得到一个公理池,利用全部训练集,利用搜索加剪枝,搜到支持度大于1的所有/尽可能多的公理,作为公理池(这个公理池是静态的,迭代进行中,不变)。然后每一轮迭代中利用当前关系的embedding,计算规则的score,在当前迭代轮中,筛选出置信度较高的公理用于下一部的公理注入。

公理的注入模块,主要关注于那些很稀疏的实体。关于实体的稀疏性的定义如下:

                        

利用注入的公理得到新的三元组,同时新得到的三元组回根据t-norm based fuzzy logics得到一个打分(这个打分会参与到最终的KGE模型的训练中)。这里的 π(g) 应该是(实体)实例化后公理的打分,这里是直接使用公理演绎模块为每一个(实体)未实例化的公理的score

                              

                                   

3 实验结果分析

在4个数据集上对IterE的进行了实验,并主要验证了以下三件事情:

 1.通过链接预测的实验我们证明了规则确实帮助提升了稀疏实体预测结果,实验结果如下:

2.通过表示学习确实提升了规则挖掘的效率,规则挖掘的效率和质量结果如下所示:

 3.在逐步迭代的过程中,表示学习结果和规则挖掘结果都实现了逐步增强,证明了迭代策略的有效性,结果如下:

AMIE(基于规则学习的方法)

基于规则的推理通过定义或学习知识中存在的规则进行挖掘与推理,从早期的ILP(Inductive Logic Programming)系统中衍生的AMIE、AMIE+算法, 强调通过自动化的规则学习方法,快速有效的从大规模知识图谱中学习出置信度较高的规则,并且应用于推理任务。

研究动机:

1.关联规则挖掘本质上实现了一个封闭世界假设(CWA)。不能用于向数据库中添加新项。

2.当前ILP系统不能用于语义知识库:因为1)ILP需要否定语句作为反例,但语义知识库通常不包含否定陈述。2)运行很慢。无法处理KB提供的大量数据。

1.论文摘要

     信息提取领域的最新进展催生了巨大的知识库 (KB),它以机器可读的格式捕获知识。归纳逻辑编程(ILP)可用于从知识库中挖掘逻辑规则。这些规则可以帮助推理缺失的知识并将其添加到知识库中。虽然ILP是一个成熟的领域,但从知识库中挖掘逻辑规则有两个方面的不同:首先,当前的规则挖掘系统很容易被数据量淹没(最先进的系统甚至无法在当今的知识库上运行)其次,ILP通常需要反例。然而,知识库实现了开放世界假设(OWA),这意味着缺失的数据不能用作反例。在本文中,我们开发了一个专门为支持 OWA 场景而定制的规则挖掘模型。它受到关联规则挖掘的启发,并引入了一种新颖的置信度度量。广泛的实验表明,我们的方法在精度和覆盖范围方面优于最先进的方法。此外,我们的系统 AMIE 的规则挖掘速度比最先进的方法快几个数量级。

2 基本定义

    Rule:原子是一个在subject和/或object位置可以有变量的fact。Horn规则由head和boday组成,其中head是单个atom,body是一组atoms.头部为r(x,y)、body为{B1,…,Bn}的规则

 Language Bias:AMIE使用Language Bias限制搜索空间。如果rule中的两个atom共享一个变量或一个实体,则它们是连接的。如果规则的每个原子都与规则的其他原子传递连接,则规则是connected。如果规则中的每个变量至少出现两次,则规则是closed。AMIE只研究connected rules,避免构造包含不相关atoms的规则。研究closed rules。

3.挖掘模型

模型:考虑一个给定的Horn规则~B⇒ r(x,y)。用关系r来看待所有facts。fact可以为知识库已知的真实事实(KBtrue),知识库未知的真实事实,知识库中已知的错误事实(KBfalse),以及知识库未知但错误的事实(NEWfalse)。该规则将做出某些预测(蓝色圆圈)。这些预测可以是正确的(A)、错误的(C)或未知的(B和D)。

            

目标:找到能够做出不在当前KB的True prediction的rule。即最大化区域B,并最小化区域D。

挑战:第一,区域NEWtrue和NEWfalse是未知的。我们希望使用面积KBtrue和KBfalse来估计未知面积。然而,这导致了第二个挑战:语义知识库不包含负面证据。因此,区域KBfalse为空

 解决挑战:

   本文定义了多个标准对规则质量进行评估

1.

规则的支持度量化了正确预测的数量。将规则的支持度定义为KB中出现的所有实例化的头部中不同的主题和对象对的数量。 同时符合规则体和规则头的实例数目。

2.构造负例的方法

  • Standard Confidence标准置信度

  将知识库中未包含的所有事实(即NEWtrue和NEWfalse)作为负面证据。规则的标准置信度是其在知识库中的预测的比例,即A区域在预测集中的比例,支持度除以仅符合规则体的实例数目。但是它主要描述已知数据,惩罚在未知区域进行大量预测的规则,与目的(能在知识库外做大量的正确预测)相反。

 

4.核心算法

该算法维护一个规则队列,最初只包含空规则。该算法迭代地将规则从队列中解队列。如果规则是闭合的,则输出该规则,否则则不输出。然后,算法对规则应用所有操作符,并将得到的规则添加到队列中(除非它们被puned out)。重复此过程,直到队列为空。

AMIE算法的全称是基于不完备知识库的关联规则挖掘算法(Association Rule Mining under Incomplete Evidence),通过依次学习预测每种关系的规则:对于每种关系,从规则体为空的规则开始,通过三种操作扩展规则体部分,保留支持度大于阈值的候选(闭式)规则。这三种操作分别为:

  1. 添加悬挂边(OD):悬挂边是指边的一端是一个未出现过的变量,而另一端(变量或常量)是在规则中出现过的
  2. 添加实例边(OI):实例边与悬挂边类似,边的一端也是在规则中出现过的变量或常量,但另一端是未出现过的常量,也就是知识库中的实体
  3. 添加闭合边 (OC):闭合边则是连接两个已经存在于规则中的元素(变量或常量)的边。

            

优点:一是可解释性强;二是自动发现推理规则。

缺点:搜索空间大,且生成的规则覆盖度低,最终模型的预测效果也比较差

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要安装TransE、TransH、TransR、TransD等知识图谱嵌入模型的Python包,可以使用pip install命令安装相应的包。 以下是TransE知识图谱嵌入模型的Python实现代码: ```python import numpy as np import tensorflow as tf class TransE: def __init__(self, entity_num, relation_num, dim, margin, learning_rate): self.entity_num = entity_num self.relation_num = relation_num self.dim = dim self.margin = margin self.learning_rate = learning_rate self.ent_embeddings = tf.get_variable(name="ent_embeddings", shape=[self.entity_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.rel_embeddings = tf.get_variable(name="rel_embeddings", shape=[self.relation_num, self.dim], initializer=tf.contrib.layers.xavier_initializer(uniform=False)) self.ent_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.rel_input = tf.placeholder(dtype=tf.int32, shape=[None]) self.ent_output = tf.placeholder(dtype=tf.int32, shape=[None]) self.pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_input) self.pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.ent_output) self.pos_r = tf.nn.embedding_lookup(self.rel_embeddings, self.rel_input) self.neg_h = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_t = tf.placeholder(dtype=tf.int32, shape=[None]) self.neg_pos_h = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_h) self.neg_pos_t = tf.nn.embedding_lookup(self.ent_embeddings, self.neg_t) self.predict = tf.reduce_sum(tf.abs(self.pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) self.loss = tf.reduce_sum(tf.maximum(self.predict - tf.reduce_sum(tf.abs(self.neg_pos_h + self.pos_r - self.pos_t), axis=1, keepdims=True) + self.margin, 0)) self.train_op = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) self.sess = tf.Session() self.sess.run(tf.global_variables_initializer()) def train(self, batch_h, batch_t, batch_r, batch_nh, batch_nt): _, loss = self.sess.run([self.train_op, self.loss], feed_dict={ self.ent_input: batch_h, self.rel_input: batch_r, self.ent_output: batch_t, self.neg_h: batch_nh, self.neg_t: batch_nt }) return loss def test(self, h, t, r): return self.sess.run(self.predict, feed_dict={ self.ent_input: h, self.rel_input: r, self.ent_output: t }) ``` 其中,entity_num表示实体的数量,relation_num表示关系的数量,dim表示嵌入维度,margin表示损失函数中的边际值,learning_rate表示学习率。 TransE模型中的实体和关系都被嵌入到dim维空间中,损失函数通过最小化正样本和负样本之间的距离来学习嵌入向量。 batch_h、batch_t和batch_r分别表示一批训练数据中的头实体、尾实体和关系,batch_nh和batch_nt分别表示一批负样本中的头实体和尾实体。 使用以下代码可以创建一个TransE模型的实例并进行训练: ```python model = TransE(entity_num, relation_num, dim, margin, learning_rate) for epoch in range(num_epochs): for i in range(num_batches): batch_h, batch_t, batch_r, batch_nh, batch_nt = generate_batch(batch_size) loss = model.train(batch_h, batch_t, batch_r, batch_nh, batch_nt) print("Epoch:", epoch, "Loss:", loss) ``` 其中,generate_batch函数用于生成一个batch的训练数据和负样本。训练过程中,每个epoch会迭代num_batches次,每次迭代使用一个batch的数据进行训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值