RUCAIBox / RecBole-GNN

Efficient and extensible GNNs enhanced recommender library based on RecBole.
MIT License
167 stars 37 forks source link

[🐛BUG] MHCN在Douban数据集上并没有复现出原论文的效果 #61

Open LDY911 opened 1 year ago

LDY911 commented 1 year ago

您好,我使用MHCN在Douban数据集上并没有跑出原论文的效果,原论文对Douban数据集的预处理是删除掉评分小于4的item,原论文的结果是:recall@10:0.06556、ndcg@10:0.20694、precision@10:0.18283 但是我跑的结果是recall@10:0.0485、ndcg@10:0.1397、precision@10:0.1247 跑不过lightGCN,recall@10:0.0654、ndcg@10:0.1968、precision@10:0.171 想请教一下原因是什么,感谢指导

LDY911 commented 1 year ago

想请教一下如何实现原论文中的结果,参数配置是怎么样的,我使用的就是默认的参数配置,好像除了LastFM,在其他数据集上,MHCN和SEPT都跑不过LightGCN,不过LightGCN的结果与原论文给出的大致相似,差别不大,但是MHCN和SEPT的结果相差较大,感谢指导

LDY911 commented 1 year ago

我划分数据集是训练集:测试集=8:2,没有设置验证集,epoch=120,而且我发现RecBole的默认设置与原论文不太一样,比如embedding_size、ssl_reg等

Sherry-XLL commented 1 year ago

@LDY911 您好,要实现原论文中的结果需要和原论文设置保持基本一致才可以,比如 embedding_size 需要和原论文保持一致,直接使用默认的参数配置往往不能得到较好的结果。对于 MHCN 和 SEPT 等通过自监督学习的方式提升结果的模型,自监督学习的超参数 ssl_reg 对论文结果的影响较大,也需要经过较为精细的调参。

关于论文的配置可以参考原作者提供的代码:QRec。由于原文是基于 tensorflow 实现的 MHCN 模型,所以使用基于 PyTorch 的 RecBole-GNN 时需要对涉及到的超参数进行细致的搜索,才能基本复现原文的结果。

LDY911 commented 1 year ago

好的,感谢您的回复,我去调整一下参数试试,谢谢指导

Coder-Yu commented 1 year ago

@LDY911 您好,要实现原论文中的结果需要和原论文设置保持基本一致才可以,比如 embedding_size 需要和原论文保持一致,直接使用默认的参数配置往往不能得到较好的结果。对于 MHCN 和 SEPT 等通过自监督学习的方式提升结果的模型,自监督学习的超参数 ssl_reg 对论文结果的影响较大,也需要经过较为精细的调参。

关于论文的配置可以参考原作者提供的代码:QRec。由于原文是基于 tensorflow 实现的 MHCN 模型,所以使用基于 PyTorch 的 RecBole-GNN 时需要对涉及到的超参数进行细致的搜索,才能基本复现原文的结果。

谢谢澜玲的回复。这位同学你可以贴一下你的参数吗?跑不过LightGCN是不可能的。

LDY911 commented 1 year ago

@LDY911 您好,要实现原论文中的结果需要和原论文设置保持基本一致才可以,比如 embedding_size 需要和原论文保持一致,直接使用默认的参数配置往往不能得到较好的结果。对于 MHCN 和 SEPT 等通过自监督学习的方式提升结果的模型,自监督学习的超参数 ssl_reg 对论文结果的影响较大,也需要经过较为精细的调参。 关于论文的配置可以参考原作者提供的代码:QRec。由于原文是基于 tensorflow 实现的 MHCN 模型,所以使用基于 PyTorch 的 RecBole-GNN 时需要对涉及到的超参数进行细致的搜索,才能基本复现原文的结果。

谢谢澜玲的回复。这位同学你可以贴一下你的参数吗?跑不过LightGCN是不可能的。

