# GPT-GNN
**Repository Path**: suchun_sv/GPT-GNN
## Basic Information
- **Project Name**: GPT-GNN
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-12-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# GPT-GNN: Generative Pre-Training of Graph Neural Networks
GPT-GNN is a pre-training framework to initialize GNNs by generative pre-training. It can be applied to large-scale and heterogensous graphs.
You can see our KDD 2020 paper [“**Generative Pre-Training of Graph Neural Networks**”](https://arxiv.org/abs/2006.15437) for more details.
## Overview
The key package is GPT_GNN, which contains the the high-level GPT-GNN pretraining framework, base GNN models, and base graph structure and data loader.
To illustrate how to apply the GPT_GNN framework for arbitrary graphs, we provide examples of pre-training on both hetergeneous (OAG) and homogeneous graphs (reddit). Both of them are of large-scale.
Within each `example_*` package, there is a `pretrain_*.py` file for pre-training a GNN on the given graph, and also multiple `finetune_*.py` files for training and validating on downstream tasks.
## DataSet
For **Open Academic Graph (OAG)**, we provide a heterogeneous graph containing highly-cited CS papers (8.1G) spanning from 1900-2020. You can download the preprocessed graph via [this link](https://drive.google.com/open?id=1a85skqsMBwnJ151QpurLFSa9o2ymc_rq). We split the data by their time: Pre-training ( t < 2014 ); Training ( 2014 <= t < 2017); Validation ( t = 2017 ); Testing ( 2018 <= t ). As we use the raw-text as attribute generation task for OAG, we provide a pre-trained word2vec model via [this link](https://drive.google.com/file/d/1ArdaMlPKVqdRGyiw4YSdUOV6CeFb2AmD/view?usp=sharing).
If you want to directly process from raw data, you can download via [this link](https://drive.google.com/open?id=1yDdVaartOCOSsQlUZs8cJcAUhmvRiBSz). After downloading it, run `preprocess_OAG.py` to extract features and store them in our data structure.
For **Reddit**, we simply download the preprocessed graph using pyG.datasets API, and then turn it into our own data structure using `preprocess_reddit.py`. We randomly split the data into different sets.
## Setup
This implementation is based on pytorch_geometric. To run the code, you need the following dependencies:
- [Pytorch 1.3.0](https://pytorch.org/)
- [pytorch_geometric 1.3.2](https://pytorch-geometric.readthedocs.io/)
- torch-cluster==1.4.5
- torch-scatter==1.3.2
- torch-sparse==0.4.3
- [gensim](https://github.com/RaRe-Technologies/gensim)
- [sklearn](https://github.com/scikit-learn/scikit-learn)
- [tqdm](https://github.com/tqdm/tqdm)
- [dill](https://github.com/uqfoundation/dill)
- [pandas](https://github.com/pandas-dev/pandas)
You can simply run ```pip install -r requirements.txt``` to install all the necessary packages.
## Usage
We first introduce the arguments to control hyperparameters. There are mainly three types of arguments, for pre-training; for dataset; for model and optimization.
For pre-training, we provide arguments to control different modules for attribute and edge generation tasks:
```
--attr_ratio FLOAT The ratio (0~1) of attribute generation loss . Default is 0.5.
--attr_type STR type of attribute decoder ['text' or 'vec'] Default is 'vec'
--neg_samp_num INT Whether to use layer-norm on the last layer. Default is False.
--queue_size INT Max size of adaptive embedding queue. Default is 256.
```
For datasets, we provide arguments to control mini-batch sampling:
```
--data_dir STR The address of preprocessed graph.
--pretrain_model_dir STR The address for storing the pre-trained models.
--sample_depth INT How many layers within a mini-batch subgraph Default is 6.
--sample_width INT How many nodes to be sampled per layer per type Default is 128.
```
For both pre-training and fine-tuning, we provide arguments to control model and optimizer hyperparameters. We highlight some key arguments below:
```
--conv_name STR Name of GNN filter (model) Default is hgt.
--scheduler STR Name of learning rate scheduler Default is cycle (for pretrain) and cosine (for fine-tuning)
--n_hid INT Number of hidden dimension Default is 400.
--n_layers INT Number of GNN layers Default is 3.
--prev_norm BOOL Whether to use layer-norm on previous layers. Default is False.
--last_norm BOOL Whether to use layer-norm on the last layer. Default is False.
--max_lr FLOAT Maximum learning rate. Default is 1e-3 (for pretrain) and 5e-4 (for fine-tuning).
```
The following commands pretrain a 3-layer HGT over OAG-CS:
```bash
python pretrain_OAG.py --attr_type text --conv_name hgt --n_layers 3 --pretrain_model_dir /datadrive/models/gta_all_cs3
```
The following commands use the pre-trained model as initialization and finetune on the paper-field classification task using 10% of training and validation data:
```bash
python finetune_OAG_PF.py --use_pretrain --pretrain_model_dir /datadrive/models/gta_all_cs3 --n_layer 3 --data_percentage 0.1
```
## Pre-trained Models
1. The 3-layer HGT model pre-trained over OAG-CS under Time-Transfer Setting via [this link](https://drive.google.com/file/d/1OyIRfpNXjaD0TiRF-_Upfl5hix3is5ca/view?usp=sharing)
2. The 3-layer HGT model pre-trained over Reddit via [this link](https://drive.google.com/file/d/1Ja4PJT2bkFH0qgoWXjGBjByIFPco4h-S/view?usp=sharing)
### Citation
Please consider citing the following paper when using our code for your application.
```bibtex
@inproceedings{gpt_gnn,
title={GPT-GNN: Generative Pre-Training of Graph Neural Networks},
author={Ziniu Hu and Yuxiao Dong and Kuansan Wang and Kai-Wei Chang and Yizhou Sun},
booktitle={Proceedings of the 26th ACM SIGKDD Conference on Knowledge Discovery and Data Mining},
year={2020}
}
```
This implementation is mainly based on [pyHGT](https://github.com/acbull/pyHGT) API.