Skip to content

[ICML 2024] Graph Adversarial Diffusion Convolution

Notifications You must be signed in to change notification settings

SongtaoLiu0823/GADC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Graph Adversarial Diffusion Convolution

This repository contains an implementation of "Graph Adversarial Diffusion Convolution", which is a general and principled framework for defense against feature noise and graph sturcture attacks.

(I). Defense Performance against Non-adaptive Graph Structure Attack

cd Non-Adaptive_Adversarial_Attack 

1. Generate disrupted graph structure

While we provide the disrupted adjacency matrix in the meta_adj folder, you can also use the following commands to generate the disrupted adjacency matrix.

python setup.py --dataset cora --ptb_rate 0.25
# We can replace dataset and ptb_rate 

2. Baseline Evaluation

GCN

python gcn.py --dataset cora --ptb_rate 0.25 
# We can replace dataset and ptb_rate  

GAT

python gat.py --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

APPNP

python appnp.py --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

SSGC

python ssgc.py --epochs 100 --lr 0.2 --weight_decay 1e-5 --alpha 0.05 --degree 16 --dataset cora --ptb_rate 0.25  
# We can replace ptb_rate  

python ssgc.py --epochs 150 --lr 0.2 --weight_decay 1e-4 --alpha 0.05 --degree 16 --dataset citeseer --ptb_rate 0.25  
# We can replace ptb_rate  

python ssgc.py --epochs 100 --lr 0.2 --weight_decay 2e-5 --alpha 0.05 --dataset pubmed --ptb_rate 0.25  
# We can replace ptb_rate  

NAGphormer

python main.py --batch_size 2000 --dropout 0.1 --hidden_dim 512 --hops 3  --n_heads 8 --n_layers 1 --pe_dim 3 --peak_lr 0.01  --weight_decay=1e-05 --dataset cora --ptb_rate 0.25  
# We can replace ptb_rate  

python main.py --batch_size 2000 --dropout 0.3 --hidden_dim 512  --hops 7  --n_heads 8 --n_layers 1 --pe_dim 3 --peak_lr 0.001  --weight_decay=1e-05 --dataset citeseer --ptb_rate 0.25  
# We can replace ptb_rate  

python main.py --batch_size 2000 --dropout 0.1 --hidden_dim 512 --hops 7  --n_heads 8 --n_layers 1 --pe_dim 15 --peak_lr 0.001  --weight_decay=1e-05 --dataset pubmed --ptb_rate 0.25  
# We can replace ptb_rate  

Robust GCN

python rgcn.py --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

GCN Jaccard

python gcn_jaccard.py --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

GCN SVD

python gcn_svd.py --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

Pro-GNN

python prognn.py --alpha 5e-4 --beta 1.5 --gamma 1 --lambda_ 0.001 --lr 5e-4 --epoch 1000 --dataset cora --ptb_rate 0.25  
# We can replace ptb_rate  

python prognn.py --alpha 5e-4 --beta 1.5 --gamma 1 --lambda_ 0.0001 --lr 5e-4 --epoch 1000 --dataset citeseer --ptb_rate 0.25
# We can replace ptb_rate  

python prognn.py --alpha 0.3 --beta 2.5 --gamma 1 --lambda_ 0.001 --lr 1e-2 --epoch 100 --inner_steps 30 --dataset pubmed --ptb_rate 0.25  
# We can replace ptb_rate  

GNNGuard

python main.py --modelname GCN --GNNGuard True --dataset cora --ptb_rate 0.25  
# We can replace dataset and ptb_rate  

Elastic GNN

cd code
python main.py --random_splits 1 --runs 10 --lr 0.01 --K 10 --lambda1 9 --lambda2 3 --weight_decay 0.0005 --hidden 16 --normalize_features False --dataset Cora-adv --ptb_rate 0.25  
# We can replace ptb_rate 

python main.py --random_splits 1 --runs 10 --lr 0.01 --K 10 --lambda1 9 --lambda2 3 --weight_decay 0.0005 --hidden 16 --normalize_features False --dataset CiteSeer-adv --ptb_rate 0.25 
# We can replace ptb_rate 

