前言
知识表示学习是针对于知识图谱三元组所做的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⊥t⊥=h−wrThwr=t−wrTtwr
代码中也就是多了一步投影的代码:
这样就是对于头实体和尾实体的表示向量进行了分解,所以在使用h和r计算t的时候相当于只使用h的一个分量,从而解决了一对多和多对一的问题。
以下是代码结果:
TransR
TransE和TransH模型都假设实体和关系是在同一个语义空间的向量,这样相似的实体会在空间中相近的位置,然而每一个实体都可以有很多方面,而不同的关系关注的是实体不同的方面。所以TransR对每个三元组,首先应将实体投影到对应的关系空间中,然后再建立从头实体到尾实体的翻译关系。
对于每个关系,有一个变换矩阵
M
r
M_r
Mr和一个在它自己的关系空间的表示向量r。通过变换矩阵将头实体和尾实体的表示向量映射到关系空间,后面还是和TransE一样的目标函数。
h
r
=
h
M
r
t
r
=
t
M
r
\begin{aligned} h_{r} &=h M_{r} \\ t_{r} &=t M_{r} \end{aligned}
hrtr=hMr=tMr
同时后续研究进一步发现关系里面可以做更细致的划分,从而产生了一个变体CTransR。它是对于某关系的全部三元组(h,r,t)用h-t得到关系的表示,再对r进行聚类,对于每一个子关系学习变换矩阵
M
r
M_r
Mr和r,后面就和TransR一样了。
代码中相较于TransE也就多了矩阵的那一步:
代卖结果如下:
不知道为啥效果很差…
TransD
TransR还有几个问题并没有解决:
1、在同一个关系r下,头、尾实体共享相同的变换矩阵,然而,一个关系的头、尾实体的类型或属性可能差异巨大。例如,对于三元组(美国,总统,奥巴马),美国和奥巴马的类型完全不同,一个是国家,一个是人物;
2、从实体空间到关系空间的投影是实体和关系之间的交互过程,因此TransR让变换矩阵仅与关系有关是不合理的;
3、与 TransE和TransH相比,TransR由于引入了空间投影,使得TransR模型参数急剧增加,计算复杂度大大提高。
于是就有了TransD这个模型。TransD模型对每个实体或关系使用两个向量进行表示,一个向量表示语义,另一个用来构建映射矩阵。
M
r
h
=
r
p
h
p
T
+
I
M
r
t
=
r
p
t
p
T
+
I
\begin{aligned} M_{r h} &=r_{p} h_{p}^{T}+I \\ M_{r t} &=r_{p} t_{p}^{T}+I \end{aligned}
MrhMrt=rphpT+I=rptpT+I
这样映射矩阵就由实体和关系共同决定了,其中
I
I
I为单位阵,即通过向量相乘生成的矩阵对单位阵(代表不做变换)进行调整。后面的映射和训练过程和TransR相同。此外,该模型将TransR的矩阵运算转换成了向量间的运算,运算速度会大幅提升,具体公式如下,补0是因为这里假设关系空间维度比实体空间维度高。
h
⊥
=
M
r
h
h
=
h
p
T
h
r
p
+
[
h
T
,
0
T
]
T
t
⊥
=
M
r
h
t
=
t
p
T
t
r
p
+
[
t
T
,
0
T
]
T
\begin{aligned} h_{\perp} &=M_{r h} h=h_{p}^{T} h r_{p}+\left[h^{T}, 0^{T}\right]^{T} \\ t_{\perp} &=M_{r h} t=t_{p}^{T} t r_{p}+\left[t^{T}, 0^{T}\right]^{T} \end{aligned}
h⊥t⊥=Mrhh=hpThrp+[hT,0T]T=Mrht=tpTtrp+[tT,0T]T
代码中多了每个实体、关系由两个向量表示的步骤以及解决实体和关系之间维数不一致的问题
最后测试的结果如下:
总结
以上四种TransX系列都是最早的几篇代表性的工作,后面还有TransSparse、TransA、TransG以及最近两年的更复杂的模型,可以看出他们基本都是在TransE这个基础上的改进,用头实体和关系向量之和来预测尾向量,这样定义实体关系之间的信息作用是一种方案,但是不一定就是唯一最好的,如果后续有必要会再跟进KG Embedding的工作。最后放一张知乎上一个投稿中的图
参考资料
[1] 知识表示学习研究进展-刘知远
[2] Translating Embeddings for Modeling Multi-relational Data
[3] Knowledge Graph Embedding by Translating on Hyperplanes
[4] Learning Entity and Relation Embeddings forKnowledge Graph Completion
[5] Knowledge Graph Embedding via Dynamic Mapping Matrix
[6] 知识图谱向量化表示
[7] Trans系列知识表示学习方法梳理