背景介绍
如何对知识图谱进行评估,其实知识图谱本身并不需要评估,因为其中的实体和关系已经确定,但是考虑到应用时的效率问题等,需要将它们表示成低维向量的形式,因此这种评估是针对表示为低维向量的知识图谱,来探求:低维向量的形式是否能完美代表之前的知识图谱。
评估数据准备
那么如何评估这种“完美程度”呢?我们知道在一些tabular数据中使用的模型,比如random forest,GBDT,来一组新的数据,因为有标记,我们预测新数据产生的输出,来与标记进行对比。模型学到的是不同类型数据之间的交互。这种情况下,是通过对新的数据进行prediction来评估模型的学习成果。
那么在知识图谱表示学习中,模型学到了什么?因为本质上是换了一种表示方法,所以模型学到的是针对同一事务的不同的表示形式,那么就要求在评估时,仍然有同一事务的存在,这么说有点抽象,举个例子:
$x_1$ | $x_2$ | $…$ | $x_{i-1}$ | $x_{i}$ | $y$ |
---|---|---|---|---|---|
3 | 4 | $…$ | 4 | 3 | 1 |
1 | 5 | $…$ | 9 | 0 | 0 |
2 | 1 | $…$ | 11 | 7 | 1 |
假设这是一个tabular数据的预测问题,例如:男生能否脱单。
每个维度的向量$x_i$ 代表一种数据,比如:
- $x_1$ 代表你的学历;
- $x_2$ 代表你的家庭背景;
- 等等,如此类推…
当进行评估时,你所需要的是再出现一个同样格式的数据,每一维的数据的意义和训练集的类似,比如:你不能说在评估时出现一个 $x_{i+1}$ 代表这个人是否会养猪,因为这种类型的数据不在训练集中。
同样的,知识图谱表示学习中学到的是一个实体或者关系的低维向量表示,当训练集中出现的是: 高圆圆和Alex, 在评估时,你让我评估 新垣结衣和小约翰(均没有出现在训练集中)的关系。
这一点是和之前的评估方法有所区别的。
那么如何准备训练集和测试集呢?在评估数据准备时的一个原则:保证测试集中出现的实体和关系均在训练集中出现。
不同时出现,我评估谁去?谁知道小约翰和新垣结衣合不合适?但我们能评估高圆圆和Alex合不合适…
评估任务
在KGE评估时,一般采取的是Link prediction
任务,在准备时,可以采取的策略:
- 在原始的知识图谱上随机删除一些link,然后在评估时预测这些link是否存在,这种情况下,需要计算预测的准确率;
- 还有一种方法是,将
link prediction
视为learn to rank
任务,通过排序的指标进行评估,这种方式目前是主流的方法,下文主要阐述这种方法;
对于这种方法,首先确定需要进行评估的数据集 $\mathcal{E}$ ,因为有时候进行评估的数据集可能并不是原始的完整的数据集,然后针对数据集中的三元组,进行两种类型的替换,如下:
$(h, r, ?)$ :取 $\mathcal{E}$ 中的所有实体,替换?,然后计算 $(h, r, t)$ 在其中的排序,越靠前越好;
$(?, r, t)$ :取 $\mathcal{E}$ 中的所有实体,替换?,然后计算 $(h, r, t)$ 在其中的排序,越靠前越好;
评估指标(Rank-based method)
Hits@K
hits@k根据出现在排序列表中的前k个实体中,真实实体排序的位置进行评估。
具体计算方式如下:
$$
\text{hits@}k = \frac{1}{|\mathcal{I}|} \sum \limits_{r \in \mathcal{I}} \mathbb{I}[r \leq k]
$$
- $\mathcal{I}$ 表示一组排序的结果;
- $|\mathcal{I}|$ 表示一组排序的结果的数量;
- $\mathbb{I}$ 为指示函数;
- $k$ 为界定的范围,常为1, 3, 5, 10
- 该值越接近1,说明学习的效果越好;
- 这里的
r
指的是rank
;
一个例子说明:
当有3个正样本用于生成负样本时,同时考虑替换head和tail,可以生成6个负样本,也就可以得到6个排名结果。
正样本 | head负样本 | tail负样本 | head负样本排序 | tail负样本排序 |
---|---|---|---|---|
$(h_1, r_1, t_1)$ | $(h_1, r_1, ?)$ | $(?, r_1, t_1)$ | 8 | 4 |
$(h_2, r_2, t_2)$ | $(h_2, r_2, ?)$ | $(?, r_2, t_2)$ | 2 | 1 |
$(h_3, r_3, t_3)$ | $(h_3, r_3, ?)$ | $(?, r_3, t_3)$ | 90 | 1 |
则计算如下:
$$
hits@1 = \frac{1}{6} \times (0 + 0 + 0 + 1 + 0 + 1) = 0.3333
$$
$$
hits@3 = \frac{1}{6} \times (0 + 0 + 1 + 1 + 0 + 1) = 0.50
$$
$$
hits@5 = \frac{1}{6} \times (0 + 1 + 1 + 1 + 0 + 1) = 0.6667
$$
如果你实际计算时会发现一个问题,比如对于 $(h_1, r_1, ?)$,它的排序为8,但是由于比1, 3, 5都大,所以仍然记为0,但是它比 $(h_3, r_3, ?)$ 的排序为90,要好很多,但是对于 $rank > k$ 的,该指标一视同仁,也是一个缺陷。
Mean Rank(MR)
正如名字体现的,是triples所有排序的算术平均值,这个值的范围是: [1, 所有负样本的数量]。
- 1 表明是最理想的情况,所有的triples的排序都是1;
- 所有负样本的数量:最坏的情况,所有的排序都是最后一个;
- 这个指标越低越好;
$$
\text{score} =\frac{1}{|\mathcal{I}|} \sum \limits_{r \in \mathcal{I}} r
$$
根据上述的6个负样本,计算如下:
$$
\text{MR} = \frac{1}{6} \times (8 + 4 + 2 + 1 + 90 + 1) = 17.6667
$$
从计算方式上来看,这个评估指标比Hits@K
好的地方在于:
it is sensitive to any model performance changes, not only what occurs under a certain cutoff and therefore reflects average performance.
但是它的缺陷也很明显,虽然有一定的解释性,但是由于它的边界取决于负样本的数量,但是MR=10,对于负样本为20或者200000的模型,其性能指示含义完全不同。
Mean reciprocal rank(MRR)
MRR是所有排名的倒数的算术平均值,具体计算如下:
$$
\text{score} =\frac{1}{|\mathcal{I}|} \sum_{r \in \mathcal{I}} r^{-1}
$$
根据上述的6个负样本,计算如下:
$$
\text{MR} = \frac{1}{6} \times (\frac{1}{8} + \frac{1}{4} + \frac{1}{2} + \frac{1}{1} + \frac{1}{90} + \frac{1}{1}) = 0.4810
$$
- 这个指标在 $[0, 1]$ 之间;
- 是对MR的一种改进,使得可以对异常值不太敏感,这里指对高rank的异常值不敏感,但是去开始对低rank值敏感;
同样的问题,对于一个模型,如果观察到MRR指标为0.01, 那么这个模型是好还是不好?
这种结论很难直接下,这个值意味着,当去掉outliers时,平均排名为 100(1/0.01) 左右,这个结果可能是好的,也可能是坏的,这取决于使用的负样本的数量。
- 当使用了100万的负样本, 那么这个结果很好,因为在100万中排名100,是很好的;
- 当使用了负样本只有100个,说明test triples在跟corruptions一起排名时得到的结果很差;
在真实的数据集上,应该仔细看看hits@k这个指标,之后再判断模型的好坏。
其中k的选择,应该取决于针对每个test triple生成的负样本的数量。
其实主要的评估指标,包括:
MRR
,hits@k
, 已经是经常使用的了,例如在:paperswithcode和机器之心的SOTA中都是以这几种组作为benchmark的。
其他的指标
针对上述常用的指标,也有一些改进的衡量指标,比如:
- Inverse Geometric Mean Rank
- Adjusted Mean Rank
- Adjusted Mean Rank Index
这些指标可以参考 其他衡量指标
深入评估细节
如何计算rank?
上边我们默认已经知道rank,但是rank是如何计算的,不就是排序列表的索引吗?
对于一个模型,输出针对triples的分数如下:
Triples | Score | Rank(optimistic) | Rank(pessimistic) | Rank(realistic) |
---|---|---|---|---|
(高圆圆,喜欢,XXX) | 0.9628 | 1 | 1 | 1 |
(高圆圆,喜欢,Alex) | 0.9405 | 2 | 3 | 2.5 |
(高圆圆,喜欢,赵又廷) | 0.9405 | 3 | 2 | 2 |
(高圆圆,喜欢,小约翰) | 0.0001 | 4 | 4 | 4 |
但是会出现一个问题:如果模型针对不同的triples输出同样的分数时,如何计算rank?这时候有三种方式:
optimistic
:乐观的方式,当正样本和其他的负样本有同样的分数时,则排名取第一个;pessimistic
:悲观的方式,当正样本和其他的负样本有同样的分数时,则排名取最后一个;realistic
:务实的方式,当正样本和其他的负样本有同样的分数时,则排名取optimistic
和pessimistic
的平均排名;
rank选边
上述我们一直默认,当生成负样本时,是针对head和tail同时进行的,但是其实可以任选一边,即:
- 只针对head生成负样本;
- 只针对tail生成负样本;
但是一般情况下,我们都是针对两边同时生成负样本。
但是指针对以便进行负样本的生成是有意义的,因为这样可以评估模型对于head和tail的预测差异。
过滤已知triples
这个很明显,当生成负样本时,我们发现,针对(高圆圆,喜欢,Alex),替换head,得到新的负样本的head可以任意替换,那么,恰巧生成一个负样本 (孙艺珍,喜欢,Alex),这就尴尬了,因为这是一个正样本,当评估时必然会得到很高的分数,导致得到排名很前的rank,这就导致(高圆圆,喜欢,Alex)的排名靠后了,因此为了正确地衡量模型的性能,因此需要过滤掉这些正确的样本,因为它会忽略这些一直的triples带来的负面影响。
但是这种filtering的使用时机是很重要的:一个原则是评估的结果不会影响到模型的训练过程。根据这个原则,不可以使用filtering:
- Early stopping:不使用test data进行正样本的过滤,以免泄露信息;
- hyperparameter optimization:不使用test data进行正样本的过滤,以免泄露信息;
实体和关系限定
这个问题需要阐述的是,上边根据LCWA或者sLCWA,可以生成针对所有实体或者关系的负样本,但是依赖于具体的任务,我们不想这么做,比如:在医疗知识图谱中,每个实体会有额外的实体类型,比如:
(氯吡格雷,治疗,过敏),氯吡格雷是一种药物,可以治疗过敏,但是实体中有二甲双胍,这也是一种药品,但是根据上述的假设,则可以生成负样本:(氯吡格雷,治疗,二甲双胍),这显然是没有意义的,因为在不符合实际,因为这种情况下,当生成负样本时,我们一般希望规定,生成的负样本时符合实际的,比如:(氯吡格雷,治疗,过敏性鼻炎)。
这种情况下,需要完成两步工作:
- 重新生成评估数据;
- 针对重新生成的评估数据,来计算衡量指标;