查看原文
其他

知识表示技术:图谱表示VS图网络表示及基于距离函数的表示学习总结

刘焕勇 老刘说NLP
2024-10-08

上一文章中,我们介绍了基于随机游走的节点嵌入学习方法,其充分借鉴了自然语言处理中的word2vec思想,通过随机游走,形成节点序列,然后后接skipgram进行邻居节点预测,以完成节点学习。在这一思想下,先后出现了同时考虑同质性与结构性的带偏游走node2vec、考虑一阶和二阶相似性的LINE等。

由于图网络中,更多的将无向,节点类型以及节点边类型加以忽略,所学习到的节点嵌入本质上是在还原图的一阶或二阶邻居,即图的结构信息。而对于知识图谱这种网络结构而言,其是由异构的复杂关系三元组形成的网络,在复杂知识推理需求的推动下,如何将实体或实体关系嵌入加以学习,成为了一个经典问题。

本文主要围绕知识图谱嵌入学习这一主题,对比知识图谱嵌入与图网络嵌入的异同,并介绍基于Score函数的知识图谱表示方法,希望能够带来一定的思考。

一、网络嵌入VS知识图谱嵌入

就图嵌入而言,分为图网络嵌入graph embedding以及知识图谱嵌入knowledge graph embedding两种。

而这两种图网络,虽然本身都是图结构,但其还是存在较大的差异点。下面援引一种种公开的观点加以说明:

从起源看,这两个任务中最火的方法TransE和DeepWalk,都是受到了word2vec启发提出来的,只是前者是受到了word2vec能自动发现implicit relation (也就是大家常说的 king - man = queen - woman)的启发;而后者受到了word2vec处理文本序列、由中心词预测上下文的启发。

两者的相同之处是目标一致,都旨在对研究对象建立分布式表示。不同之处在于,知识表示重在如何处理实体间的显式关系上;而网络表示重在如何充分考虑节点在网络中的复杂结构信息(如community等)”。

进一步的,我们可以细分以下几点展开论述:

1、共同点与联系

两者都是表示学习,目标都是将实体或者关系或者结点表示成一个向量,用这个向量去做分类、聚类等;

知识图谱表示学习是特殊的网络表示学习;网络表示学习是更一般的知识图谱表示学习;

两种方法都可以统一在encoder-decoder的框架下,不过由于隐空间下的距离度量和设计的loss不同,模型有所变化;

两种方法的模型可以在相关任务通用,但算法性能差别较大;

异质信息网络和知识图谱都可以用图的形式进行表示。

2、学习目标上的不同


网络表示学习强调节点表示,这为下游任务节点分类,链接预测,网络重构,网络可视化等提供了方便。知识图谱表示学习强调节点之间的关系表示。


网络表示更加侧重度量图结构信息,其学习目标在于在低维空间中学习到的表征可以重构出原有网络结构,因此网络表示学习利用了网络的结构特征,之所以要将原始问题转化为图网络也是这个道理,从网络中可以发现传统方法发现不到的结构信息。学习到的表征可以有效地支持网络推断。

具体的,网络表示学习没有明显的结点之间的关系,网络中各个结点相互连接,所有结点是一视同仁。因此,更注重在嵌入空间保留(拓扑)结构信息,注重节点表示建模,之所以要将原始问题转化为图网络也是因为从网络中可以发现传统方法发现不到的结构信息。

网络表示比较注重在嵌入式空间中保留网络的拓扑结构信息,知识图谱的表示在保留结构信息的基础上,也同样注重于关系的重要性,以及它们的头尾关系。知识图谱表示学习更偏向关系建模,在保留结构信息的基础上强调关系和头尾关系,强调的是节点和关系的表示,节点和关系同样重要,因此,知识图谱表示学习中往往指明了关系,比如水果和猕猴桃之间是所属关系。


3、学习方法上的不同

网络表示学习通常包括三种:基于矩阵分解的模型,比如SVD;基于随机游走的模型,比如DeepWalk;基于深度神经网络的模型,包括CNN、RNN等;此外还有同质网络、异质网络的区分,还有属性网络、融合伴随信息的网络等。

与此不同的是,典型的知识图谱表示算法包括trans系列的算法,如TransE、TransR、TransH等,通过这个三元组去刻画实体和关系的向量表示。

二、知识图谱嵌入中的复杂关系

因此,我们可以看到,知识图谱表示,对于关系模式的建模要求较高,因此就会存在典型的关系复杂性问题。