python main.py --random_splits 1 --runs 10 --lr 0.01 --K 10 --lambda1 9 --lambda2 3 --weight_decay 0.0005 --hidden 16 --normalize_features False --dataset PubMed-adv --ptb_rate 0.25  
# We can replace ptb_rate 

HANG-quad

python main.py --function hangquad --block constant --lr 0.005 --dropout 0.4 --input_dropout 0.4 --batch_norm --time 8 --hidden_dim 64 --step_size 1 --runtime 10 --add_source --batch_norm --gpu 4 --epochs 800 --patience 150 --dataset cora --ptb_rate 0.25  
# We can replace ptb_rate 

python main.py --function hangquad --block constant --lr 0.005 --dropout 0.4 --input_dropout 0.4 --batch_norm --time 12 --hidden_dim 64 --step_size 1 --runtime 10 --add_source --batch_norm --gpu 4 --epochs 800 --patience 150 --dataset citeseer --ptb_rate 0.25  
# We can replace ptb_rate 

python main.py --function hangquad --block constant --lr 0.005 --dropout 0.4 --input_dropout 0.4 --batch_norm --time 6 --hidden_dim 64 --step_size 1 --runtime 10 --add_source --batch_norm --gpu 4 --epochs 800 --patience 150 --dataset pubmed --ptb_rate 0.25   
# We can replace ptb_rate 

STABLE

python main.py --alpha 0.6 --beta 2 --k 7  --jt 0.03 --cos 0.25 --dataset cora --ptb_rate 0.25  
# We can replace ptb_rate 

python main.py --alpha 0.1 --beta 2 --k 5  --jt 0.03 --cos 0.1 --dataset citeseer --ptb_rate 0.25  
# We can replace ptb_rate 

python main.py --alpha 0.1 --beta 2 --k 5  --jt 0.03 --cos 0.1 --dataset pubmed --ptb_rate 0.25  
# We can replace ptb_rate 

GCN-GARNET

python main.py --device 0 --backbone gcn --dataset cora --attack meta --ptb_rate 0.25 --perturbed
# We can replace dataset and ptb_rate  

EvenNet

python main.py --runs 100 --dataset cora --ptb_rate 0.25 --alpha 0.9  
# We can replace ptb_rate 

python main.py --runs 100 --dataset citeseer --ptb_rate 0.25 --alpha 0.9    
# We can replace ptb_rate 

python main.py --runs 100 --dataset pubmed --ptb_rate 0.25 --alpha 0.5 
python main.py --runs 100 --dataset pubmed --ptb_rate 0.5 --alpha 0.9
python main.py --runs 100 --dataset pubmed --ptb_rate 0.75 --alpha 0.9

3. GADC Evaluation

GADC

python gadc.py --degree 6 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset cora --ptb_rate 0.25  
python gadc.py --degree 3 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset cora --ptb_rate 0.5  
python gadc.py --degree 1 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset cora --ptb_rate 0.75  
python gadc.py --degree 6 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset citeseer --ptb_rate 0.25  
python gadc.py --degree 3 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset citeseer --ptb_rate 0.5  
python gadc.py --degree 1 --lam 1 --lr 0.02 --epochs 100 --weight_decay 1e-5 --hidden 32 --dataset citeseer --ptb_rate 0.75  
python gadc.py --degree 2 --lam 1 --lr 0.02 --epochs 200 --weight_decay 1e-5 --hidden 32 --dataset pubmed --ptb_rate 0.25  
python gadc.py --degree 1 --lam 1 --lr 0.02 --epochs 200 --weight_decay 1e-5 --hidden 32 --dataset pubmed --ptb_rate 0.5 
python gadc.py --degree 1 --lam 1 --lr 0.02 --epochs 200 --weight_decay 1e-4 --hidden 32 --dataset pubmed --ptb_rate 0.75 

(II). Defense Performance against Adaptive Graph Structure Attack

cd Adaptive_Adversarial_Attack
python gcn.py --dataset cora
python gnnguard.py --dataset cora
python sftgdc.py --dataset cora
python svd_gcn.py --dataset cora
python gadc.py --dataset cora

# We can replace dataset

(III). Denoising Performance against Feature Noise

cd Denoising

1. Baseline Evaluation

MLP

python mlp.py --noise_type gaussian --runs 100 --dataset cora --noise_level 0.1
# We can replace dataset and noise_level  

