MIRALab-USTC / KG-TACT

The code of paper Topology-Aware Correlations Between Relations for Inductive Link Prediction in Knowledge Graphs. Jiajun Chen, Huarui He, Feng Wu, Jie Wang. AAAI 2021.
39 stars 7 forks source link

关于测试时具体实现方法的问题 #8

Closed Ninecl closed 2 years ago

Ninecl commented 2 years ago

你好,非常感谢您开源了代码能够帮助我的学习与研究工作,但是在看您代码的时候我产生了一些问题并做了一些相关的实验,让我有了一些困惑的地方。 主要的问题是有关测试部分的,我看到在您的代码中,测试部分也是直接在模型中生成了负样本,然后模型直接输出了正样本与其余负样本的得分。 因为我希望实现(h,r,?),(h,?,t),(?,r,t)三种不同的link prediction,因此我仿照Grail中的方式,直接对每个三元组进行负采样,然后抽取这些负样本的子图,输入您的模型中,然后把模型对每个三元组输出的pos结果作为这个三元组的得分。但是我发现这样做的时候,即便是只看(h,?,t)的结果,也与您原来代码中直接在模型中获得正样本和负样本的得分效果相差很大。 能麻烦您解释一下这个问题嘛,非常感谢!

JiajunChen98 commented 2 years ago

你好,感谢你对于我们工作的关注。

首先我想确认一下你评测的方式,是训练好模型之后,然后将不同的采样样本输入到同一个训练模型进行测试吗?测试的时候,你的得分是采用的是测试代码输出的 score 吗(如 test_ranking.py 里面 get_rank 函数输出的 score)?

如果是以上的方式,可能会存在的问题是测试时函数输出的 score 是归一化后的,会导致这一现象,你应该采用归一化之前的 score。我举一个例子(方便举例假设是求和归一化,实际代码中用的是 softmax),假如有两个样本 (h, r, t) 和 (h, r_neg, t), 你以 pos 方式计算得分时,两者都会默认进行负采样,假如 (h, r, t) 这一个归一化之前的分数是 10,其他负样本分数和也是 10,那么归一化之后就是 0.5;而 (h, r_neg, t) 归一化之前分数是 2, 其他负样本分数和是 1,那么归一化之后分数就是 0.67。归一化之后结果 (h,r,t) 打分小于 (h, r_neg, t),但实际上 (h, r, t) 的得分是更高的。解决这一问题可以修改代码,统一使用归一化之前的分数作为输出。

另外,你都使用 pos 的方式来计算得分,是有什么特殊的考虑吗?

如果有疑问欢迎继续提问,近期较忙回复可能稍有延迟。

Ninecl commented 2 years ago

你好,关于归一化的问题我在试验中注意到了,因为我的问题可能有些复杂,所以给你论文中的邮箱发送了邮件,希望能可以和你一起探讨,感谢!