当前将知识图谱嵌入几何空间时,需要解决知识图谱中的复杂关系推理问题,包括对称性(symmetry)、对称性(anti-symmetry)向性(inversion)组合性(composition)等。


例如:

1、一对多。例如,北京语言大学的校长有多个,某个地方包含某些地方;

(2008 Summer Olympics, participating_countries, Djibouti)

(2008 Summer Olympics, participating_countries, Mauritania)


2、多对一问题。某些人的性别为男。

(The Last King of Scotland, /film/genre, War film)

(Legends of the Fall, /film/genre, War film)

(Henry V, /film/genre, War film)


2、对称性(symmetry)。例如朋友这一关系,是对称的。<小明,朋友,小红>,可以得到<小红,朋友,小明>;


3、反对称性(anti-symmetry)。例如父亲这一关系具备反对称性;


4、反向性(inversion)。例如父亲和儿子是一对反对称性关系;


5、组合性(composition)。例如,父亲的父亲是爷爷这一类关系;


三、基于Score函数的知识图谱表示方法

基于Score评分函数的知识图谱表示方法是当前主流的方法之一,其核心思想在于给定三元组(h,r,t),h和t都是实体,r是关系,通过投影、旋转等方式,可以将s实体和关系映射到一个空间当中,并且设计距离度量方式,可以有效建模实体和关系之间的关系。平移距离模型利用了基于距离的评分函数,通过两个实体之间的距离对事实的合理性进行度量。

因此,评分函数是其中的核心:


下面选择TransE、TransH、TransR、TransD、RotatE以及PairRE等几个代表方法进行介绍。


1、TransE

表示学习在自然语言处理领域受到广泛关注起源于Mikolov等人于2013年提出的word2vec词表示学习,利用该模型,Mikolov等人发现词向量空间存在平移不变现象:

受到该平移不变现象的启发,Border等人提出了TransE模型,将知识库中的关系看作实体间的某种平移向量。对于每个事实三元组(h,r,t),TransE模型将实体和关系表示为同一空间中,把关系向量r看作为头实体向量h和尾实体向量t之间的平移即h+r≈t。

例如:对于给定的2个三元组:

(姜文, 导演, 邪不压正)、(冯小刚, 导演, 芳华) 

可以得到:

姜文+ 导演≈邪不压正

冯小刚+导演≈芳华

还可以通过平移不变性得到:

邪不压正 - 姜文 ≈芳华 –冯小刚,

即得到两个事实相同的关系(DirectorOf)的向量表示。

这一操作,我们可以将r看作是从h到t的翻译,因此TransE也被称为翻译模型,ji 给定三元组(h,r,t),h和t都是实体,r是关系,模型是将所有的实体和关系映射到k维的线性空间里,基本的思想是用h+r去逼近t,h+r将会逼近正确的t,远离不正确的t。

    def TransE(self, head, relation, tail, mode):
        if mode == 'head-batch':
            score = head + (relation - tail)
        else:
            score = (head + relation) - tail

        score = self.gamma.item() - torch.norm(score, p=1, dim=2)
        return score

为了衡量这个逼近可以使用L1正则或L2正则来进行度量;

在训练的过程中,负样本的构造比较有意思,其思想是在原来正样本的基础上,将头实体或者尾实体随机一个进行替换,替换成语料库中正确的实体除外的任意一个实体,需要注意的是,不能同时替换头实体和尾实体。

2、TransH

TransH主要用于解决TransE一对多、多对一、多对多的问题。该工作认为,实体在不同的关系上有不同的表示,因此使用超平面映射来实现。

在具体实现上,假设所有的关系都有一个超平面,所有的头实体和尾实体都会映射到超平面上,在这个关系超平面上满足TransE的关系。如下图所示:

对于每一种关系r都有一个对应的dr向量,wr是dr向量所在平面的单位法向量。首先将h与t向量根据关系r的向量dr投影到r所在的平面,即:根据向量的三角形法则,投影的向量等原向量减去垂直的向量

   def TransH(self, inputTriple):
        # Step1
        head, relation, tail = torch.chunk(inputTriple,
                                           chunks=3,
                                           dim=1)
        # Step2
        head = torch.squeeze(self.entityEmbedding(head), dim=1)
        relHyper = torch.squeeze(self.relationHyper(relation), dim=1)
        relation = torch.squeeze(self.relationEmbedding(relation), dim=1)
        tail = torch.squeeze(self.entityEmbedding(tail), dim=1)
        # Step3
        head = head - relHyper * torch.sum(head * relHyper, dim=1, keepdim=True)
        tail = tail - relHyper * torch.sum(tail * relHyper, dim=1, keepdim=True)
        # Step4
        return self.distfn(head+relation, tail)
        
        
        