感谢您的回复,以下是我在RecBole使用SEPT在Douban-book上的参数设置,麻烦您帮我看一下哪里设置不合理 learner = adam learning_rate = 0.001 train_neg_sample_args = {'distribution': 'uniform', 'sample_num': 1, 'alpha': 1.0, 'dynamic': False, 'candidate_num': 0} eval_step = 1 stopping_step = 10 clip_grad_norm = None weight_decay = 0.0 loss_decimal_place = 4

Evaluation Hyper Parameters: eval_args = {'split': {'RS': [0.8, 0, 0.2]}, 'group_by': 'user', 'order': 'RO', 'mode': 'full'} repeatable = False metrics = ['Recall', 'NDCG', 'Precision'] topk = [10] valid_metric = mrr@10 valid_metric_bigger = True eval_batch_size = 4096 metric_decimal_place = 4

Dataset Hyper Parameters: field_separator = seq_separator = USER_ID_FIELD = user_id ITEM_ID_FIELD = item_id RATING_FIELD = rating TIME_FIELD = timestamp seq_len = None LABEL_FIELD = label threshold = None NEGPREFIX = neg load_col = {'inter': ['user_id', 'item_id'], 'net': ['source_id', 'target_id']} unload_col = None unused_col = None additional_feat_suffix = None rm_dup_inter = None val_interval = None filter_inter_by_user_or_item = True user_inter_num_interval = [0,inf) item_inter_num_interval = [0,inf) alias_of_user_id = None alias_of_item_id = None alias_of_entity_id = None alias_of_relation_id = None preload_weight = None normalize_field = None normalize_all = None ITEM_LIST_LENGTH_FIELD = item_length LIST_SUFFIX = _list MAX_ITEM_LIST_LENGTH = 50 POSITION_FIELD = position_id HEAD_ENTITY_ID_FIELD = head_id TAIL_ENTITY_ID_FIELD = tail_id RELATION_ID_FIELD = relation_id ENTITY_ID_FIELD = entity_id benchmark_filename = None

Other Hyper Parameters: worker = 0 wandb_project = recbole shuffle = True require_pow = False enable_amp = False enable_scaler = False transform = None numerical_features = [] discretization = None kg_reverse_r = False entity_kg_num_interval = [0,inf) relation_kg_num_interval = [0,inf) MODEL_TYPE = ModelType.SOCIAL warm_up_epochs = 5 embedding_size = 50 n_layers = 2 drop_ratio = 0.3 instance_cnt = 10 reg_weight = 1e-05 ssl_weight = 0.01 ssl_tau = 0.1 NET_SOURCE_ID_FIELD = source_id NET_TARGET_ID_FIELD = target_id filter_net_by_inter = True undirected_net = False neg_sampling = {'uniform': 50} MODEL_INPUT_TYPE = InputType.PAIRWISE eval_type = EvaluatorType.RANKING single_spec = True local_rank = 0 device = cuda eval_neg_sample_args = {'distribution': 'uniform', 'sample_num': 'none'}

数据集划分是RecBole自动划分的,按照训练集测试集8:2划分的,麻烦您了,谢谢指导

Coder-Yu commented 1 year ago

我的论文实验部分4.1以及4.5都告诉了最佳参数,你这个设置里面有一些是不一致的比如ssl_weight是0.02而不是0.01。另外建议你用QRec跑,RecBole的实现可能会有一些细微差别。你可以看下这个issue关于douban-book数据集的问题https://github.com/Coder-Yu/QRec/issues/242

LDY911 commented 1 year ago

我的论文实验部分4.1以及4.5都告诉了最佳参数,你这个设置里面有一些是不一致的比如ssl_weight是0.02而不是0.01。另外建议你用QRec跑,RecBole的实现可能会有一些细微差别。你可以看下这个issue关于douban-book数据集的问题Coder-Yu/QRec#242 我通过调参基本复现了结果,感谢您的指导