liuxiyang641 / RAGAT

RAGAT: Relation Aware Graph Attention Network for Knowledge Graph Completion
56 stars 16 forks source link

数据集建立 #22

Closed 1FreshChen closed 6 months ago

1FreshChen commented 6 months ago

学长您好,我想请问数据集当中1-1,1-n等关系的数据集是需要自己建立,还是模型可以帮忙生成的,如果不进行这些关系的分类,仅仅是单纯的文本三元组可以正常进行训练么

liuxiyang641 commented 6 months ago

1-1这些数据子集是根据统计情况,从原始的数据集中划分出来的,用来评估模型对于不同relation类型的预测性能。 这些数据集划分出来,不影响模型训练过程,仅仅是用来测试。任意数据集,只要是能够保证数据格式一致,应该都可以训练。

1FreshChen commented 6 months ago

好的好的谢谢学长

1FreshChen commented 6 months ago

学长,我还想请问下在对数据进行处理的时候,我没有对实体和关系添加标签,但是这没有影响训练,我想请教下标签是用来进行分类的么,在模型训练中会用到标签么

liuxiyang641 commented 6 months ago

你说的标签是指什么?有没有个具体的例子

1FreshChen commented 6 months ago

(U2`1QE7 R` XFFD6}CXBT4 HDC@4_ @RHRJDP~WZ24EO2S 第一个是我的源数据,第二个是我编码过后的三元组,我直接用的三元组训练的,但是我看训练过程中对数据都有加标签的这一步,我没加但是可以得到结果不知道有没有影响,我得到的结果 2024-04-09 22:10:10,806 - [INFO] - Loading best model, Evaluating on Test data 2024-04-09 22:10:26,603 - [INFO] - [Evaluating Epoch 1447 test]: MRR: Tail : 0.39285, Head : 0.13261, Avg : 0.26273 MR: Tail : 543.88, Head : 1109.9, Avg : 826.88 Hit-1: Tail : 0.28861, Head : 0.09083, Avg : 0.18972 Hit-3: Tail : 0.44165, Head : 0.14116, Avg : 0.2914 Hit-10: Tail : 0.60222, Head : 0.20868, Avg : 0.40545 想请问这个结果的优劣和设置的参数有关系么,可以通过调整参数的设置提高训练分数么

liuxiyang641 commented 6 months ago

原来具体的命名在RAGAT方法里是不会使用到的,只要保证你编码后的三元组是合理的就行,没有缺失信息就行。 从你的测试结果来看,MRR还比较低,你可以尝试打印出训练loss图,或者是训练过程中验证集上MRR的变化图等,来看一下是否还可以通过调整超参继续拟合。

1FreshChen commented 6 months ago

学长冒昧的问一下,直接运行run.py,我把参数里面的数据集名称改成自己的数据集就是加载的自建的数据集么,直接运行run.py得到的mrr等指标是针对的训练集的么,只修改数据集名称好像不能够持续训练,在终端执行的命令得到的mrr指标是对应的什么

1FreshChen commented 6 months ago

另外我在用gpu训练自己的数据集的时候,貌似在联网状态下出现了gpu不足的情况,不知道是不是和联网有关,我尝试输出mrr的集合的时候只跑了一轮就没有后续,不知道这个输出的数值具体应该是针对代码中哪一个地方的数值输出

liuxiyang641 commented 6 months ago
  1. 你修改了run.py输入超参data之后,应该会按照self.data['train']self.data['valid']self.data['test']对应的数据集路径去训练、验证和测试。你不放心的话,可以把原来的data都删除,只保留你自己的数据集跑一下代码,看看有没有报错信息。
  2. run.py最后输出的结果,是对应self.data['test']下测试的结果,对应run.py里面的代码test_results = self.evaluate('test', self.best_epoch)。你可以看看输出的log日志,里面应该都打印出来了。
  3. 你的GPU应该是用的本地的GPU吧,出现out of memory应该和联网无关。你可以尝试在每一轮训练结束后,加入代码torch.cuda.empty_cache()释放缓存,不过这样会训练变慢。
1FreshChen commented 6 months ago

好的谢谢学长 我再尝试尝试

1FreshChen commented 6 months ago

抱歉学长,还想请教下,另外输出的结果仅仅是打印出了text集下对应的评估指标,想要获得其他的指标是需要自己调整代码的是吗,绘制训练过程中验证集上MRR的变化图可以直接添加代码获得到,另外我修改了学习率提升了两倍再次运行发现开始收敛的很快,中间很长一段时间没有收敛,直到最后又收敛了一些,是否意味着学习率可以继续调整,而且我发现头部和尾部的结果相差很大,尾部的效果比头部效果优秀很多,可能会是什么原因呢

liuxiyang641 commented 6 months ago

你想要获得其它数据集的具体评估结果,可以自己修改代码;然后学习率调大的话,你的收敛速度当然会加快,但是最后效果是否能提升不确定。对于超参,我建议你可以用grid search方法,或者是利用一些自动超参搜索的工具去调整。 MRR的预测尾实体,和预测头实体的差距在FB15k-237这些标准数据集下就比较大,这个应该主要是和关系的特征有关,比如一个头实体在特定关系下,是对应一个尾实体还是多个尾实体。你可以尝试对于每个关系进行分别测试,观察预测效果。

1FreshChen commented 6 months ago

那进行分类过后的数据集还需要再进行三个数据集的划分么,直接进行训练么

1FreshChen commented 6 months ago

另外我看默认的策略是1-n,这个对于所有的数据都采取该策略会有影响嘛

liuxiyang641 commented 6 months ago
  1. 不用重新训练,你就把测试集按照关系划分,能够迭代的输出不同关系对应的测试结果就好
  2. 1-n的策略是用于评估的,就是假设一个实体对应的尾实体可能有1个或者多个,希望预测结果里正确的尾实体应该被排序在数据集内所有实体的前面
1FreshChen commented 6 months ago

可能由于数据的特殊性,人工分类过后所有的数据都属于n-n关系,是不是就没有意义了

1FreshChen commented 6 months ago

另外我想请问下三元组的内容是数值形式或者文本形式,两种形式下的内容训练得到的结果会有不同么

liuxiyang641 commented 6 months ago
  1. 1-n在代码里我印象中是指解码器ConvE提出的评估方法,是说1个头实体,会和所有实体(记为n个)的向量计算,评估哪个实体属于尾实体;还有一个评估策略是1-x,指1个头实体,只和x个实体的向量计算,评估哪个实体属于尾实体。不要把它和数据集内的关系(1对1,1对多,多对1,多对多)这些类型混淆了。
  2. 数值形式的三元组和文本形式三元组应该没有本质区别,在代码里都会被编码为数值
1FreshChen commented 6 months ago

好的好的 谢谢学长 一开始确实是混淆了 麻烦您啦