3、TransR

TransE/TransH模型存在几个明显的问题,即关系和实体由于是不同类型的点,可能存在于不同的空间,一个实体可能有不同方面的意思,不同的关系可能聚集在实体的不同方面,这导致了建模的时候使用公共的空间是不够的。

因此,这篇文章认为实体和关系有专门的实体空间和关系空间,从而实体和关系的嵌入向量的维度是不同的。

因此,在具体实现上,引入矩阵(matrix)的映射Mr,对于每一种关系r,都有一个对应的映射矩阵Mr,将entity映射到relation空间

具体实现如下:

 def TransR(self, h, r, t):

        # torch.nn.embedding类的forward只接受longTensor类型的张量
        head = self.ent_embedding(h)
        rel = self.rel_embedding(r)
        rel_mat = self.rel_matrix(r)
        tail = self.ent_embedding(t)

        head = self.transfer(head, rel_mat)
        tail = self.transfer(tail, rel_mat)

        head = F.normalize(head, 2, -1)
        rel = F.normalize(rel, 2, -1)
        tail = F.normalize(tail, 2, -1)
        distance = head + rel - tail
    
        score = torch.norm(distance, p = self.norm, dim=1)
        return score

4、TransD

该工作主要是解决了TransR存在的几个典型问题:

首先,对于一个特定的关系r,所有的实体共享同一个映射矩阵Mr,在一个三元组中,头实体和尾实体基本是不同的,可能一个是人名,一个是国家名等等,但做的映射是相同的,都是乘以映射矩阵Mr;

其次,投影的操作是由实体和关系之间共同的交互作用,仅仅只由关系来确定映射矩阵是不合理的;

另外,每一个关系都有一个Mr,参数量较大,当数据集中关系较多时,TransR的参数甚至远远多于TransE和TransH。所以TransR和CTransR很难应用于大规模。

因此,该工作将映射矩阵Mr分解成为两个向量相乘,参数量由k×d变成k+d。在TransD中,对于每一个实体和关系,定义了两个向量,一个表示实体和关系的含义,另一个称为projection vector,他将用来使实体嵌入投影到关系嵌入的空间,并且用来构建映射矩阵。因此,每一个实体-关系对有唯一的映射矩阵。

5、RotatE

TransE模型将relaltion表示为translation,旨在对 inversion 和 composition 这两种模式进行建模;DisMult模型用三种方法对头实体-关系-尾实体建模,旨在对 symmetry模式建模;但这些模型都无法建模和推断所有上述模式。因此,RotatE提出了一种称为RotatE的知识图谱嵌入的新方法,该方法能够建模和推断对称/反对称、传递性以及自反性三种模式。

在具体实现上,RotatE模型将每个关系定义为在复矢量空间中从源实体到目标实体的旋转。

在具体实现上:

    def RotatE(self, head, relation, tail, mode):
        pi = 3.14159265358979323846
        
        re_head, im_head = torch.chunk(head, 2, dim=2)
        re_tail, im_tail = torch.chunk(tail, 2, dim=2)

        #Make phases of relations uniformly distributed in [-pi, pi]

        phase_relation = relation/(self.embedding_range.item()/pi)

        re_relation = torch.cos(phase_relation)
        im_relation = torch.sin(phase_relation)

        if mode == 'head-batch':
            re_score = re_relation * re_tail + im_relation * im_tail
            im_score = re_relation * im_tail - im_relation * re_tail
            re_score = re_score - re_head
            im_score = im_score - im_head
        else:
            re_score = re_head * re_relation - im_head * im_relation
            im_score = re_head * im_relation + im_head * re_relation
            re_score = re_score - re_tail
            im_score = im_score - im_tail

        score = torch.stack([re_score, im_score], dim = 0)
        score = score.norm(dim = 0)

        score = self.gamma.item() - score.sum(dim = 2)
        return score


6、PairRE


由于之前的TransH、TransD和TransR等方法致力于解决复杂关系表示问题,却只能编码对称/非对称关系,最新的RotatE在编码对称/非对称关系,逆向关系和组合关系上取得了优异的效果,但是复杂关系的预测依然具有挑战性。


由此,论文提出了一种新的知识图谱嵌入方法PairRE,它能够同时编码复杂的关系和多种关系模式。

