Graph library -- DIG、AutoGL、CogDL
Graph library —— DIG
前言
瞭解調研一些 GNN library。
如果大家對大圖資料上高效可擴充套件的 GNN 和基於圖的隱私計算感興趣,歡迎關注我的 Github,之後會不斷更新相關的論文和程式碼的學習筆記。
DIG: Dive into Graphs
開發文件:Link
DIG 的優勢
與目前的圖深度學習庫 PyTorch Geometric(PyG)和 Deep Graph Library(DGL)相比,雖然 PyG 和 DGL 支援基本的圖深度學習操作,但 DIG 為更高層次的、面向研究的圖深度學習任務提供了一個統一的測試平臺,如graph generation,self-supervised learning,,explainability 以及 3D graphs。
DIG 可以使使用者在可擴充套件框架內進行開發,並使用共同的資料集和評估指標與當前的 baseline 進行比較。
DIG 的介紹
DIG 包括資料介面的統一實現、通用演算法和常用任務的評估指標。
DIG 的目標是使研究人員能夠輕鬆地實現和評估演算法。目前考慮以下研究方向
:
Graph Generation
:
dig。ggraph
Self-supervised Learning on Graphs
:
dig。sslgraph
Explainability of Graph Neural Networks
:
dig。xgraph
Deep Learning on 3D Graphs
:
dig。threedgraph
例項可參考 examples
以圖生成的 tutorial 為例。
Tutorial for Graph Generation
如何使用 GraphDF 來實現一個深度圖生成模型來生成化學分子圖。
Graph Generation
在藥物發現和化學科學中,一個基本的問題是設計和合成具有某些理想特性(如高藥物相似性)的新型分子。這個問題仍然非常具有挑戰性,因為分子的空間是離散的和非常巨大的。一個有希望的解決方案是構建一個可以自動生成新型分子圖的 graph generator。最近,許多方法被提出來用於生成分子圖,如 JT-VAE、GCPN、GraphAF、GraphEBM 和 GraphDF。
為了生成分子圖,我們首先需要決定生成什麼來形成分子圖。一般來說,以下三種圖的形成方法在現有的分子圖生成方法中使用最為廣泛。
Tree-based method 。首先生成分子的樹狀結構,樹的節點代表分子圖的一個 motif 或子圖,如一個芳香環。然後,對於樹上的任何兩個相連的子圖,決定它們之間的結合點,最後透過結合所有的子圖形成一個分子圖。例如 JT-VAE。
One-shot method 。分子圖透過明確地生成其節點型別矩陣和鄰接張量而形成。這種方法的一個例子是GraphEBM。
Sequential method 。分子圖一步一步形成的,每一步只生成一個節點或一條邊。這種方法的例子有 GCPN、GraphAF和GraphDF。
在分子圖生成方法確定後,可以使用任何深度生成模型(如VAE、GAN 和 flow)來構建 graph generator,其中 embedding 被模型對映到生成目標。
Random Generation Example
以 ZINC250k 資料集為例,用 GraphDF 訓練隨機分子圖生成模型。首先載入配置引數,為 ZINC250k 資料集設定資料集載入器。
import
json
from
dig。ggraph。dataset
import
ZINC250k
from
torch_geometric。data
import
DenseDataLoader
conf
=
json
。
load
(
open
(
‘config/rand_gen_zinc250k_config_dict。json’
))
dataset
=
ZINC250k
(
one_shot
=
False
,
use_aug
=
True
)
loader
=
DenseDataLoader
(
dataset
,
batch_size
=
conf
[
‘batch_size’
],
shuffle
=
True
)
接下來初始化一個分子圖 generator,並在 ZINC250k 資料集上訓練該模型。訓練 10 epochs,每個epoch的檢查點被儲存在 “rand_gen_zinc250k” 資料夾下。
from
dig。ggraph。method
import
GraphDF
runner
=
GraphDF
()
lr
=
0。001
wd
=
0
max_epochs
=
10
save_interval
=
1
save_dir
=
‘rand_gen_zinc250k’
runner
。
train_rand_gen
(
loader
=
loader
,
lr
=
lr
,
wd
=
wd
,
max_epochs
=
max_epochs
,
model_conf_dict
=
conf
[
‘model’
],
save_interval
=
save_interval
,
save_dir
=
save_dir
)
訓練完成後,可以使用訓練好的 graph generator 來生成分子圖。生成的分子由一個 rdkit。Chem。Mol 物件的列表表示。
from
rdkit
import
RDLogger
RDLogger
。
DisableLog
(
‘rdApp。*’
)
ckpt_path
=
‘rand_gen_zinc250k/rand_gen_ckpt_10。pth’
n_mols
=
100
mols
,
_
=
runner
。
run_rand_gen
(
model_conf_dict
=
conf
[
‘model’
],
checkpoint_path
=
ckpt_path
,
n_mols
=
n_mols
,
atomic_num_list
=
conf
[
‘atom_list’
])
最後可以呼叫評估器,透過有效性比率和唯一性比率評估生成的分子。
from
dig。ggraph。evaluation
import
RandGenEvaluator
evaluator
=
RandGenEvaluator
()
input_dict
=
{
‘mols’
:
mols
}
(
‘Evaluating。。。’
)
evaluator
。
eval
(
input_dict
)
Property Optimization Example
如何利用 GraphDF 方法來生成具有高懲罰性 logP 得分的分子。在 GraphDF 中,這種分子性質的最佳化是透過在化學空間中搜索分子來完成的,並帶有強化學習。具體來說,將順序生成程式制定為馬爾科夫決策過程,並使用近似策略最佳化演算法(一種常用的強化學習演算法)來微調預先訓練好的 GraphDF 模型。獎勵取決於懲罰性 logP 得分,以鼓勵模型生成具有高懲罰性 logP 得分的分子。
首先載入配置引數並初始化一個分子圖生成器:
import
json
from
dig。ggraph。method
import
GraphDF
with
open
(
‘config/prop_opt_plogp_config_dict。json’
)
as
f
:
conf
=
json
。
load
(
f
)
runner
=
GraphDF
()
接下來,載入預訓練的模型,並開始進行微調:
from
rdkit
import
RDLogger
RDLogger
。
DisableLog
(
‘rdApp。*’
)
pretrain_path
=
‘saved_ckpts/prop_opt/pretrain_plogp。pth’
lr
=
0。0001
wd
=
0
warm_up
=
0
max_iters
=
200
save_interval
=
20
save_dir
=
‘prop_opt_plogp’
runner
。
train_prop_opt
(
lr
=
lr
,
wd
=
wd
,
max_iters
=
max_iters
,
warm_up
=
warm_up
,
model_conf_dict
=
model_conf_dict
,
pretrain_path
=
pretrain_path
,
save_interval
=
save_interval
,
save_dir
=
save_dir
)
當微調完成後,可以用訓練好的模型生成具有高懲罰性對數得分的分子圖資料。生成的分子由 rdkit。Chem。Mol 物件的列表表示。
from
dig。ggraph。evaluation
import
PropOptEvaluator
checkpoint_path
=
‘prop_opt_plogp/prop_opt_net_199。pth’
n_mols
=
100
mols
=
runner
。
run_prop_opt
(
model_conf_dict
=
conf
[
‘model’
],
checkpoint_path
=
checkpoint_path
,
n_mols
=
n_mols
,
num_min_node
=
conf
[
‘num_min_node’
],
num_max_node
=
conf
[
‘num_max_node’
],
temperature
=
conf
[
‘temperature’
],
atomic_num_list
=
conf
[
‘atom_list’
])
最後,可以呼叫評估器,在所有生成的分子中找出懲罰性 logP 得分最高的三個分子。
from
dig。ggraph。evaluation
import
PropOptEvaluator
evaluator
=
PropOptEvaluator
()
input_dict
=
{
‘mols’
:
mols
}
(
‘Evaluating。。。’
)
evaluator
。
eval
(
input_dict
)
AutoGL
開發文件:Link
AutoGL 是為研究人員和開發人員開發的,用於快速對圖資料集和任務進行自動ML。
下面的工作流程顯示了AutoGL的整體框架。
AutoGL使用
AutoGL Dataset
來支援基於圖的機器學習資料集,該資料集基於 PyTorch Geometric (PyG)中的資料集,並添加了一些支援,以與
自動求解器框架
進行融合。
不同的基於圖的機器學習任務由不同的
AutoGL Solvers
來解決,它利用四個主要模組來自動解決給定的任務,即
Auto Feature Engineer
,
Auto Model
,
Neural Architecture Search
,
HyperParameter Optimization
和
Auto Ensemble
。
Quick Start
以引文網路資料集 Cora 為例
AutoGL Learning
基於 AutoGL 的概念,自動圖學習旨在自動解決由圖表示的資料的任務。與傳統的學習框架不同,自動圖學習和AutoML 一樣,不需要人類參與實驗迴圈。只需要提供資料集和任務給
AutoGL Solvers
解決器。這個框架會自動為你找到合適的方法和超引數。
下圖描述了 AutoGL 框架的工作流程。
dataset
來維護使用者提供的圖資料集。需要建立一個
solver
來指定目標任務。在
solver
內部,有五個子模組來幫助完成自動圖任務,即
auto feature engineer
,
auto model
,
neural architecture search
,
hyperparameter optimization
和
auto ensemble
,將自動預處理/增強資料,選擇和最佳化深度模型,並以最佳方式進行組合。
以資料集
Cora
為例,在上面進行自動圖學習。
首先,使用
dataset
模組獲得
Cora
資料集:
from
autogl。datasets
import
build_dataset_from_name
cora_dataset
=
build_dataset_from_name
(
‘cora’
)
該資料集將自動下載。可參考 AutoGL Dataset 和 autogl。datasets 瞭解更多關於資料集構造、可用資料集、新增本地資料集等的細節。
在得出資料集後,可以建立一個
node classification solver
來處理自動訓練過程。
import
torch
device
=
torch
。
device
(
‘cuda’
if
torch
。
cuda
。
is_available
()
else
‘cpu’
)
from
autogl。solver
import
AutoNodeClassifier
solver
=
AutoNodeClassifier
(
feature_module
=
‘deepgl’
,
graph_models
=
[
‘gcn’
,
‘gat’
],
hpo_module
=
‘anneal’
,
ensemble_module
=
‘voting’
,
device
=
device
)
上述建立了一個
node classification solver
,使用
deepgl
作為 feature engineer ,並使用
anneal
超引數最佳化器來最佳化給定的三個模型
[‘gcn’,‘gat’]
。然後,得出的模型將使用
voting
合集器進行合集。
solver
。
fit
(
cora_dataset
,
time_limit
=
3600
)
solver
。
get_leaderboard
()
。
show
()
time_limit
被設定為3600,這樣整個自動圖學習過程不會超過1小時。
solver。show()
將展示由
solver
維護的模型,以及它們在驗證資料集上的表現。
然後可以使用提供的評估函式進行預測和評估結果。
from
autogl。module。train
import
Acc
predicted
=
solver
。
predict_proba
()
(
‘Test accuracy: ’
,
Acc
。
evaluate
(
predicted
,
cora_dataset
。
data
。
y
[
cora_dataset
。
data
。
test_mask
]
。
cpu
()
。
numpy
()))
CogDL
開發文件:Link
CogDL 是一個圖表示學習工具包,它允許研究人員和開發人員輕鬆地訓練和比較用於節點分類、圖分類和圖學習中其他重要任務的 baseline 或設計自己的模型。
CogDL 的貢獻總結如下:
High Efficiency
:CogDL 利用精心最佳化的運算器來加速 GNN 模型的訓練並節省 GPU 記憶體。
Easy-to-Use
:CogDL 提供了易於使用的 API,以使用 hyper-parameter search 來執行實驗。
Extensibility
:CogDL 的設計可以很容易將GNN模型應用到基於該框架的新場景中。
Reproducibility
:CogDL 為圖學習中大多數重要任務的最先進模型提供了可重複的實驗結果。
以
Cora
為資料集進行節點分類的實驗例子
# basic usage
experiment
(
dataset
=
“cora”
,
model
=
“gcn”
)
# set other hyper-parameters
experiment
(
dataset
=
“cora”
,
model
=
“gcn”
,
hidden_size
=
32
,
max_epoch
=
200
)
# run over multiple models on different seeds
experiment
(
dataset
=
“cora”
,
model
=
[
“gcn”
,
“gat”
],
seed
=
[
1
,
2
])
# automl usage
def
search_space
(
trial
):
return
{
“lr”
:
trial
。
suggest_categorical
(
“lr”
,
[
1e-3
,
5e-3
,
1e-2
]),
“hidden_size”
:
trial
。
suggest_categorical
(
“hidden_size”
,
[
32
,
64
,
128
]),
“dropout”
:
trial
。
suggest_uniform
(
“dropout”
,
0。5
,
0。8
),
}
experiment
(
dataset
=
“cora”
,
model
=
“gcn”
,
seed
=
[
1
,
2
],
search_space
=
search_space
)