一种基于知识图谱嵌入的链接预测方法技术

技术编号:29975181 阅读:23 留言:0更新日期:2021-09-08 09:58
本发明专利技术公开了一种基于知识图谱嵌入的链接预测方法,目的是实现大规模知识图谱的快速链接预测。技术方案是先对知识图谱进行分区;然后构建嵌入模型和由N个服务器和共享文件系统组成知识图谱链接预测系统,训练时服务器作为主节点和训练节点,训练时服务器作为查询节点和预测节点,主节点安装有锁服务器进程,训练节点安装有数据加载进程和GPU训练进程;接着多机并行且CPU、GPU并行对嵌入模型进行分布式训练;最后N个服务器加载训练后的嵌入模型,对知识图谱链接进行并行预测;采用本发明专利技术既加快了知识图谱嵌入的训练和连接预测,又解决了分区造成的嵌入性能下降问题,能够快速获得高质量的知识图谱嵌入。质量的知识图谱嵌入。质量的知识图谱嵌入。

【技术实现步骤摘要】
一种基于知识图谱嵌入的链接预测方法


[0001]本专利技术涉及知识图谱链接预测领域,具体涉及一种基于知识图谱嵌入的链接预测的方法。

技术介绍

[0002]知识图谱(Knowledge Graph,KG)是真实世界信息的结构化表示,通常表示一个多关系图,即一个包含多种类型的节点和关系的图。KG由三个部分组成,实体集E,即现实世界中的事物,如人、地名、概念、药物、公司等的集合,例如“北京”就是一个实体;关系集R,即实体间的某种联系,例如“首都”关系表示一个实体是另一个实体的首都;三元组集T,表示事实,即实体间存在某种关系,例如三元组(北京,首都,中国),表示“北京是中国首都”这个事实。
[0003]虽然知识图谱包含大量三元组(事实),但人工输入所有的三元组是不可能的,因此知识图谱往往仍然存在着大量三元组缺失的问题。为了解决这个问题,知识图谱链接预测(linkprediction,LK)任务的目标根据已知的链接(三元组),自动预测实体之间的丢失链接。举例说明,给定一个缺失三元组(h,r,?)或(?,r,t),问号表示要缺失的实体,对于每一个缺失实体,链接预测任务使用所有的知识图谱中的实体作为候选项对三元组进行补全,然后预测补全后的三元组的有效性。
[0004]已有的研究采用知识图谱嵌入来处理链接预测问题。知识图谱嵌入将知识图谱中的每个实体和关系表示为低维向量(即嵌入),通过计算向量间的得分函数来判断三元组的有效性。嵌入模型的参数由实体嵌入向量和关系嵌入向量(或矩阵)组成,每个实体对应一个向量,每个关系对应一个向量(或矩阵)。
[0005]链接预测一般步骤如下:
[0006]1.构建嵌入模型。主要分为三步,表示实体、关系,定义得分函数,定义损失函数;表示实体、关系:嵌入模型的参数由实体嵌入和关系嵌入构成,目前已有的模型中,大多采用向量表示实体,使用向量或矩阵表示关系;得分函数:得分函数f(h,r,t)定义了如何使用实体和关系嵌入计算三元组(h,r,t)得分;损失函数:损失函数定义了使用三元组得分计算在训练数据集上的优化目标函数。
[0007]2.训练嵌入模型。以知识图谱中的三元组作为训练数据,通过梯度反向传播算法最小化损失函数来优化模型参数,得到嵌入模型;
[0008]3.使用嵌入模型进行链接预测。对输入的缺失三元组,使用训练好的嵌入模型快速预测有效三元组;例如:输入缺失三元组(h,r,?),以实体集E中所有实体作为候选实体,生成候选三元组{(h,r,t

)|t

∈E},计算所有候选三元组得分函数,以得分最高的三元组作为三元组预测结果,对应的{t

}即缺失实体预测结果。
[0009]虽然知识图谱嵌入是处理链接预测问题的有效方法,但是却很难直接扩展到工业级的知识图谱上,主要原因是知识图谱的规模越来越大,例如,脸书的知识图谱包含0.5亿实体,5亿三元组;微软的知识图谱包含20亿实体,550亿三元组;谷歌的知识图谱包含10亿
实体,700亿三元组;百度的知识图谱包含千亿级三元组。大规模知识图谱的实体数量很大,造成了实体嵌入参数的规模很大,使得使用显卡对嵌入模型进行训练时导致显存不足,且时间过长。
[0010]为了解决这两个问题,Facebook提出的PBG(PytorchBigGraph)采取分区训练方法,将知识图谱嵌入模型训练放到多台计算机组成的计算集群上同时进行训练,从而减少对单个训练设备的显存要求同时缩短计算时间。
[0011]PBG首先将实体分为P个互不重叠的分区,将三元组按照头实体和尾实体所在分区划分为不同的P2个三元组块。这样整个知识图谱由两部分组成,一部分是实体分区集Partitions={Part
k
|0≤k<P}(P为分区数量,为正整数),Part
k
表示第k个分区;另一部分是三元组块集Buckets={B(i1,j1)|0≤i1,j1<P}中三元组块B(i1,j1)中的任意三元组(h,r,t),其头实体h来自分区Patt
i1
,尾实体来自分区Part
j1
。训练时,集群中的每个服务器首先加载一个三元组块以及对应的分区实体嵌入到CPU内存进行预处理,然后再加载到GPU上中进行训练,这样对单个节点的内存和显存需求就被大大降低了。以FreeBase为例,它具有8000多万个实体和3亿多条边(三元组),当嵌入向量长度为400,总的实体嵌入需要120G存储空间,分区数量P=16时,每个分区的实体数量为500多万,嵌入参数大小为7.5G,为总大小120G的单个服务器在训练时最大仅需要存储2个分区,两个分区嵌入参数大小为15G,为总大小的极大的减少了知识图谱嵌入对单个服务器的GPU显存要求;另外,分区还为多个节点的并行训练提供了支持,例如三元组块B(0,1)和三元组块B(2,3)可以同时被不同的服务器进行训练。
[0012]但是,PBG知识图谱嵌入框架存在以下问题:1.分区训练时,服务器首先使用CPU进行数据交换和预处理,然后再将嵌入和三元组加载到GPU进行计算,这两个过程是串行的,因此CPU和GPU需要互相等待从而增加整个训练时间;2.因为进行了分区,分区后的三元组块的数据分布和整个知识图谱三元组的数据分布差异很大,因此最终得到的嵌入模型性能会有所下降,实验结果表明,在进行链接预测时,MRR(平均排序倒数,MeanReciprocalRank)随着分区数的增加而降低;3.只提供了知识图谱的嵌入训练和测试,缺少知识图谱嵌入在分布式集群中的链接预测应用。

