同时利用结构信息和文本信息,在对比学习框架下提升长尾实体的表示
目前知识图嵌入有两种计算方法,即基于结构的方法和基于描述的方法


给定三元组
h
,
r
,
t
h, r, t
h,r,t,其描述分别为
S
h
,
S
r
,
S
t
S_h, S_r, S_t
Sh,Sr,St,其中
s
e
=
(
x
1
,
…
,
x
n
e
)
s_e=\left(x_1, \ldots, x_{n_e}\right)
se=(x1,…,xne)为token的序列。输入可以表示为
s
u
=
(
h
,
s
h
,
r
,
s
r
,
t
,
s
t
)
=
(
h
,
x
1
h
,
…
,
x
n
h
h
,
r
,
x
1
r
,
…
,
x
n
r
r
,
t
,
x
1
t
,
…
,
x
n
t
t
)
s_u=\left(h, s_h, r, s_r, t, s_t\right)=\left(h, x_1^h, \ldots, x_{n_h}^h, r, x_1^r, \ldots, x_{n_r}^r, t, x_1^t, \ldots, x_{n_t}^t\right)
su=(h,sh,r,sr,t,st)=(h,x1h,…,xnhh,r,x1r,…,xnrr,t,x1t,…,xntt),在开头和末尾分别添加[CLS]和[SEP]标识。
将 s u s_u su作为一个整体输入预训练语言模型,分别得到三元组各部分的嵌入表示 h , r , t ∈ R d \mathbf{h}, \mathbf{r}, \mathbf{t} \in \mathbb{R}^d h,r,t∈Rd以及三元组整体的表示 u \mathbf{u} u,三元组成立的概率为 p ( u ) = σ ( w u + b ) p(u)=\sigma(\mathbf{w} \mathbf{u}+b) p(u)=σ(wu+b)。
在执行链路预测任务时,上述方法的缺陷在于要为每一个负样本生成整个三元组的表示,使得整体计算复杂度过高。


在链路预测任务中,将给定的头实体和关系及其文本描述视为查询q,将要预测的尾实体视为键k,一个batch内的原始qk对视为正样本对,同batch内的其他三元组的k与q视为负样本对。
在计算相似度时,考虑到1-N关系的存在,没有使用通常的余弦相似度,而是用了MLP实现。

其中
d
=
[
log
(
d
q
+
1
)
;
log
(
d
k
+
1
)
]
\mathbf{d}=\left[\log \left(d_q+1\right) ; \log \left(d_k+1\right)\right]
d=[log(dq+1);log(dk+1)]通过度的对数来考虑结构信息,有点奇怪
最终的损失函数如下,好像和之前基于负采样的损失函数看上去没有很大区别

最后两行的效果确实提升非常大,在FB数据集上,是基于描述的方法第一次超过基于结构的方法。另外,所有基于描述的方法在WN数据集上都显著超越基于结构的方法,因为WN数据集中的实体本来就是词,根据文本就能推断出它们之间的关系。而FB数据集就得同时依赖文本和结构信息。

三元组分类

不同度的实体的效果比较,可以看到度数较小的长尾实体效果显著提升了

负样本对越多,效果越好

虽然说是对比学习,但感觉对正负样本对的定义有点奇怪,其实还是负采样,跟之前的方法没有本质区别,最大的创新点是把头实体加关系、以及尾实体分别用文本表示了
看了一下github上放出来的代码,运行时间有点吓人,跑一次模型需要两天以上
