RUCAIBox / RecBole

A unified, comprehensive and efficient recommendation library
https://recbole.io/
MIT License
3.37k stars 606 forks source link

DIN 训练咨询[🐛BUG] 用一句话描述您的问题。 #1960

Open NEUYuYang opened 9 months ago

NEUYuYang commented 9 months ago

你好,我在用DIN模型跑ml-1m数据集 参数如下: 'field_separator': "\t", 'seq_separator': " ", 'data_path': "./dataset", 'val_interval': {'rating': "[0,3);(3,inf)"}, 'threshold': {'rating': 4}, 'load_col': {'inter': ['user_id', 'item_id','timestamp','rating'], 'item': ['item_id', 'genre', 'release_year'], 'user': ['user_id', 'age', 'gender', 'occupation']}, 'USER_ID_FIELD': 'user_id', 'ITEM_ID_FIELD': 'item_id', 'RATING_FIELD': 'rating', 'NEGPREFIX': 'neg', 'LABEL_FIELD': 'label', 'eval_args':{'split':{'RS':[0.8,0.1,0.1]}, 'group_by':'none', 'mode': 'labeled', 'order': 'TO'}, 'show_progress': False, 'epochs': 200, 'train_batch_size': 4096, 'eval_batch_size': 40960000, 'valid_metric': 'AUC', 'metrics': ['AUC', 'LogLoss'], 'embedding_size': 16, 'learning_rate': 1e-2, 'dropout_prob': 0.1, 'mlp_hidden_size': '[128,128,128]', 'pooling_mode': 'mean', 'stopping_step': 200 目前的问题是,验证集的AUC最高值在第一个epoch并且只有0.62,其他epoch的验证AUC都在0.62以下,训练集损失是下降的 可否解惑一下哪里出错了

NEUYuYang commented 8 months ago

AUC指标异常我已经处理好了,配置参数如下:

dataset config

field_separator: "\t" #指定数据集field的分隔符 seq_separator: " " #指定数据集中token_seq或者float_seq域里的分隔符 USER_ID_FIELD: user_id #指定用户id域 ITEM_ID_FIELD: item_id #指定物品id域 RATING_FIELD: rating #指定打分rating域 TIME_FIELD: timestamp #指定时间域 NEGPREFIX: neg #指定负采样前缀 LABEL_FIELD: label #指定标签域

因为数据集没有标签,所以设置一个阈值,认为rating高于该值的是正例,反之是负例

threshold: rating: 4

指定从什么文件里读什么列,这里就是从ml-1m.inter里面读取user_id, item_id, rating, timestamp这四列,剩下的以此类推

load_col: inter: [user_id, item_id,timestamp, rating] user: [user_id, age, gender, occupation] item: [item_id, genre]

training settings

epochs: 500 #训练的最大轮数 train_batch_size: 4096 #训练的batch_size learner: adam #使用的pytorch内置优化器 learning_rate: 0.001 #学习率 train_neg_sample_args: ~ #负采样数目 eval_step: 1 #每次训练后做evalaution的次数 stopping_step: 10 #控制训练收敛的步骤数,在该步骤数内若选取的评测标准没有什么变化,就可以提前停止了

evalution settings

eval_args: split: {'RS':[0.8, 0.1, 0.1]} #对数据随机重排,设置按比例划分数据集 group_by: ~ #是否将一个user的记录划到一个组里 mode: labeled order: TO metrics: ['AUC', 'LogLoss'] #评测标准 valid_metric: AUC #选取哪个评测标准作为作为提前停止训练的标准 eval_batch_size: 4096 #评测的batch_size

model config

embedding_size: 10 # (int) The embedding size of features. mlp_hidden_size: [256,256,256] # (list of int) The hidden size of MLP layers. dropout_prob: 0.0 # (float) The dropout rate.
pooling_mode: 'mean' # (str) Pooling mode of sequence data.

show_progress: False

与原来的相比增加了train_neg_sample_args: ~

NEUYuYang commented 8 months ago

我目前想跑DIN模型在ml-1m数据集上在'Recall', 'MRR', 'NDCG', 'Hit', 'Precision' 这些评价指标上的数值 因为许多推荐论文在使用DIN作为baseline时,选择这些指标 目前的问题是,训练集损失可以正常下降,但是验证集这些指标'Recall', 'MRR', 'NDCG', 'Hit', 'Precision' 在第一个epoch性能最好,不知道我哪里出现了问题,恳请指教

