Python知识图谱和NLP之间的联系

浏览: 3468

现今网络上已经开源了大量的知识库,这些知识库往往以三元组的形式对知识进行存储,其中包含了大量常识性或专业性的知识。在这些知识库的基础之上,我们又可以构建问答机器人等上层应用。现如今,越来越多的NLP深度学习任务,加入了知识库信息,用于提升模型性能。那么如何将结构化的知识库三元组数据转换为像词向量一样的低维稠密的向量表示呢?

基础知识

了解知识图谱的人,多少会对网络上开放的知识库有所了解。较为知名的有DBPedia和YAGO,里面存储了几亿条三元组,富含丰富的百科知识。

三元组是存储一条知识的最简单形式。举个例子,对于美国总统是特朗普这样一条事实,转换为三元组就可以是<美国,总统,特朗普>,“美国”和“特朗普”这两个实体因为“总统”这个关系而联系了起来。又有一条事实是迈克尔乔丹的国籍是美国,转换为三元组就是<迈克尔乔丹,国籍,美国>。这两条简单的三元组,由于一个共同的结点“美国”而有了联系,我们可以推理出,乔丹的总统是特朗普这样一个新的知识。这就是图的特点。多个三元组就有可能组成一张千丝万缕、关系复杂的图谱。想象一下,如果有办法可以将“特朗普”、“迈克乔丹”等结点以及“总统”等关系,转换为向量表示,并添加到深度学习任务中去,那岂不是相当于让模型有了丰富的先验知识?

图嵌入

TransE是由Bordes等人在2013年发表在NIPS上的文章里的方法。TransE的目标就是将实体和关系进行分布式的向量表示。它的思路很简单,对于一条三元组<head, relation, tail>,通过不断的模型训练,使得。作者在论文中讲到,以前也有许多图embedding的方法,但是复杂度太高,作者提出的TransE方法,直观简洁,且效果更好。通过不断迭代,将上图混沌的结点和边变得如下图一样有条理,即相似的实体在空间中的分布更为接近,且表示一个实体的向量,通过加上一个关系的距离,可以合理的找到另一个实体表示的向量。这句话说的有点绕,看下图的例子。

Austin和Miami都是地名,它们在向量空间之间的距离更近,Patti、John、Jane都是人名,所以它们在向量空间的距离更近,同时,Patti(或Jane)加上_child_of这个关系的向量表示,就可以接近于达到Mom这个结点。

道理大家都懂了,那么模型该咋训练呢?作者定义了距离公式

,即头实体加上关系之后,与尾实体之间的距离。

负样本

但是,问题来了,我们只有正例,没有负例。啥意思呢?也就是说我们只有正确的样本,没有错误的样本,相当于在做分类任务的时候,我们只有label为1的样本,没有label为0的样本。该如何解决呢?作者通过制造负样本的方法来解决这个问题。具体操作为:对于一个三元组<h, r ,t>,我随机将t替换成其他的t',这不就构造了一条错误的三元组了嘛,负样本就这样产生了。

构建损失函数

其中啊,

什么意思?S'表示的负样本集合,它是通过从正样本中随机替换头实体或尾实体而得到的(注意,没有同时替换头尾实体)。表示如果其中的结果大于0,则取其值,否则取0,这其实和SVM中的margin loss是一样的,就是让正负样例之间的距离尽可能的大。

模型训练

如图是TransE训练过程的伪代码。如果读者仔细看的话,其中许多小技巧和词向量训练是很类似的,例如初始化方法。模型使用随机梯度下降进行训练,当loss下降到小于指定阈值时,就可以停止训练了。关于TransE的代码,从github上可以直接搜索找到,既有python版本的,也有C++版本的。C++版本的训练速度更快,只要你把数据整理成它要求的格式,在终端输入命令就可以了,训练出来的向量会保存到指定文件路径下。

缺点

缺点是显而易见的,但是由于其思路简单,且是Trans家族系列的鼻祖(据说TrasnA、TransB直到TransZ都有了),其在图嵌入领域一直都占有重要地位,这里简略介绍几个缺点,到时候可以在面试的时候忽悠一下面试官。

  • TransE在制造负样本时,是随机替换的头实体或尾实体,这就造成了一个问题,你替换了之后,得到的新的三元组有可能也是正确的,且有可能就存在已有三元组中。比如<石家庄,位于,河北>,替换尾实体得到<石家庄,位于,中国>等等等等...这就造成了模型训练存在误差。
  • 它不能有效处理一对多、多对一、多对多这样的情况,例如<A,同学,B>,<A,同学,C>,按照TransE的训练思路,B和C的向量应该是一样的,但是这其实是不合理的,尤其是当知识图谱中存在大量这样的多对多关系时,TransE的效果尤其差,这些也可以在它论文的实验结果看到。

后面其他后继者提出的TransH、TransR等几乎都是为了解决上述问题,但是说实话,提升效果有限。

PS:借鉴TransE的思想,就可以将结构化的数据表进行embedding。毕竟结构化的数据表也可以转换为图的形式,例如主键作为head,列名作为关系,列下的value作为tail构成三元组。

TransE的整体思路就跟大家介绍完了,想学习多关系图嵌入的同学,可以在此基础上,把原论文读起来了。

欢迎关注我的公众号“数据科学杂谈”,原创技术文章第一时间推送。

image.png

推荐 0
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册