zjukg / AnKGE

[Paper][AAAI2023] Analogical Inference Enhanced Knowledge Graph Embedding
Apache License 2.0
10 stars 4 forks source link

关于负例采样与链路预测的疑问 #3

Closed CuiJie98 closed 1 year ago

CuiJie98 commented 1 year ago

Q1:本文提到“将Relation的逆关系引入导数据集中,只需要对尾实体进行链接预测...,因此并没有泄露的风险”,我想来了解为什么逆关系引入拓展会导致关系泄露?理论上不是没有脱离现有的数据集吗?

Q2:代码中很多文件或class等都包含“Rev”,这个含义是引入逆关系,只对尾实体预测进行实验和负例采样对吗?

Q3:在Q1、Q2的基础上,若按照本文的方法,对于基础模型(如TransE)而言,在参数中应该选择:

--litmodel_name=KGERevLitModel
--train_sampler_class=RevUniSampler
--test_sampler_class=RevTestSampler

但是我在提供的代码中,如“TransE_Rev_WN.sh”中:

--litmodel_name=KGERevLitModel
--train_sampler_class=RevUniSampler
--test_sampler_class=TestSampler(未提供,参数默认值)

因此我很好奇为什么Rev的策略下,测试集数据不是Rev的,即--test_sampler_class=TestSampler

此外我再确以下,如果基准模型不引入逆关系,与传统的负采样保持一致(对头尾实体都进行)。那么参数是否应该为:

--litmodel_name=KGELitModel
--train_sampler_class=UniSampler
--test_sampler_class=TestSampler

麻烦解答一下这3个问题(其实4个,因为Q3包含了2个问题 哈哈哈) 感谢~

Modberge commented 1 year ago

你好,感谢对AnKGE的关注。

A1 : 关于标签泄露的问题,我们在论文第五页footnote中提到,“我们进行链接预测时,通过对数据集中的三元组增加反向关系,使得只进行尾实体预测等价于预测头实体和尾实体。此外,潜在的标签泄露问题是对于公式(13)而言,我们强调了在预测过程中使所有实体替换尾实体,而不是使用ground truth统计出现次数,因此不会出现标签泄露的问题。

A2 : 是的,代码的基本框架来自于NeuralKG,我们将基础模型的训练改为增加反向关系训练,因此改动部分使用”Rev"作为标识。

A3 : 具体来说,增加反向关系的操作使得训练过程仅对尾实体负采样进行训练以及测试过程仅测试尾实体。 具体在RevUniSampler函数中,我们对batch_size每个数据仅进行了尾实体替换。

        for h, r, t in data:
            neg_tail = self.tail_batch(h, r, t, self.args.num_neg)
            neg_ent_sample.append(neg_tail)
            if self.args.use_weight:
                weight = self.count[(h, r)] + self.count[(t, -r-1)]
                subsampling_weight.append(weight)

在KGERevLitModel中,我们指定了评测预测仅考虑尾实体。 ranks = link_predict(batch, self.model, prediction='tail') 因此在测试过程的采样阶段,虽然指定了TestSampler作为采样函数进行头实体和尾实体的负采样,但是实际进行预测的过程中,仅评估了尾实体的结果。当然上文提到这与预测头实体和尾实体的结果是等价的。RevTestSampler是针对AnKGE构造的采样函数不适用于基础模型。

最后对于不引入负关系的超参数与你提到的相同,其他超参数选取可以参考NeuralKG的不同模型运行脚本。

CuiJie98 commented 1 year ago

你好,谢谢对AnKGE的关注。

A1 : 关于标签泄露的问题,我们在论文第五页footnote中提到,“我们进行链接预测时,通过对数据集中的三元组增加反应向关系,使只进入尾实体预测等价于预测头实体和尾实体。另外,潜在的标签泄露问题是对公式(13)而言,我们强烈调整了在预测过程中使用所有实体替换尾实体,而不是用ground truth统计出现次数,因此不会出现标志泄露的问题。

A2 : 是的,代码的基础架构来自于NeuralKG,我们将基础模型的训练改为增加反向关系训练,因此改变活动部分使用“Rev”作为标准。

A3 : 具体来说,增加反向关系的操作使训练练过程仅对实尾体负采集样进行训练以及测试过程只测试尾实体。实体在RevUniSampler函数中,我们对batch_size每个数据只进行了尾实体替换 。

        for h, r, t in data:
            neg_tail = self.tail_batch(h, r, t, self.args.num_neg)
            neg_ent_sample.append(neg_tail)
            if self.args.use_weight:
                weight = self.count[(h, r)] + self.count[(t, -r-1)]
                subsampling_weight.append(weight)

在KGERevLitModel中,我们指定了评估预测只考疑尾实体。 ranks = link_predict(batch, self.model, prediction='tail') 因此在测试过程序的采集阶段,虽然指定了TestSampler作为采集样数输入行头实体和尾实体的负载采集样,但是是实际进行行预测的过程中,只评价了尾实体的结果。当然上文提到这个与预测头实体和尾实体的结果是等价的。RevTestSampler是针对AnKGE构造的采集数不适合用于基础模型。

最后对于不引入负载关联的超参数与你提出的相同,其他超参数选择取下可以参考NeuralKG的不同模型运行脚。

非常感谢~