Sequential recommendation model incorporating semantic and graph pooling.
├── data/ # Data loading and transformation code
│ ├── dataloader.py # Custom dataloader with transforms
│ ├── dataset.py # SGPDataset - loads embeddings and interactions
│ └── transform.py # Data augmentation transforms
├── dataset/ # Dataset archive and unzipped training files
│ ├── baby_modern_bge_siglip.tar.gz
│ └── baby_modern_raw_unzip/
├── run.py # Main training script
├── sgp.py # SGP model implementation
├── model_utils.py # Model utilities
├── SGP4SR.yaml # Model config
├── run.yaml # Training config
└── README.md
Data của project được unzip trực tiếp từ file:
/kaggle/SGP4SR/dataset/baby_modern_bge_siglip.tar.gz
File nén này đã chứa sẵn:
baby.train.inter: tập train.baby.valid.inter: tập validation dùng trong quá trình train/early stopping.baby.test.inter: tập test dùng để đánh giá cuối cùng.text_features_bge.npy: vector text BGE, shape(7015, 768).image_features_siglip.npy: vector image SigLIP, shape(7015, 768).
Chạy các lệnh sau từ thư mục project:
cd /kaggle/SGP4SR
mkdir -p dataset/baby_modern_raw_unzip
tar -xzf dataset/baby_modern_bge_siglip.tar.gz -C dataset/baby_modern_raw_unzipSau khi unzip, folder data gốc sẽ có dạng:
dataset/baby_modern_raw_unzip/
`-- baby_modern/
|-- dataset/baby/
| |-- baby.train.inter
| |-- baby.valid.inter
| `-- baby.test.inter
|-- text_features_bge.npy
|-- image_features_siglip.npy
|-- item_text.jsonl
|-- image_paths.jsonl
|-- image_download_failed.jsonl
|-- item2id.json
`-- user2id.json
RecBole đọc dataset theo tên folder và tên file cùng prefix. Vì folder train sẽ là baby_modern_raw_unzip, cần tạo các symlink sau:
cd /kaggle/SGP4SR
ln -sf baby_modern/dataset/baby/baby.train.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.train.inter
ln -sf baby_modern/dataset/baby/baby.valid.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.valid.inter
ln -sf baby_modern/dataset/baby/baby.test.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.test.inter
ln -sf baby_modern/text_features_bge.npy dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.text
ln -sf baby_modern/image_features_siglip.npy dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.imageSau bước này, folder dùng để train sẽ có các file/link chính:
dataset/baby_modern_raw_unzip/
|-- baby_modern_raw_unzip.train.inter -> baby_modern/dataset/baby/baby.train.inter
|-- baby_modern_raw_unzip.valid.inter -> baby_modern/dataset/baby/baby.valid.inter
|-- baby_modern_raw_unzip.test.inter -> baby_modern/dataset/baby/baby.test.inter
|-- baby_modern_raw_unzip.text -> baby_modern/text_features_bge.npy
|-- baby_modern_raw_unzip.image -> baby_modern/image_features_siglip.npy
`-- baby_modern/
Kiểm tra data/link đã có đúng chưa:
ls -l dataset/baby_modern_raw_unzipTên dataset dùng cho training là:
baby_modern_raw_unzip
Có thể chạy toàn bộ bước unzip + tạo symlink bằng block sau:
cd /kaggle/SGP4SR
mkdir -p dataset/baby_modern_raw_unzip
tar -xzf dataset/baby_modern_bge_siglip.tar.gz -C dataset/baby_modern_raw_unzip
ln -sf baby_modern/dataset/baby/baby.train.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.train.inter
ln -sf baby_modern/dataset/baby/baby.valid.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.valid.inter
ln -sf baby_modern/dataset/baby/baby.test.inter dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.test.inter
ln -sf baby_modern/text_features_bge.npy dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.text
ln -sf baby_modern/image_features_siglip.npy dataset/baby_modern_raw_unzip/baby_modern_raw_unzip.imageChạy thử vài step để kiểm tra data, embedding, model forward/backward đều hoạt động:
cd /kaggle/SGP4SR
python run.py -d baby_modern_raw_unzip --smoke-steps 2Nếu chạy đúng, output sẽ có dạng:
smoke step 1/2 loss=...
smoke step 2/2 loss=...
Chạy training full trên tập train, validate trên tập valid, và evaluate trên tập test:
cd /kaggle/SGP4SR
python run.py -d baby_modern_raw_unzipKết quả evaluation được ghi theo logic hiện tại trong run.py, bao gồm best_valid_result và test_result.
Kết quả JSON được lưu trong thư mục:
results/
Best run hiện tại là run 2 với config:
learning_rate: 0.0003
weight_decay: 1e-5
MAX_ITEM_LIST_LENGTH: 123
epochs: 10
stopping_step: 10
hidden_dropout_prob: 0.4
attn_dropout_prob: 0.4Best validation ở epoch 8 theo Recall@5.
Best valid result:
{
"recall@5": 0.0443,
"recall@10": 0.0706,
"recall@20": 0.1022,
"recall@50": 0.1675,
"ndcg@5": 0.0271,
"ndcg@10": 0.0355,
"ndcg@20": 0.0435,
"ndcg@50": 0.0564
}Test result sau khi load best model:
{
"recall@5": 0.0355,
"recall@10": 0.0576,
"recall@20": 0.0848,
"recall@50": 0.1404,
"ndcg@5": 0.0229,
"ndcg@10": 0.0301,
"ndcg@20": 0.0369,
"ndcg@50": 0.0479
}Best checkpoint:
saved/SGP-May-09-2026_15-17-27.pth
Log chi tiết:
log/SGP/SGP-baby_modern_raw_unzip-May-09-2026_15-16-43-9d0c6c.log
JSON kết quả:
results/SGP-baby_modern_raw_unzip-2026-05-09_16-08-49.json
Config files:
SGP4SR.yaml– Model hyperparametersrun.yaml– Data & training configs