前言
知识表示学习是针对于知识图谱三元组所做的word embedding,平常所做的都是基于完整的文本表述比如一句话去产生word2vec这种副产物,但是KG中的embedding是更为直接的构建实体与关系之间的语义联系。在知识图谱相关任务中,相比使用普通的词向量,知识表示更能反映相近的实体、关系之间的相似程度,知识表示可以被用于信息检索、知识图谱补全、自动问答等领域,还有像今年清华也有用知识表示和BERT相结合得到的具有先验知识信息的预训练模型ERINE。
TransX系列的做法都是之前一些比较经典的做法算法简单实用,最近主要在做KBQA时考虑到看一下这些东西,下面会结合清华开源KG Embedding框架OpenKE(Tensorflow版)来学习。
OpenKE是一个集成多种KG Embedding算法的框架,tensorflow、pytorch、C++ 版本都有,可以使用GPU进行训练,具体可以参考OpenKE: An Open Toolkit for Knowledge Embedding这篇文章,由于只是初步了解,所以以下实验没有调参可能和论文中有差距,使用的数据是FB15k:
评价指标主要是两项:
1、Link Prediction
给定缺失了h或者t的三元组让训练的模型去检测KG中所有实体契合这个缺失实体的得分并做排序。
- MR : mean rank of correct entities;
- MRR: the average of the reciprocal ranks of correct entities;
- Hit@N : proportion of correct entities in top-N ranked entities.
2、Triple Classification
对于测试三元组判断是不是正确的三元组的二分类准确率
TransE
其实从图中可以很明显的看出TransE的基本思想就是让h+r——>t,目标函数就使用 max margin 损失函数:
L ( h , r , t ) = max ( 0 , d p o s − d n e g + margin ) \mathrm{L}(h, r, t)=\max \left(0, d_{p o s}-d_{n e g}+\operatorname{margin}\right) L(h,r,t)=max(0,dpos−dneg+margin)
其中: d = ∥ h + r − t ∥ \mathrm{d}=\|h+r-t\| d=∥h+r−t∥ 表示L1或L2范式,negative sampling是将头实体和尾实体替换为随机实体
OpenKE中的代码写的也很清晰:
然后就是运行结果:
TransE模型很简单也带来一个很大的问题就是他只适合处理一对一的关系,举例来说当(华科,地点,武汉)和(黄鹤楼,地点,武汉)出现在KG中时,TransE的表示会将“华科”和“黄鹤楼”的向量表示计算的很接近,但实际上这两者之间关系并不大。
TransH
为解决TransE的问题,后来又提出了TransH这个模型,它解决了一对多和多对一的关系问题,基本思想是针对每个关系r,将头实体h和尾实体t向量表示投影到一个由 w r w_r wr确定的超平面上,得到h⊥和t⊥,后面对h⊥和t⊥做和TransE一样的操作:
h ⊥ = h − w r T h w r t ⊥ = t − w r T t w r \begin{aligned} h_{\perp} &=h-w_{r}^{T} h w_{r} \\ t_{\perp} &=t-w_{r}^{T} t w_{r} \end{aligned} h