我的yaml文件如下

dataset config

field_separator: "\t" #指定数据集field的分隔符 seq_separator: " " #指定数据集中token_seq或者float_seq域里的分隔符 USER_ID_FIELD: user_id #指定用户id域 ITEM_ID_FIELD: item_id #指定物品id域 RATING_FIELD: rating #指定打分rating域 TIME_FIELD: timestamp #指定时间域 NEGPREFIX: neg #指定负采样前缀 LABEL_FIELD: label #指定标签域 ITEM_LIST_LENGTH_FIELD: item_length #指定序列长度域 LIST_SUFFIX: _list #指定序列前缀 MAX_ITEM_LIST_LENGTH: 50 #指定最大序列长度 POSITION_FIELD: position_id #指定生成的序列位置id threshold: rating: 4

指定从什么文件里读什么列,这里就是从ml-1m.inter里面读取user_id, item_id, rating, timestamp这四列,剩下的以此类推

load_col: inter: [user_id, item_id, rating, timestamp]

training settings

epochs: 500 #训练的最大轮数 train_batch_size: 4096 #训练的batch_size learner: adam #使用的pytorch内置优化器 learning_rate: 0.001 #学习率 train_neg_sample_args: ~ #负采样数目 eval_step: 1 #每次训练后做evalaution的次数 stopping_step: 10 #控制训练收敛的步骤数,在该步骤数内若选取的评测标准没有什么变化,就可以提前停止了

evalution settings

eval_args: split: {'LS': 'valid_and_test'} #对数据随机重排,设置按比例划分数据集 group_by: user #是否将一个user的记录划到一个组里 mode: full order: TO metrics: ['Recall', 'MRR', 'NDCG', 'Hit', 'Precision'] #评测标准 valid_metric: MRR@10 #选取哪个评测标准作为作为提前停止训练的标准 eval_batch_size: 4096 #评测的batch_size topk: 10

model config

embedding_size: 10 # (int) The embedding size of features. mlp_hidden_size: [256,256,256] # (list of int) The hidden size of MLP layers. dropout_prob: 0.0 # (float) The dropout rate.
pooling_mode: 'mean' # (str) Pooling mode of sequence data. show_progress: False

日志文件附加在文件中 DIN_ml1m_seq.txt

BishopLiu commented 8 months ago

@NEUYuYang 你好,DIN是CTR模型要用AUC等指标进行评测,它的训练损失是BCE和NDCG等指标并没有完全对齐,配置文件方面没发现有什么问题

NEUYuYang commented 8 months ago

在一些推荐系统论文中,使用DIN作为baseline的一种,并且使用MRR、Recall等作为评价指标,Recbole框架能否达到这样效果? 初次接触Recbole框架,有许多不懂之处,谢谢指点^ω^

---原始邮件--- 发件人: "Enze @.> 发送时间: 2024年1月12日(周五) 晚上7:16 收件人: @.>; 抄送: @.**@.>; 主题: Re: [RUCAIBox/RecBole] DIN 训练咨询[🐛BUG] 用一句话描述您的问题。 (Issue #1960)

@NEUYuYang 你好,DIN是CTR模型要用AUC等指标进行评测,它的训练损失是BCE和NDCG等指标并没有完全对齐,配置文件方面没发现有什么问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

BishopLiu commented 8 months ago

伯乐的DIN是遵循原文的设计实现的,针对主要是AUC这些指标,对于其他指标效果没办法保证,此外我很少见到拿DIN测其他指标的,可以举例一些论文吗

NEUYuYang commented 8 months ago

Contrastive learning framework to disentangle Long and Short-term interests for Recommendation还有一些,不过现在身边没有电脑,找不到其他的

---原始邮件--- 发件人: "Enze @.> 发送时间: 2024年1月12日(周五) 晚上7:38 收件人: @.>; 抄送: @.**@.>; 主题: Re: [RUCAIBox/RecBole] DIN 训练咨询[🐛BUG] 用一句话描述您的问题。 (Issue #1960)

伯乐的DIN是遵循原文的设计实现的,针对主要是AUC这些指标,对于其他指标效果没办法保证,此外我很少见到拿DIN测其他指标的,可以举例一些论文吗

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>