GPU: Tesla T4;显存16G
- torch==1.13.1+cu117
- fuxictr==2.3.7
- openai
conda create -n fuxictr python==3.9
pip install -r requirements.txt
source activate fuxictr
conda install openai观察到DIN学习连续特征没有离散特征快, 我们将item的高质量连续特征进行离散化. 连续多模态特征选择
1. OpenAI提供的GPT对item_title字段的1024维embedding,
2. 比赛方提供的img_emb_CLIPRN50的编码.
我们首先对上述两个特征进行离散化, 使用VQ-VAE, 两部分特征分别生成512维度的离散向量, 向量值得范围为[0..1023], 拼接作为新的特征dis_dim, 之后将其作为一个type为sequence的特征传入DIN. 最后, 对于每个item, 我们查找了item_tags\likes_level\views_level\dis_dim四个字段的特征用于DIN的序列建模, 其余保持不变.
由于超参数的影响过大,代码提供了两个版本,普通版是一组未提交的模型;std版是排行榜上的最优参数!!
原始数据:
./data/
MicroLens_1M_x1/
item_info.parquet
test.parquet
train.parquet
valid.parquet
./dataset/
MicroLens_1M_MMCTR/
item_feature.parquet
item_emb.parquet
item_seq.parquet
item_images.rar 第1步之后:
./data/
MicroLens_1M_x1/
item_info.parquet
test.parquet
train.parquet
valid.parquet
./dataset/
MicroLens_1M_MMCTR/
item_feature.parquet
...
gpt_embedding.npy第2步之后:
./data/
MicroLens_1M_x1/
item_info.parquet
test.parquet
train.parquet
valid.parquet
./dataset/
MicroLens_1M_MMCTR/
item_feature.parquet
item_feature_gpt.parquet
...
gpt_embedding.npy第3步之后:
./data/
MicroLens_1M_x1/
item_info.parquet
test.parquet
train.parquet
valid.parquet
EMB_all_emb_cb05_data.parquet
EMB_all_emb_cb05_std_data.parquet
./dataset/
MicroLens_1M_MMCTR/
item_feature.parquet
item_feature_gpt.parquet
...
gpt_embedding.npy我们处理好数据放在谷歌网盘里:Download
比赛数据下载连接: https://recsys.westlake.edu.cn/MicroLens_1M_MMCTR
- 确保已经存在
dataset/MicroLens_1M_MMCTR/item_feature.parquet, 使用GPTAPI获取数据中item_title字段的embedding, 得到维度为$\mathcal{R}^1024$ 的特征向量, "dataset/embedding.npy"
python -u get_gpt_embedding.py- 确保已经存在了
dataset/gpt_embedding.npy和dataset/MicroLens_1M_MMCTR/item_feature.parquet. 将向量拼在原始的parquet的文件中,得到(dataset/MicroLens_1M_MMCTR/item_feature_gpt.parquet)
python -u merge_data.py- 确保已经存在了
dataset/MicroLens_1M_MMCTR/item_feature_gpt.parquet, 之后首先训练一个vae, 之后将特征离散化.
python run_param_tuner.py --config config/EMB_all_emb_cb05.yaml --gpu 0 --script run_all_embedding # 训练
python encode_all_emb.py --config config/EMB_all_emb_cb05 --expid EMB_cb_allemb_001_89dd7fc0 --gpu 0 # 标注
python generate_item_info.py --data_name EMB_all_emb_cb05_data # 生成item_info文件# std 版
python run_param_tuner.py --config config/EMB_all_emb_cb05_std.yaml --gpu 0 --script run_all_embedding # 训练
python encode_all_emb.py --config config/EMB_all_emb_cb05_std --expid EMB_cb_allemb_001_41148123 --gpu 0 # 标注
python generate_item_info.py --data_name EMB_all_emb_cb05_std_data # 生成item_info文件- 确保已经存在了
data/MicroLens_1M_x1/EMB_all_emb_cb05_data.parquet, 之后训练DIN并预测结果
python run_param_tuner.py --config config/DIN_microlens_mmctr_tuner_config_qvq.yaml --gpu 0
python prediction.py --config config/DIN_microlens_mmctr_tuner_config_qvq --expid DIN_MicroLens_1M_x1_001_22cde3b8 --gpu 0# 确保已经存在了`data/MicroLens_1M_x1/EMB_all_emb_cb05_std_data.parquet`, 之后训练DIN并预测结果
python run_param_tuner.py --config config/DIN_microlens_mmctr_tuner_config_qvq_std.yaml --gpu 0
python prediction.py --config config/DIN_microlens_mmctr_tuner_config_qvq_std --expid DIN_MicroLens_1M_x1_001_462cd4cb --gpu 0bash -x run.sh
bash -x run_std.sh