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" 关系的传递性可形式化地表示为:
- 由 instanceOf + subClassOf 可推 instanceOf

- 由 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"传递性的问题,象牙塔中的科研者们真的知道吗?现在我的观念和读研之前仍旧是一样的:需求驱动的工作才是有用的,才是可以锻炼到人的能力的。