python mlp.py --noise_type flip --runs 100 --dataset cora --ber 0.1
# We can replace dataset and ber  

python mlp.py --noise_type gaussian --runs 10 --dataset coauthor-cs --noise_level 0.1
# We can replace dataset and noise_level  

python mlp_products.py --noise_level 0.1
# We can replace noise_level 

GCN

python gcn_denoising.py --noise_type gaussian --runs 100 --dataset cora --noise_level 0.1
# We can replace dataset and noise_level  

python gcn_denoising.py --noise_type flip --runs 100 --dataset cora --ber 0.1
# We can replace dataset and ber  

python gcn_denoising.py --noise_type gaussian --runs 10 --dataset coauthor-cs --noise_level 0.1
# We can replace dataset and noise_level  

python gcn_products.py --noise_level 0.1
# We can replace noise_level 

GAT

python gat.py --noise_type gaussian --runs 100 --lr 0.005 --weight_decay 5e-4 --dataset cora --noise_level 0.1
python gat.py --noise_type gaussian --runs 100 --lr 0.005 --weight_decay 5e-4 --dataset citeseer --noise_level 0.1
python gat.py --noise_type gaussian --runs 100 --lr 0.01 --weight_decay 0.001 --heads_2 8 --dataset pubmed --noise_level 0.01
# We can replace noise_level  

python gat.py --noise_type flip --runs 100 --lr 0.005 --weight_decay 5e-4 --dataset cora --noise_level 0.1
python gat.py --noise_type flip --runs 100 --lr 0.005 --weight_decay 5e-4 --dataset citeseer --noise_level 0.1
python gat.py --noise_type flip --runs 100 --lr 0.01 --weight_decay 0.001 --heads_2 8 --dataset pubmed --noise_level 0.1
# We can replace ber  

python gat.py --noise_type gaussian --runs 10 --lr 0.005 --weight_decay 5e-4 --dataset cora --ber 0.1
python gat.py --noise_type gaussian --runs 10 --lr 0.005 --weight_decay 5e-4 --dataset citeseer --ber 0.1
python gat.py --noise_type gaussian --runs 10 --lr 0.01 --weight_decay 0.001 --heads_2 8 --dataset pubmed --ber 0.1
# We can replace noise_level  

GLP

python glp.py --noise_type gaussian --runs 100 --dataset cora --noise_level 0.1
# We can replace dataset and noise_level  

python glp.py --noise_type flip --runs 100 --dataset cora --ber 0.1
# We can replace dataset and ber  

python glp.py --noise_type gaussian --runs 10 --dataset coauthor-cs --noise_level 0.1
# We can replace dataset and noise_level  

SSGC

python ssgc.py --noise_type gaussian --runs 100 --dataset cora --weight_decay 1e-5 --epochs 100 --noise_level 0.1
python ssgc.py --noise_type gaussian --runs 100 --dataset citeseer --weight_decay 1e-4 --epochs 150 --noise_level 0.1
python ssgc.py --noise_type gaussian --runs 100 --dataset pubmed --weight_decay 2e-5 --epochs 100 --noise_level 0.01
# We can replace noise_level  

python ssgc.py --noise_type flip --runs 100 --dataset cora --weight_decay 1e-5 --epochs 100 --ber 0.1
python ssgc.py --noise_type flip --runs 100 --dataset citeseer --weight_decay 1e-4 --epochs 150 --ber 0.1
python ssgc.py --noise_type flip --runs 100 --dataset pubmed --weight_decay 2e-5 --epochs 100 --ber 0.1
# We can replace ber  

python ssgc.py --noise_type gaussian --runs 10 --dataset coauthor-cs --weight_decay 1e-5 --epochs 100 --noise_level 0.1
# We can replace dataset and noise_level  

python ssgc_products.py --noise_level 0.1
# We can replace noise_level 

IRLS

