For a more detailed explanation of our model, we recommend reading our Medium blog post:
This is the official implementation of our CIKM 2021 paper "LT-OCF: Learnable-Time ODE-based Collaborative Filtering". LT-OCF is a novel approach to collaborative filtering that uses neural ordinary differential equations (NODEs) with learnable time points.
LT-OCF | LightGCN |
---|---|
Our proposed LT-OCF model offers several advantages over LightGCN:
- Continuous-time modeling: LT-OCF uses ODEs to model embedding evolution in continuous time, while LightGCN uses discrete layers.
- Co-evolving embeddings: User and item embeddings evolve simultaneously through coupled ODEs in LT-OCF, enabling richer interactions.
- Learnable time points: LT-OCF allows flexible layer combinations with learnable time points, enhancing model adaptability.
- Smooth evolution: Embeddings in LT-OCF evolve smoothly from initial to final states, potentially capturing more nuanced patterns.
While LightGCN offers simplicity and computational efficiency, LT-OCF provides greater flexibility and expressive power in modeling collaborative filtering dynamics.
If you find this work useful in your research, please consider citing:
@inproceedings{choi2021ltocf,
title={LT-OCF: Learnable-Time ODE-based Collaborative Filtering},
author={Choi, Jeongwhan and Jeon, Jinsung and Park, Noseong},
booktitle={Proceedings of the 30th ACM International Conference on Information and Knowledge Management},
year={2021}
}
conda env create -f environment.yml
conda activate lt-ocf
- Run the shell file (at the root of the project)
# run lt-ocf (gowalla dataset, rk4 solver, learnable time)
sh ltocf_gowalla_rk4.sh
# run lt-ocf (gowalla dataset, rk4 solver, fixed time)
sh ltocf_gowalla_rk4_fixed.sh
--gpuid
- GPU ID (default:
0
)
- GPU ID (default:
--dataset
- Chose from
gowalla
,yelp2018
,amazon-book
- Chose from
--model
- Use
ltocf
- Use
--solver
- Chose from
euler
,rk4
,dopri5
- Chose from
--adjoint
False
(default),True
--K
- Number of layers (1, 2, 3, 4)
--learnable_time
True
(learnable) ,False
(fixed)
--dual_res
False
(default),True
For a full list of arguments, please refer to parse.py
.