Introduction

研究知识图谱表示学习(KnowledgeGraph Embedding)可以解决当前很多应用的基本问题,这些方法旨在将知识图谱中的实体(Entity)和关系(Relation)都映射到低维向量空间中,并且捕获实体和关系之间的语义信息。当前很多知识图谱表示学习的方法都着重于设计新的得分函数(Score Function)从而可以捕获实体和关系之间复杂的交互。

然而在知识图谱表示学习的过程中,一个重要的部分——负采样(Negative Sampling)并没有被足够的重视。在知识图谱中,负样本采样的需求来源于KG中仅包含真实的正样本三元组,而在训练知识图谱表示的过程中,每个正样本需要对应相应的负样本。当前很多方法都使用均匀采样(Uniform Sampling)的方式,然而这样的方式很容易造成训练过程中的梯度消失,也就是很多负样本都是很容易被划分为负样本的简单样例,得分函数很自然的对这一类负样本给出较低的分数,从而导致训练过程中梯度为零。

所以高质量的负样本应该是得分函数给出较高分数(被误认为是正样本)的负样本,这篇文章探讨了在知识图谱表示学习模型的学习过程中(1)如何捕获并且建模负样本的动态分布,以及(2)如何有效地进行负样本的采样。

作者发现负样本的分数分布是高度偏斜的(Skewed),也就是说只有少量的负样本的分数较高,其余的分数较低的负样本的对后续的训练几乎无用。这个发现促使作者设计模型来维护这部分高质量的负样本三元组,并且在训练的过程中动态地更新。

Proposed Model

图机器学习算法 图数据的负采样_三元组

图1. 负样本的分数分布举例

图1(a)中展示了某一个三元组在训练过程中,负样本分布的变化;图1(b)中展示了在训练完成后,不同三元组的负样本分布情况。最终得出的结论是,负样本分数的分布是高度偏斜的,并且只有很少一部分的负样本有较大的分数。是否可以设计一个模型直接监控那些分数较高的负样本。这篇文章提出了NSCaching的方法,该方法只要解决了以下两个问题:

1、如何建模负样本的动态分布?

2、如何有效的采样负样本?

模型设计了一个缓存机制,保存了知识图谱中每个三元组对应的分数较高的负样本三元组,Algorithm2中展示了基于该缓存机制的知识图谱表示学习模型的学习过程。

图机器学习算法 图数据的负采样_数据集_02

具体来说,缓存分为头实体缓存(head-cache)和尾实体缓存(tail-cacahe),其中头实体缓存利用(r, t)进行索引,尾实体缓存利用(h, r)进行索引,他们分别存储的是知识图谱中的头实体和尾实体。在算法中,首先会确定一个正样本,然后得到该正样本在缓存中对应的部分(步骤5),然后会根据相应的缓存构造负样本(步骤6-7),最后更新缓存(步骤8)。

考虑模型的具体细节,这里如何从缓存中采样负样本(步骤6)以及如何更新缓存(步骤8)呢?

对于步骤6,作者采用的是从缓存中进行均匀采样。利用均匀采样的原因是该方法简单高效,虽然另一个看起来更好的方法可能是利用负样本的分数进行采样,但作者认为该方法不仅需要更多的空间存储三元组的分数,并且会因为负样本分布变化和假负样本引入更多偏差。

对于步骤8,这里采用重要性采样(Importance Sampling,IS)。首先从所有的三元组中均匀采样一部分实体,然后把这部分实体和原本缓存的实体放在一起,并计算分数,利用如下公式计算每个负样本三元组的重要性,也就是被采样进入更新后的缓存的概率。

图机器学习算法 图数据的负采样_缓存_03

 完整的缓存更新算法如下:

图机器学习算法 图数据的负采样_数据集_04

Experiments

作者在多个标准数据集上进行了实验,如下图是在利用TransE,在不同标准数据集上,和其他负采样方法对比的结果(更多利用其余KGE的实验结果请参考原文),可以看出这里提出的NSCacheing优于其他的负采样方法。

图机器学习算法 图数据的负采样_图机器学习算法 图数据的负采样_05

图2. 在不同标准数据集上的结果