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
--adjointFalse(default),True
--K- Number of layers (1, 2, 3, 4)
--learnable_timeTrue(learnable) ,False(fixed)
--dual_resFalse(default),True
For a full list of arguments, please refer to parse.py.