在具体实现上,模型中使用的两个用于关系表示的向量将头尾实体分别投影到欧式空间,再最小化投影向量的距离。

具体实现如下:

    def PairRE(self, head, relation, tail, mode):
        re_head, re_tail = torch.chunk(relation, 2, dim=2)
        ''
        atten_head = torch.matmul(head, self.attention_embedding)
        atten_head = F.softmax(atten_head, dim=2)
        #atten_head = self.attention_embedding.unsqueeze(0).repeat(head.size()[0], 1, 1)
        #atten_head = F.softmax(torch.bmm(head, atten_head), dim=2)
        head = head * atten_head

        atten_tail = torch.matmul(tail, self.attention_embedding)
        atten_tail = F.softmax(atten_tail, dim=2)
        #atten_tail = self.attention_embedding.unsqueeze(0).repeat(tail.size()[0], 1, 1)
        #atten_tail = F.softmax(torch.bmm(tail, atten_tail), dim=2)
        tail = tail * atten_tail
        '
''
        head = F.normalize(head, 2, -1)
        tail = F.normalize(tail, 2, -1)

        score = head * re_head - tail * re_tail
        score = self.gamma.item() - torch.norm(score, p=1, dim=2)
        print("pairRE score: ", score)
        return score

三、总结

本文主要围绕知识图谱嵌入学习这一主题,对比知识图谱嵌入与图网络嵌入的异同,并介绍基于Score函数的知识图谱表示方法。

从中我们发现,从TransE到后续的Trans系列,其核心的变动就是距离得分函数,以解决一对多、多对一等复杂关系,例如:

TransH模型为了处理一对多/多对一的关系问而又不过分增加模型的复杂度和训练难度,针对每一个关系r,将前件h和后件t的向量表示投影到一个由向量wr确定的超平面得到向量h⊥和t⊥,在这个超平面上存在一个关系的表示向量r,与TransE一样通过训练使得h⊥+r≈t⊥,因此每一个关系实际上是由向量wr和向量r共同表示的;

TransR模型对不同的关系建立各自的关系空间,在计算时先将实体映射到关系空间进行计算,对于每个关系,有一个变换矩阵Mr和一个在它自己的关系空间的表示向量r,通过变换矩阵将前件和后件的表示向量映射到关系空间,再在关系空间通过训练使得hr+r≈tr;

TransD模型对每个实体或关系使用两个向量进行表示,一个向量表示语义,另一个(用下表p表示)用来构建映射矩阵。

而进一步的,为了建模复杂的关系模式,建模和推断对称/反对称、传递性以及自反性三种模式,RotatE和PairRE等方法的提出,通过旋转和头尾实体分别做投射的方式,在一定程度上解决了这一问题。

实际上,我们发现,得到一个好的知识图谱嵌入是极具挑战性的,其一方面需要考虑到复杂的知识图谱数据本身,另一个也需要考虑到计算量,就pairRE来说,跑一个DB100K的数据集,15000步就需要消耗近12个小时,并且在内存的消耗上也十分大,这也揭示出了其在真正落地上的困难性。

当然,有许多现成的工具来供我们使用,我们可以利用好它。

参考文献

1、https://mp.weixin.qq.com/s/K68KQxFnbAnxIswgUv3RTQ 

2、https://www.zhihu.com/question/269781335/answer/584764518

3、王文广. 知识图谱推理:现代的方法与应用[J]. 大数据, 2021, 7(3): 42-59.

4、Bordes A, Usunier N, Garcia-Duran A, et al. Translating embeddings for modeling multi-relational data[C]//Advances in neural information processing systems. 2013: 2787-2795.

5、Wang Z, Zhang J, Feng J, et al. Knowledge graph embedding by translating on hyperplanes[C]//Twenty-Eighth AAAI conference on artificial intelligence. 2014.

6、Lin Y, Liu Z, Sun M, et al. Learning entity and relation embeddings for knowledge graph completion[C]//Twenty-ninth AAAI conference on artificial intelligence. 2015.

7、Ji G, He S, Xu L, et al. Knowledge graph embedding via dynamic mapping matrix[C]//Proceedings of the 53rd Annual Meeting of the Association for Computational Linguistics and the 7th International Joint Conference on Natural Language Processing (Volume 1: Long Papers). 2015: 687-696.

关于我们

老刘,刘焕勇,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

就职于360人工智能研究院、曾就职于中国科学院软件研究所。

老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。

继续滑动看下一个
老刘说NLP
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存