Il s'agit de la mise en œuvre officielle de l'article: sur le goulot d'étranglement des réseaux de neurones graphiques et ses implications pratiques (ICLR'2021), qui introduit le problème exagéré des GNN.
Par Uri Alon et Eran Yahav. Voir aussi les [vidéo], [affiche] et [les diapositives].
Ce référentiel est divisé en trois sous-projets:
tf-gnn-samples
est un clone de https://github.com/microsoft/tf-gnn-Samples par Brockschmidt (ICML'2020). Ce projet peut être utilisé pour reproduire les expériences QM9 et Varmisuse des sections 4.2 et 4.2 dans le papier. Ce sous-projet dépend de TensorFlow 1.13. Les instructions pour notre clone sont les mêmes que leur code d'origine, sauf que la reproduction de nos expériences (l'ensemble de données QM9 et Varmisuse) peut être effectuée en exécutant le script tf-gnn-samples/run_qm9_benchs_fa.py
ou tf-gnn-samples/run_varmisuse_benchs_fa.py
au lieu de leurs scripts d'origine. Pour des dépendances et des instructions supplémentaires, consultez leur Readme original: https://github.com/microsoft/tf-gnn-sechles/blob/master/readme.md. La principale modification que nous avons effectuée est d'utiliser une couche entièrement adjacente comme dernière couche GNN et nous décrivons dans notre article.gnn-comparison
est un clone de https://github.com/diningphil/gnn-cocomparon par Errica et al. (ICLR'2020). Ce projet peut être utilisé pour reproduire les expériences biologiques (section 4.3, les ensembles de données enzymes et NCI1). Ce sous-projet dépend de Pytorch 1.4 et Pytorch-géométrique. Pour des dépendances et des instructions supplémentaires, consultez leur lecture originale: https://github.com/diningphil/gnn-comprison/blob/master/readme.md. Les instructions pour notre clone sont les mêmes, sauf que nous avons ajouté un indicateur supplémentaire à chaque config_*.yml
, appelé last_layer_fa
, qui est défini sur True
par défaut, et reproduit nos expériences. La principale modification que nous avons effectuée est d'utiliser une couche entièrement adjacente comme dernière couche GNN.Ce projet a été conçu pour être utile pour expérimenter de nouvelles architectures GNN et de nouvelles solutions pour le problème trop squash.
N'hésitez pas à ouvrir un problème avec toutes les questions.
Ce projet est basé sur Pytorch 1.4.0 et la bibliothèque géométrique Pytorch.
pip install -r requirements.txt
Le fichier requirements.txt
répertorie les exigences supplémentaires. Cependant, la géométrique de Pytorch peut nécessiter une installation manuelle, et nous recommandons donc d'utiliser le fichier requirements.txt
uniquement par la suite.
Vérifiez que l'importation des dépendances va sans erreurs:
python -c 'import torch; import torch_geometric'
La formation sur les grands arbres (profondeur = 8) peut nécessiter environ 60 Go de RAM et environ 10 Go de mémoire GPU. La mémoire GPU peut être compromise en utilisant une taille de lot plus petite et en utilisant l'indicateur --accum_grad
.
Par exemple, au lieu de courir:
python main.py --batch_size 1024 --type GGNN
Ce qui suit utilise l'accumulation de gradient et prend moins de mémoire GPU:
python main.py --batch_size 512 --accum_grad 2 --type GGNN
Pour exécuter une seule expérience à partir du papier, exécutez:
python main.py --help
Et voir les drapeaux disponibles. Par exemple, pour entraîner un GGNN avec une profondeur = 4, exécuter:
python main.py --task DICTIONARY --eval_every 1000 --depth 4 --num_layers 5 --batch_size 1024 --type GGNN
Pour entraîner un GNN sur toutes les profondeurs, exécutez l'une des éléments suivants:
python run-gcn-2-8.py
python run-gat-2-8.py
python run-ggnn-2-8.py
python run-gin-2-8.py
Les résultats de l'exécution des scripts ci-dessus sont (section 4.1 dans le papier):
R: | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
GGNN | 1.0 | 1.0 | 1.0 | 0,60 | 0,38 | 0,21 | 0,16 |
FLINGUE | 1.0 | 1.0 | 1.0 | 0,41 | 0,21 | 0,15 | 0.11 |
GIN | 1.0 | 1.0 | 0,77 | 0,29 | 0.20 | ||
GCN | 1.0 | 1.0 | 0,70 | 0,19 | 0,14 | 0,09 | 0,08 |
Pour expérimenter d'autres types GNN:
GNN_TYPE
ici, par exemple: MY_NEW_TYPE = auto()
elif self is GNN_TYPE.MY_NEW_TYPE:
pour instancier le nouvel objet GNN de type GNN icimain.py
: python main.py --type MY_NEW_TYPE ...
Si vous souhaitez citer ce travail, veuillez utiliser cette entrée Bibtex:
@inproceedings{
alon2021on,
title={On the Bottleneck of Graph Neural Networks and its Practical Implications},
author={Uri Alon and Eran Yahav},
booktitle={International Conference on Learning Representations},
year={2021},
url={https://openreview.net/forum?id=i80OPhOCVH2}
}