# **GreatX**: Graph Reliability Toolbox
GreatX is great!
# ❓ What is "Reliability" on Graphs?  "Reliability" on graphs refers to *robustness* against the following threats: + Inherent noise + Distribution Shift + Adversarial Attacks For more details, please kindly refer to our paper [**Recent Advances in Reliable Deep Graph Learning: Inherent Noise, Distribution Shift, and Adversarial Attack**](https://arxiv.org/abs/2202.07114) # 💨 News - November 2, 2022: We are planning to release GreatX 0.1.0 this month, stay tuned! - June 30, 2022: GraphWar has been renamed to GreatX. - ~~June 9, 2022: GraphWar **v0.1.0** has been released. We also provide the [documentation](https://greatx.readthedocs.io/en/latest) along with numerous [examples](https://github.com/EdisonLeeeee/GreatX/blob/master/examples)~~ . - ~~May 27, 2022: GraphWar has been refactored with [PyTorch Geometric (PyG)](https://github.com/pyg-team/pytorch_geometric), old code based on [DGL](https://www.dgl.ai) can be found [here](https://github.com/EdisonLeeeee/GreatX/tree/dgl). We will soon release the first version of GreatX, stay tuned!~~ NOTE: GreatX is still in the early stages and the API will likely continue to change. If you are interested in this project, don't hesitate to contact me or make a PR directly. # 🚀 Installation Please make sure you have installed [PyTorch](https://pytorch.org) and [PyTorch Geometric (PyG)](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html). ```bash # Coming soon pip install -U greatx ``` or ```bash # Recommended git clone https://github.com/EdisonLeeeee/GreatX.git && cd GreatX pip install -e . --verbose ``` where `-e` means "editable" mode so you don't have to reinstall every time you make changes. # ⚡ Get Started Assume that you have a `torch_geometric.data.Data` instance `data` that describes your graph. ## How fast can we train and evaluate your own GNN? Take `GCN` as an example: ```python from greatx.nn.models import GCN from greatx.training import Trainer from torch_geometric.datasets import Planetoid # Any PyG dataset is available! dataset = Planetoid(root='.', name='Cora') data = dataset[0] model = GCN(dataset.num_features, dataset.num_classes) trainer = Trainer(model, device='cuda:0') # or 'cpu' trainer.fit(data, mask=data.train_mask) trainer.evaluate(data, mask=data.test_mask) ``` ## A simple targeted manipulation attack ```python from greatx.attack.targeted import RandomAttack attacker = RandomAttack(data) attacker.attack(1, num_budgets=3) # attacking target node `1` with `3` edges attacked_data = attacker.data() edge_flips = attacker.edge_flips() ``` ## A simple untargeted (non-targeted) manipulation attack ```python from greatx.attack.untargeted import RandomAttack attacker = RandomAttack(data) attacker.attack(num_budgets=0.05) # attacking the graph with 5% edges perturbations attacked_data = attacker.data() edge_flips = attacker.edge_flips() ``` # 👀 Implementations In detail, the following methods are currently implemented: ## ⚔ Adversarial Attack ### Graph Manipulation Attack (GMA) #### Targeted Attack | Methods | Descriptions | Examples | | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **RandomAttack** | A simple random method that chooses edges to flip randomly. | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/random_attack.py) | | **DICEAttack** | *Waniek et al.* [Hiding Individuals and Communities in a Social Network](https://arxiv.org/abs/1608.00375), *Nature Human Behavior'16* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/dice_attack.py) | | **Nettack** | *Zügner et al.* [Adversarial Attacks on Neural Networks for Graph Data](https://arxiv.org/abs/1805.07984), *KDD'18* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/nettack.py) | | **FGAttack** | *Chen et al.* [Fast Gradient Attack on Network Embedding](https://arxiv.org/abs/1809.02797), *arXiv'18* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/fg_attack.py) | | **GFAttack** | *Chang et al*. [A Restricted Black - box Adversarial Framework Towards Attacking Graph Embedding Models](https://arxiv.org/abs/1908.01297), *AAAI'20* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/gf_attack.py) | | **IGAttack** | *Wu et al.* [Adversarial Examples on Graph Data: Deep Insights into Attack and Defense](https://arxiv.org/abs/1903.01610), *IJCAI'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/ig_attack.py) | | **SGAttack** | *Li et al.* [ Adversarial Attack on Large Scale Graph](https://arxiv.org/abs/2009.03488), *TKDE'21* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/sg_attack.py) | | **PGDAttack** | *Xu et al.* [Topology Attack and Defense for Graph Neural Networks: An Optimization Perspective](https://arxiv.org/abs/1906.04214), *IJCAI'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/targeted/pgd_attack.py) | #### Untargeted Attack | Methods | Descriptions | Examples | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | **RandomAttack** | A simple random method that chooses edges to flip randomly | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/random_attack.py) | | **DICEAttack** | *Waniek et al.* [Hiding Individuals and Communities in a Social Network](https://arxiv.org/abs/1608.00375), *Nature Human Behavior'16* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/dice_attack.py) | | **FGAttack** | *Chen et al.* [Fast Gradient Attack on Network Embedding](https://arxiv.org/abs/1809.02797), *arXiv'18* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/fg_attack.py) | | **Metattack** | *Zügner et al.* [Adversarial Attacks on Graph Neural Networks via Meta Learning](https://arxiv.org/abs/1902.08412), *ICLR'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/metattack.py) | | **IGAttack** | *Wu et al.* [Adversarial Examples on Graph Data: Deep Insights into Attack and Defense](https://arxiv.org/abs/1903.01610), *IJCAI'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/ig_attack.py) | | **PGDAttack** | *Xu et al.* [Topology Attack and Defense for Graph Neural Networks: An Optimization Perspective](https://arxiv.org/abs/1906.04214), *IJCAI'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/untargeted/pgd_attack.py) | ### Graph Injection Attack (GIA) | Methods | Descriptions | Examples | | ------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | **RandomInjection** | A simple random method that chooses nodes to inject randomly. | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/injection/random_injection.py) | | **AdvInjection** | The 2nd place solution of [KDD Cup 2020](https://www.biendata.xyz/competition/kddcup_2020/), team: ADVERSARIES. | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/injection/adv_injection.py) | ### Graph Universal Attack (GUA) ### Graph Backdoor Attack (GBA) | Methods | Descriptions | Examples | | --------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | | **LGCBackdoor** | *Chen et al.* [Neighboring Backdoor Attacks on Graph Convolutional Network](https://arxiv.org/abs/2201.06202), *arXiv'22* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/backdoor/lgc_backdoor.py) | | **FGBackdoor** | *Chen et al.* [Neighboring Backdoor Attacks on Graph Convolutional Network](https://arxiv.org/abs/2201.06202), *arXiv'22* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/attack/backdoor/fg_backdoor.py) | ## Enhancing Techniques or Corresponding Defense ### Standard GNNs (without defense) #### Supervised | Methods | Descriptions | Examples | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **GCN** | *Kipf et al.* [Semi-Supervised Classification with Graph Convolutional Networks](https://arxiv.org/abs/1609.02907), *ICLR'17* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/gcn.py) | | **SGC** | *Wu et al.* [Simplifying Graph Convolutional Networks](https://arxiv.org/abs/1902.07153), *ICLR'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/sgc.py) | | **GAT** | *Veličković et al.* [Graph Attention Networks](https://arxiv.org/abs/1710.10903), *ICLR'18* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/gat.py) | | **DAGNN** | *Liu et al.* [Towards Deeper Graph Neural Networks](https://arxiv.org/abs/2007.09296), *KDD'20* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/dagnn.py) | | **APPNP** | *Klicpera et al.* [Predict then Propagate: Graph Neural Networks meet Personalized PageRank](https://arxiv.org/abs/1810.05997), *ICLR'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/appnp.py) | | **JKNet** | *Xu et al.* [Representation Learning on Graphs with Jumping Knowledge Networks](https://arxiv.org/abs/1806.03536), *ICML'18* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/jknet.py) | | **TAGCN** | *Du et al.* [Topological Adaptive Graph Convolutional Networks](https://arxiv.org/abs/1806.03536), *arXiv'17* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/tagcn.py) | | **SSGC** | *Zhu et al.* [Simple Spectral Graph Convolution](https://openreview.net/forum?id=CYO5T-YjWZV), *ICLR'21* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/ssgc.py) | | **DGC** | *Wang et al.* [Dissecting the Diffusion Process in Linear Graph Convolutional Networks](https://arxiv.org/abs/2102.10739), *NeurIPS'21* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/dgc.py) | | **NLGCN, NLMLP, NLGAT** | *Liu et al.* [Non-Local Graph Neural Networks](https://ieeexplore.ieee.org/document/9645300), *TPAMI'22* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/nlgnn.py) | | **SpikingGCN** | *Zhu et al.* [Spiking Graph Convolutional Networks](https://arxiv.org/abs/2205.02767), *IJCAI'22* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/spiking_gcn.py) | #### Unsupervised/Self-supervise | Methods | Descriptions | Examples | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | **DGI** | *Veličković et al.* [Deep Graph Infomax](https://arxiv.org/abs/1809.10341), *ICLR'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/unsupervised/dgi.py) | | **GRACE** | *Zhu et al.* [Deep Graph Contrastive Representation Learning](https://arxiv.org/abs/2006.04131), *ICML'20* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/unsupervised/grace.py) | | **CCA-SSG** | *Zhang et al.* [From Canonical Correlation Analysis to Self-supervised Graph Neural Networks](https://arxiv.org/abs/2106.12484), *NeurIPS'21* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/unsupervised/cca_ssg.py) | | **GGD** | *Zheng et al.* [Rethinking and Scaling Up Graph Contrastive Learning: An Extremely Efficient Approach with Group Discrimination](https://arxiv.org/abs/2206.01535), *NeurIPS'22* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/unsupervised/ggd.py) | ### Techniques Against Adversarial Attacks | Methods | Descriptions | Examples | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | **MedianGCN** | *Chen et al.* [Understanding Structural Vulnerability in Graph Convolutional Networks](https://www.ijcai.org/proceedings/2021/310), *IJCAI'21* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/median_gcn.py) | | **RobustGCN** | *Zhu et al.* [Robust Graph Convolutional Networks Against Adversarial Attacks](http://pengcui.thumedialab.com/papers/RGCN.pdf), *KDD'19* | [[**Example**]](https://github.com/EdisonLeeeee/GreatX/blob/master/examples/models/supervised/robust_gcn.py) | | **SoftMedianGCN** | *Geisler et al.* [Reliable Graph Neural Networks via Robust Aggregation](https://arxiv.org/abs/2010.15651), *NeurIPS'20*