RUCAIBox / LLMRank

[ECIR'24] Implementation of "Large Language Models are Zero-Shot Rankers for Recommender Systems"
MIT License
221 stars 20 forks source link

sasrec games复现结果不一致 #8

Open remember00000 opened 10 months ago

remember00000 commented 10 months ago

test result: OrderedDict([('recall@1', 0.04), ('recall@5', 0.235), ('recall@10', 0.46), ('recall@20', 1.0), ('recall@50', 1.0), ('ndcg@1', 0.04), ('ndcg@5', 0.1323), ('ndcg@10', 0.2035), ('ndcg@20', 0.3383), ('ndcg@50', 0.3383)]) 您好,以上是我按照给出的sasrec预训练模型和代码中的数据得到的结果,远低于论文结果,请问是怎么回事,是yaml文件中某个地方的设置问题吗,现在是在random数据集中进行的,请问是什么原因?

image
hyp1231 commented 10 months ago

您好,请问您运行时的脚本命令是?

remember00000 commented 10 months ago

python evaluate.py -m SASRec -d Games -p pretrained_models/SASRec-Games.pth

hyp1231 commented 10 months ago

我直接 clone 项目重装环境后,按照下述脚本

python evaluate.py -m SASRec -d Games -p pretrained_models/SASRec-Games.pth

得到结果为

02 Nov 00:55    INFO  test result: OrderedDict([('recall@1', 0.525), ('recall@5', 0.865), ('recall@10', 0.94), ('recall@20', 1.0), ('recall@50', 1.0), ('ndcg@1', 0.525), ('ndcg@5', 0.7071), ('ndcg@10', 0.7325), ('ndcg@20', 0.7474), ('ndcg@50', 0.7474)])
02 Nov 00:55    INFO  0.525 0.865   0.94    1.0 1.0 0.525   0.7071  0.7325  0.7474  0.7474

如果运行

python evaluate.py -m SASRec -d Games

即不加载预训练模型,几乎等于随机,则

02 Nov 00:56    INFO  test result: OrderedDict([('recall@1', 0.045), ('recall@5', 0.255), ('recall@10', 0.505), ('recall@20', 1.0), ('recall@50', 1.0), ('ndcg@1', 0.045), ('ndcg@5', 0.1476), ('ndcg@10', 0.2265), ('ndcg@20', 0.3493), ('ndcg@50', 0.3493)])
02 Nov 00:56    INFO  0.045 0.255   0.505   1.0 1.0 0.045   0.1476  0.2265  0.3493  0.3493

所以可以看到您得到的结果和不加载模型的结果接近,推测似乎可能是加载模型部分可能代码框架出了什么问题?您如果运行去掉 -p pretrained_models/SASRec-Games.pth 的脚本得到的结果是什么样子的呢?

remember00000 commented 10 months ago

感谢回复,我去掉-p随机结果也是这样,我的预训练模型文件是从您那边上传的google drive下载的; 但我使用-p时命令行有显示02 Nov 08:09 INFO Loading from pretrained_models/SASRec-Games.pth

hyp1231 commented 10 months ago

要不对一下模型文件是否一致?在 Linux 服务器上测 md5:

md5sum SASRec-Games.pth
985efba355d24cc169cb07e2d1fa2ef5  SASRec-Games.pth

在 macOS 上刚刚又下载了一份,测 md5:

md5 SASRec-Games.pth
MD5 (SASRec-Games.pth) = 985efba355d24cc169cb07e2d1fa2ef5
remember00000 commented 10 months ago

’985efba355d24cc169cb07e2d1fa2ef5 pretrained_models/SASRec-Games.pth‘ 是的,是一致的,另外我的games数据集是从amazon2018上这两个位置下载的 image image

remember00000 commented 10 months ago

感谢您的回复,很疑惑问题出在哪里

hyp1231 commented 10 months ago

您的 Games.random 是重新生成的吗?还是直接用项目自带的?

以及您的 PyTorch 和 RecBole 库的版本是?

remember00000 commented 10 months ago

使用重新生成和自带的都是近似随机的效果,所以请问您源文件这里是不是一致; 另外我重新clone文件之后,不进行games处理操作会得到: ValueError: File dataset/Games/Games.train.inter not exist 所以怀疑是源文件是否一致; torch 1.13.0 recbole 1.2.0

hyp1231 commented 10 months ago

我一方面建议把 recbole 降级到 1.1.1 试一下,因为我自己也还没测过 1.2.0 版本。

另一方面因为不清楚您数据处理的细节,建议直接解压 llmrank/dataset/Games/Games.inter.zip 来获得 Games.train.inter 文件。

remember00000 commented 10 months ago

OrderedDict([('recall@1', 0.525), ('recall@5', 0.865), ('recall@10', 0.94), ('recall@20', 1.0), ('recall@50', 1.0), ('ndcg@1', 0.525), ('ndcg@5', 0.7071), ('ndcg@10', 0.7325), ('ndcg@20', 0.7474), ('ndcg@50', 0.7474) 直接解压确实获得这里,我对比了test文件的不同左边是我的,右边是您的: image

请问源文件是对应的上面截图的两个吗? 另外就是我在运行 ’python data_process_amazon.py --dataset Games‘时 f1.write(str(user)+'\t'+' '.join([str(item) for item in train_list])+'\t'+str(train_target_item)+'\n') https://github.com/RUCAIBox/LLMRank/blob/fc3c5cdd97521406cf36d124635857f4d247a4fa/llmrank/data_process_amazon.py#L230 这里会报错所以删掉了这一行。

hyp1231 commented 10 months ago

是的,因为您的 test 文件对 item 的编码,和 Games.random 中对 item 的编码是不一致的,所以确实就相当于随机。

这一行应该不太能删,会导致训练数据少一个 interaction,不过影响的不是这个结果。本 issue 讨论的问题还是因为 Games.test.interGames.random 编码不一致的问题

remember00000 commented 10 months ago

但是我使用 python sample_candidates.py -s random -d Games重新生成 random文件后,得到的结果仍然是: OrderedDict([('recall@1', 0.04), ('recall@5', 0.235), ('recall@10', 0.46), ('recall@20', 1.0), ('recall@50', 1.0), ('ndcg@1', 0.04), ('ndcg@5', 0.1323), ('ndcg@10', 0.2035), ('ndcg@20', 0.3383), ('ndcg@50', 0.3383)])

hyp1231 commented 10 months ago

因为预训练模型的编码和您的 test.inter 是不一致的,肯定结果也是随机的

remember00000 commented 10 months ago

使用自己训练的模型得到:('ndcg@1', 0.515), ('ndcg@5', 0.6933), ('ndcg@10', 0.7224), ('ndcg@20', 0.7383), ('ndcg@50', 0.7383)]);感谢您的回复!因为对于这个模型不熟悉产生的错误:( 另外想咨询您,如果想使用auc 的value一类的评价指标,对应的yaml文件应该是怎么样的呢,我想用这类指标来测试表现,但对于recbole我看了文档较长时间但不确定具体实现,想问您有这个对应的yaml实现或者哪里进行修改吗

hyp1231 commented 10 months ago

客气!很高兴看到能成功复现

这个确实比较棘手,我可能会建议把评分打印出来手动计算。因为 AUC 一般是 CTR 任务用的比较多,更偏向分类任务,在 RecBole 的组织中和 Ranking model 的指标计算不太适配。

remember00000 commented 10 months ago

看到RecBole中有直接提供的auc指标,那个可以用吗

hyp1231 commented 10 months ago

在 RecBole 中 AUC 和 Ranking model 的指标计算不太适配,可能没办法直接用