技术实现思路

[0013]本专利技术要解决的技术问题是提出一种基于知识图谱嵌入的链接预测方法,采用CPU、GPU并行以及多机并行的优化方法快速获取工业级知识图谱的嵌入表示,并基于嵌入表示进行快速的链接预测,对知识图谱中缺失的三元组快速判断其有效性,从而实现大规模知识图谱的快速链接预测。
[0014]为了实现上述目的,本专利技术提供如下技术方案:
[0015]第一步:对知识图谱进行分区;根据需要确定分区数量P和每个分区的子分区数量PP,将所有的实体分为subP个不重叠的子分区,subP=P
×
PP,子分区为实体集E的互不重叠的子集,分区为PP个子分区的并集;将所有的三元组根据其头实体和尾实体所在子分区划分为不同的子三元组块;方法是:
[0016]1.1输入知识图谱数据,得到实体集E,关系集R,三元组集T,实体数量num_
entities,E中包含num_entities个实体,num_entities为正整数,T中包含num_triples个三元组,num_triples为正整数。例如:输入8个实体,2个关系的知识图谱,则E={e0,e1,e2,e3,e4,e5,e6,e7},e0,e1,e2,e3,e4,e5,e6,e7均为实体,R={r0,r1},r0,r1分别为关系,三元组集T={(e1,r0,e4),(e1,r0,e6),(e2,本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于知识图谱嵌入的链接预测方法,其特征在于包括以下步骤:第一步:对知识图谱进行分区;根据需要确定分区数量P和每个分区的子分区数量PP,将所有的实体分为subP个不重叠的子分区,subP=P
×
PP,子分区为实体集E的互不重叠的子集,分区为PP个子分区的并集;将所有的三元组根据其头实体和尾实体所在子分区划分为不同的子三元组块;方法是:1.1输入知识图谱数据,得到实体集E,关系集R,三元组集T,实体数量num_entities,E中包含num_entities个实体,num_entities为正整数,T中包含num_triples个三元组,num_triples为正整数;1.2设置超参数嵌入向量维度D、分区数量P、每个分区包含的子分区数量PP,得到总的子分区数量subP=P
×
PP,计算实体子分区大小subpart_size,subpart_size=num_entities/subP;1.3将实体集E随机打乱,然后按照子分区大小subpart_size将实体分割成subP个子分区集subpart,subpart中共有subP个实体子分区,每个实体子分区中含subpart_size个实体;1.4遍历三元组集T所有的三元组,根据三元组头实体和尾实体所属的分区,将三元组划分到对应的子三元组块中,得到subP2个子三元组块组成的子三元组块集合subBuckets,subBuckets={subBucket(i2,j2)|1<i2,j2≤subP},将子三元组块集合中所有的三元组块存储至共享文件系统;第二步:构建嵌入模型;方法是先表示实体、关系:嵌入模型采用嵌入向量表示实体和关系,将实体嵌入向量作为实体子分区嵌入矩阵行向量,将关系嵌入向量作为关系嵌入矩阵行向量,嵌入模型的参数由实体嵌入向量和关系嵌入向量构成;再定义得分函数:得分函数定义了如何使用实体和关系嵌入计算三元组得分;由实体子分区嵌入矩阵、关系嵌入矩阵、得分函数共同组成嵌入模型;第三步,构建知识图谱链接预测系统;知识图谱链接预测系统由包含N个服务器的计算集群和共享文件系统组成,N个服务器均包含CPU和GPU,N为正整数,;共享文件系统是计算集群的共享磁盘,负责存储实体子分区嵌入矩阵、关系嵌入矩阵θ、以及三元组块;N个服务器与共享文件系统相连,从共享文件系统获取嵌入模型,负责对嵌入模型进行训练,并对用户输入的要预测的实体缺失的三元组即缺失三元组,使用训练后的嵌入模型进行链接预测,得到预测结果;对嵌入模型训练时,每个服务器都是一个训练节点,从训练节点中选择一个作为主节点;主节点也是训练节点,除了运行训练节点的所有进程外,还要运行锁服务器进程,训练节点运行数据加载进程和GPU训练进程;数据加载进程负责从共享文件系统中读取和写入实体子分区嵌入矩阵、关系嵌入矩阵;链接预测时,每个服务器作为一个预测节点,从预测节点选择一个作为查询节点,各预测节点从共享文件系统加载训练后的嵌入模型,从查询节点获取用户输入的缺失三元组,然后使用嵌入模型进行预测;第四步,采用多机并行和CPU、GPU并行对嵌入模型进行分布式训练,将计算集群中的所有N个服务器作为训练节点,训练节点安装有数据加载进程和GPU训练进程,数据加载进程和GPU训练进程配合完成对嵌入模型的训练;从训练节点中任选一个作为主节点,主结点安
装有锁服务进程;主节点的锁服务进程按4.1的流程对三元组块进行调度,同时N个训练节点的数据加载进程按4.2的流程进行数据加载,同时N个训练节点的GPU训练进程按4.3的流程进行训练,4.1、4.2、4.3并行进行,完成分布式训练,得到训练后的嵌入模型;方法是:4.1主节点启动锁服务器进程,锁服务器进程调度每个训练节点进行训练所需的三元组块;调度方法如下:4.1.1锁服务器进程初始化活动列表active和完成列表done,active和done初始值都为空,active保存当前正在训练的三元组块编号,done保存已经训练完的三元组块编号;初始化三元组块总数num_buckets=P2,P为分区数量;4.1.2锁服务器进程接收N个训练节点发送来的信息,按照先到先得的顺序进行处理;如果信息为开始新的训练周期,转4.1.3;如果信息为请求三元组块,转4.1.4;如果信息为释放三元组块,转4.1.5;如果信息为结束训练,结束锁服务器进程;4.1.3新的训练周期开始,清空active和done,生成从分区到子分区的随机映射maps,并将maps发送到N个训练节点;转4.1.2;4.1.4为训练节点生成可训练的三元组块编号,得到可训练三元组编号res_bucket,并更新活动列表active和完成列表done;4.1.5将释放三元组块信息中的三元组编号从active移除;转4.1.2;4.2在N台训练节点上启动数据加载进程,N个训练节点的数据加载进程的流程完全相同,第n个训练节点进行数据加载的方法如下:14.2.1在内存中创建4个PP
×
subpart_size行D列的矩阵Embs1,Embs2,Embs3,Embs4,矩阵元素值初始化为0,令实体嵌入矩阵列表Embs=[Embs1,Embs2,Embs3,Embs4],令空闲矩阵序号列表free_idxs=[0,1,2,3];创建2个int类型进程间共享变量lock1=0,lock2=0;创建2个三元组编号curB1=(0,0),curB2=(0,0);创建2个实体嵌入矩阵序号列表EmbsIdx1,EmbsIdx2,分别初始化为长度为P的列表,列表元素均为0;创建2个三元组列表Triples1,Triples2,初始化为空;创建进程间传输管道conn,用于进程间数据传输,其数据类型为Pipe,创建训练标记is_training,初始化为True,类型为bool;创建共享参数列表shared_paras,shared_paras中包含两组共享参数,令shared_paras=[(lock1,curB1,Embsldx1,Triples1),(lock2,curB2,EmbsIdx2,Triples2)];4.2.2从共享文件系统中读取关系嵌入矩阵θ,在第n个训练节点中启动参数服务器,参数服务器负责将关系嵌入矩阵θ在N个训练节点之间进行同步;4.2.3令当前训练周期数epoch=1,获取用户定义的总训练周期数num_epoch,num_epoch为正整数;4.2.4如果epoch≤num_epoch,转4.2.5,否则转4.2.21;4.2.5如果第n个训练节点为主结点,向锁服务器进程发送开始新的训练周期信息,转4.2.6;如果第n个训练节点不是主结点,直接转4.2.6;4.2.6判断是否从锁服务器进程接收到分区到子分区的映射关系maps,若接收到maps,转4.2.7;若未收到maps,转4.2.6继续等待;4.2.7第n个训练节点开始第epoch轮训练周期的训练,初始化第epoch轮训练周期三元组块编号cur_b=None,next_b=None,old_b=None,next_arg_idx=0;cur_b是第epoch轮正在训练的三元组块编号,next_b是待加载的三元组块编号,old_b是已经训练完成的三元
组块编号,next_arg_idx是用于加载的共享参数在shared_paras中的序号;4.2.8从共享参数列表中取出第next_arg_idx+1个元素:令lock,curB,EmbsIdx,Triples=shared_paras[next_arg_idx]=shared_paras[next_arg_idx];使用get_lock()函数对输入为lock时获取临时变量L,使用acquire()函数对输入为L时获取是否成功标记is_buccess,如果is_success=True,转4.2.9,否则转4.2.8;4.2.9判断lock的值是否为0,如果是0,转4.2.10;否则,使用get_lock()函数对输入为lock时获取临时变量L,使用release()函数对输入为L时进行进程锁释放,转4.2.8;4.2.10向锁服务器进程发送获取三元组块请求,从主节点得到res_bucket和remaining;如果res_bucket为None且remaining为0,转4.2.17;如果res_bucket为None且remaining不为0,转4.2.10;如果res_bucket不为None,更新old_b=cur_b,cur_b=next_b,next_b=res_bucket,转4.2.11;4.2.11在内存和共享文件系统之间采用嵌入数据交换方法对next_b和old_b进行分区嵌入矩阵数据交换;4.2.12从共享文件系统中加载next_b三元组到内存;从maps获取分区Parth和Parth对应的子分区:maps[Parth]=[sh1,sh2,...shPP],maps[Partt]=[st1,st2,...,stPP];从共享文件系统中加载子分区对应的子三元组块{subBuckets[i3,j3]|i3∈maps[Parth],j3∈maps[Partt]},并重组为next_b三元组块Bucket,将Bucket保存至Triples;更新共享参数cur_B=next_b;4.2.13令lock=1,令next_arg_idx=(next_arg_idx+1)%2;4.2.14使用get_lock()函数对输入为lock时获取临时变量L,使用release()函数对输入为L时进行进程锁释放;4.2.15第n个训练节点从conn中接收训练完成信息;4.2.16转4.2.8;4.2.17更新old_b=cur_b,cur_b=next_b,next_b=None,使用4.2.11中的嵌入数据交换方法对更新后next_b,old_b进行嵌入数据交换;4.2.18第n个训练节点从conn中接收训练完成信息,更新old_b=cur_b,cur_b=next_b,next_b=None,使用4.2.11中的嵌入数据交换方法对更新后next_b,old_b进行嵌入数据交换;4.2.19如果第n个训练节点是主结点,将关系嵌入矩阵θ存储至共享文件系统,转4.2.20;如果第n个训练节点不是主结点,直接转4.2.20;4.2.20第epoch轮训练结束,令epoch=epoch+1,转4.2.4;4.2.21说明第n个训练节点已进行了num_epoch轮训练,得到了训练完成的知识图谱嵌入模型,令训练标记is_training=False;如果当前节点是主节点,则向锁服务器发送训练结束信息,转第五步,否则直接转第五步;4.3启动GPU训练进程,在数据加载完成的三元组块上进行模型训练,直至数据加载进程完成所有训练周期的数据加载;第n个训练节点的GPU训练进程首先尝试获取内存中数据加载进程完成加载的三元组块以及相应的实体分区嵌入矩阵,然后将训练节点内存中的实体嵌入矩阵列表Embs中的矩阵加载到GPU上进行训练,训练完成后将加载到GPU上的矩阵传回内存,并通知数据加载进程三元组块训练结束,由数据加载进程将训练完成的分区嵌入
矩阵存储至共享文件系统;第五步,计算集群加载训练后的嵌入模型,基于训练后的嵌入模型进行知识图谱链接预测;方法是:5.1将N个服务器作为预测节点,选择任意一个服务器作为查询节点;将第四步训练后的嵌入模型即共享文件系统中的实体子分区嵌入矩阵和关系嵌入矩阵加载到服务器中;具体方法如下:5.1.1在查询节点中,根据集群中服务器数量N,从共享文件系统中读取subP个实体子分区嵌入矩阵subEmbs1,subEmbs2,...,subEmb
ip
,...,subEmbs
subP
;5.1.2查询结点将子分区集subpart中的subP个集合,按照subpart中的顺序拼接成实体集E,将对应的subP实体子分区嵌入矩阵在行方向上拼接成实体嵌入矩阵Embs_all,Embs_all为一个num_entities行D列的矩阵;5.1.3查询结点将实体集E中的元素按照当前顺序均匀分割为N个实体分区Parts1,...,Parts
N
,将实体嵌入矩阵Embs_all在行方向上均匀分割为N个实体分区嵌入矩阵Embs1,Embs2,...,Embs
N
;查询节点将第1个分区Parts
n1
和第1个分区嵌入矩阵Embs1发送给第1个服务器,

,将第n个分区Parts
n
和第n个分区嵌入矩阵Embs
n
发送给第n个服务器,

,将第N个分区Parts
N
和第N个分区嵌入矩阵Embs
N
发送给第N个服务器;5.1.4 N台服务器从共享文件系统读取关系嵌入矩阵θ,将θ加载到N台服务器的内存中;5.2进行链接预测,方法是:5.2.1查询节点接收用户从终端输入的缺失三元组(e
hh
,rr,?),查询节点从矩阵Embs_all读取e
hh
的嵌入向量emb
hh
,并发送给N个预测节点;5.2.3N个服务器并行预测,第n台服务器的预测过程是:5.2.3.1第n台服务器从分区Part
n
取出所有的实体和实体e
hh
组成三元组,得到三元组集{(e
hh
,rr,e
tt

)|tt

...

【专利技术属性】
技术研发人员:黄震孙鼎李东升王艺霖乔林波汪昌健徐皮克陈易欣
申请(专利权)人:中国人民解放军国防科技大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1