翻译模型(七)(TransC)

TransC

paper: Differentiating Concepts and Instances for Knowledge Graph Embedding

论文

这篇文章是清华大学刘知远老师团队发表在 EMNLP 2018 上的工作。C 代表 concept。文章提出了区分概念(concept)和实例(instance)的KGE方法:concept 用球表示,instance 用向量表示,建模 instance 与 concept 之间的 "instanceOf" 关系和 concept 与 concept 之间的 "subClassOf" 关系。

问题提出

人脑中的概念知识是层次化组织的,实例应当与其所属的概念类别距离接近。但所有之前的KGE模型在进行嵌入时候,并没有区分对待概念和实例,而是将它们同等地试做实体。这样会导致两个问题:不充分的概念表示,以及"isA"关系的传递性丢失(我觉得应该有一些预实验来证明"isA"传递性的丢失)。

针对以上问题,提出 TransC,将 concept 编码为球,instance 编码为同一语义空间的向量。对于 "instanceOf" 关系,判断某实例是否属于某概念,只需要判断向量是否位于概念的球内;对于 "subClassOf" 关系,判断某概念是否是另一概念的子类别,理想情况是该类别的球位于父类别的球内(关系成立),此外还针对两个球可能存在的其他三种位置关系定义了损失函数。

TransC

知识图谱中包括三种关系:instanceOf、subClassOf 及其他,相应地,三元组分为三类。对于每个 concept,学习一个(超)球的表示 \(s(p,m)\),p 是球心,m 是半径。

"isA" 关系的传递性可形式化地表示为:

  1. 由 instanceOf + subClassOf 可推 instanceOf
  1. 由 subClassOf + subClassOf 可推 subClassOf

instanceOf 的表示

对于 "instanceOf" 关系成立的三元组 \((i,r_e,c)\),只需保证 i 的向量位于 c 的球 \(s(p,m)\) 内,因此,打分函数定义为:

subClassOf 的表示

对于存在 "subClassOf" 关系的三元组 \((c_i,r_c,c_j)\),两个概念的球 \(s_i(p_i,m_i)\)\(s_j(p_j,m_j)\),两个球心的距离为:\(d=\Vert p_i-p_j \Vert_2\)。若关系成立,两个球的位置关系应当像图(a)一样,它是对于正样本三元组的训练目标。

另外三种情况,分别定义打分函数,使其相对位置关系向理想情况靠近。

对图(b)的“Si在Sj外且与Sj相离”的情况,及图(c)的“Si与Sj相交”的情况,打分函数定义为: \(f_c(c_i,c_j)=\Vert p_i-p_j \Vert_2 + m_i - m_j\),尽量使两球的球心距离拉近、Si的半径减小、Sj的半径增大。

对图(d)的“Sj反而处于Si内”的情况,打分函数定义为:\(f_c(c_i,c_j)=m_i-m_j\),尽量使 Si 的半径减小、Sj 的半径增大。

其他关系三元组的表示

对于除 "instanceOf" 和 "subClassOf" 之外的其他三元组关系,采用和 TransE 一样的打分函数:\(f_r(h,t)=\Vert h+r-t \Vert_2^2\)

实现中采用归一化作为正则约束。

Loss

三种关系的 Loss 都是一样 margin-based 的:



总的 Loss 为三部分 Loss 之和:

实验

在自建的 YAGO39K 和 M-YAGO39K 数据集上,进行了链接预测和三元组分类的实验。

YAGO39K 上的链接预测和三元组分类实验结果:

两个数据集上的 instanceOf 和 subClassOf 类三元组的分类结果:

此外,实验部分的最后还进行了一个 case study,但没有什么新东西,只是为了表明 TransC 可以挖掘新的 instanceOf 和 subClassOf 类型的三元组。

代码

文章给出了代码:https://github.com/davidlvxin/TransC ,代码包括 C++ 和 python 两个版本,python 版本是基于 PyTorch 实现的,非常友好。

python 版本的代码大概浏了一遍,居然没找到核心的打分函数的部分=.=,就不往这贴了。

最近一直在看论文,很久没有跑代码了,手都有点痒了,但是因为没有打算跟进这个方向,只好作罢。看了这个作者的其他工作,有近两年的两篇知识推理的工作,后面有时间研读一下,我个人对于知识推理还是很感兴趣的。


小结: 提出了一个新的前所未有的问题,然后用 plausible 的方法解决了它。但是很多时候我我觉得搞文章的顺序刚好是反过来的:开脑洞想到一个 idea,做了一些工作,得到了一些结果,然后写论文 tell story,去提出一个所做的工作可以解决的问题。实际在工业界中到底落实到了哪一步?是否真的存在需要区分概念和实例、以及"isA"传递性的问题,象牙塔中的科研者们真的知道吗?现在我的观念和读研之前仍旧是一样的:需求驱动的工作才是有用的,才是可以锻炼到人的能力的。

posted @ 2021-04-08 17:14  胡萝不青菜  阅读(1608)  评论(0编辑  收藏  举报