python irls.py --noise_type=gaussian --data=cora --mlp_bef=1 --mlp_aft=0 --dropout=0.8 --prop_step=8 --alp=1 --lam=1 --inp_dropout=0.8 --lr=0.3 --weight_decay=5e-5 --runs=100 --seed=42 --noise_level=0.1
python irls.py --noise_type=gaussian --data=citeseer --mlp_bef=1 --mlp_aft=0 --prop_step=16 --lr=0.1 --num_epoch=500 --inp_dropout=0.5 --lam=1 --alp=1 --weight_decay=0.001 --runs=100 --seed=42 --noise_level=0.1
python irls.py --noise_type=gaussian --data=pubmed --mlp_bef=1 --mlp_aft=0 --prop_step=40 --lr=0.5 --num_epoch=500 --inp_dropout=0.8 --lam=1 --alp=1 --weight_decay=0.0005 --runs=100 --seed=42 --noise_level=0.01
# We can replace noise_level  

python irls.py --noise_type=flip --data=cora --mlp_bef=1 --mlp_aft=0 --dropout=0.8 --prop_step=8 --alp=1 --lam=1 --inp_dropout=0.8 --lr=0.3 --weight_decay=5e-5 --runs=100 --seed=42 --ber=0.1
python irls.py --noise_type=flip --data=citeseer --mlp_bef=1 --mlp_aft=0 --prop_step=16 --lr=0.1 --num_epoch=500 --inp_dropout=0.5 --lam=1 --alp=1 --weight_decay=0.001 --runs=100 --seed=42 --ber=0.1
python irls.py --noise_type=flip --data=pubmed --mlp_bef=1 --mlp_aft=0 --prop_step=40 --lr=0.5 --num_epoch=500 --inp_dropout=0.8 --lam=1 --alp=1 --weight_decay=0.0005 --runs=100 --seed=42 --ber=0.1
# We can replace ber  

python irls.py --noise_type=gaussian --data=coauthor-cs --mlp_bef=1 --mlp_aft=0 --prop_step=40 --lr=0.5 --num_epoch=500 --inp_dropout=0.8 --lam=1 --alp=1 --weight_decay=0.0005 --runs=10 --seed=42 --noise_level=0.1
# We can replace dataset and noise_level  

AirGNN

python airgnn.py --dataset cora --noise_level 0.1

APPNP

python appnp.py --noise_type gaussian --runs 100 --dataset cora --noise_level 0.1
# We can replace dataset and noise_level  

python appnp.py --noise_type flip --runs 100 --dataset cora --ber 0.1
# We can replace dataset and ber  

python appnp.py --noise_type gaussian --runs 10 --dataset coauthor-cs --noise_level 0.1
# We can replace dataset and noise_level  

2. GADC Evaluation

python gadc.py --noise_type gaussian --runs 100 --dataset cora --noise_level 0.1
# We can replace dataset and noise_level  

python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-5 --dataset cora --ber 0.1
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-5 --dataset cora --ber 0.2
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-1 --dataset cora --ber 0.4
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-5 --dataset citeseer --ber 0.1
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-5 --dataset citeseer --ber 0.2
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-5 --dataset citeseer --ber 0.4
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-1 --dataset pubmed --ber 0.1
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-1 --dataset pubmed --ber 0.2
python gadc.py --noise_type flip --runs 100 --degree 32 --lam 64 --epsilon 1e-1 --dataset pubmed --ber 0.4

python gadc.py --noise_type gaussian --dataset coauthor-cs --runs 10 --noise_level 0.1 --lam 1 --degree 16 --lr 0.2 --epochs 1000 --weight_decay 1e-7
python gadc.py --noise_type gaussian --dataset coauthor-cs --runs 10 --noise_level 1 --lam 128 --degree 16 --lr 0.2 --epochs 1000 --weight_decay 1e-7
# We can replace dataset

python gadc_products.py --noise_level 0.1 --lam 32
python gadc_products.py --noise_level 1.0 --lam 256

(IV). Improving Performance in Heterophilic Graphs

cd Heterophilic_Graph
python3 gadc.py --dataset cornell --epsilon 1.0
# We can replace dataset and epsilon  

python3 gadc_link.py --dataset cornell --epsilon 1.0
# We can replace dataset and epsilon  

Citation

@inproceedings{liu2024graph,
  title={Graph Adversarial Diffusion Convolution},
  author={Liu, Songtao and Chen, Jinghui and Fu, Tianfan and Lin, Lu and Zitnik, Marinka and Wu, Dinghao},
  booktitle={International Conference on Machine Learning},
  year={2024},
}