Evolving Graph Convolutional Networks for Dynamics Graphs
視頻鏈接:《圖神經網絡》
相關系列:
- 《Dynamic Graph的分類》
- 《動態圖網絡之Dynamic Self-Attention Network》
文章目錄
- Evolving Graph Convolutional Networks for Dynamics Graphs
- 一、model
- <font color=red>Q:在同一層不同時刻如何計算?
- <font color=red>Q:同一時刻數據在不同層如何計算?
- EvolveGCN-O
- EvolveGCN-H
- Q:兩種EvolveGCN該如何選擇?
- Loss
- 解讀代碼:EvolveGCN-O
- 二、`run_exp.py`
- 2.1 主函數
- 2.2 設置網絡參數
- 2.3 讀取數據集
- 2.3.1 進入`class sbm_dataset()`
- 2.4 建立預測任務
- <font color=red>2.4.2 進入`class Link_Pred_Tasker`
- 2.5 tran\val\test的分離器
- 2.5.1 進入
- 2.6
- 三、model `egcn-o.py`
- 3.1 class EGCN()
- 3.2 class GRCU()
- 3.3 class mat_GRU_cell()
- 3.4 class mat_GRU_gate()
- 3.5 class TopK()
- 附錄、`utlis.py`
區別:
- DySAT,是基于GNN和RNN的組合:在每個快照中使用GNN作為特征提取器聚合節點特征,然后在每個快照中使用RNN聚合時間特征來進一步聚合節點的特征
- EvolveGCN:也是離散型動態GNN,是集成型的DGNN,將GNN和RNN結合在同一層,從而結合空間和時間信息的建模
- EvolveGCN是采用集成DGNN的方法
一、model
采用快照的方法構圖,同DySAT一樣。
Q:在前面提到,EvolveGCN在每一層將GNN和RNN結合在同一層。那么是如何結合的呢?
A:普通GCN的公式如下圖所示,EvolveGCN的公式與之相同。但區別在于W的更新方式。
Q:在同一層不同時刻如何計算?
第0層 t 1 t_1 t1?時刻的計算
-
input : A A A (鄰接矩陣) , H 1 0 H_1^0 H10? (節點特征) → \to →如下圖
-
init: W 0 ( 0 ) ∈ R 3 × 2 W_0^{(0)} \in \R^{3\times 2} W0(0)?∈R3×2 (權重參數) → \to → 第一次初始化,如下圖
-
step1: W 0 ( 0 ) ∈ R 3 × 2 W^{(0)}_0 \in \R^{3\times 2} W0(0)?∈R3×2–RNN–> W 1 ( 0 ) ∈ R 3 × 2 W^{(0)}_1 \in \R^{3\times 2} W1(0)?∈R3×2
-
step2: A 1 ? H 1 ( 0 ) ? W 1 0 A_1 \cdot H_1^{(0)}\cdot W_1^{0} A1??H1(0)??W10?–GCN–> H 1 ( 1 ) H_1^{(1)} H1(1)?
-
整體過程:如下圖所示
第0層 t 2 t_2 t2?時刻的計算
model計算公式
Q:同一時刻數據在不同層如何計算?
第0層 t 1 t_1 t1?時刻的過程
第1層 t 1 t_1 t1?時刻的過程
EvolveGCN-O
EvolveGCN-H
在上圖中,可以看到-H
的GRU的輸入是 H , W H,W H,W,因此會存在數據維度不同的情況,因此設定了一個降維算法.
Q:兩種EvolveGCN該如何選擇?
如果節點有信息,-H效果要好,因為考慮了節點的特征變化
如果節點信息?較少,-O效果好,因為他更關系圖結構的變化
Loss
解讀代碼:EvolveGCN-O
二、run_exp.py
2.1 主函數
- argparser參數
- 設置隨機數
- 調用相關函數
- 建立損失函數和訓練器
2.2 設置網絡參數
當下默認args.model=‘egcn_o’,查看其他變量
變量 | 值 | 含義 | 備注 |
---|---|---|---|
args.num_hist_steps | 5 | hist_steps | |
args.gcn_parameters[‘feats_per_node’] | 100 | ||
args.gcn_parameters[‘layer_1_feats’] | 100 | ||
args.gcn_parameters[‘layer_2_feats’] | 100 | ||
args.gcn_parameters[‘lstm_l1_feats’] | 100 | ||
args.gcn_parameters[‘lstm_l2_feats’] | 100 | ||
args.gcn_parameters[‘cls_feats’] | 100 |
2.3 讀取數據集
函數調用流程
- 主函數中的調用語句
dataset = build_dataset(args) # 構建數據集
- 在build_dataset中調用
sbm.sbm_dataset(args)
讀取數據集
2.3.1 進入class sbm_dataset()
- sbm_dataset中的Namespace的作用
- args.sbm_args中的dict內容為
- 建立邊的數據結構
- 隨機產生節點特征
- 總結class.attribute
變量 | key | value | 含義 |
---|---|---|---|
self.ecols | ‘FromNodeId’ | 0 | |
‘ToNodeId’ | 1 | ||
‘Weight’ | 2 | ||
‘TimeStep’ | 3 | ||
self.max_time | 49 | 時間序列中最大值 | |
self.min_time | 0 | 時間序列中最小值 | |
self.num_classes | 1 | 類別數 | |
self.edges | {‘idx’:tensor.shape(4870863,3), ‘vals’:tensor.shape(4870863)} | self.edges[‘idx’][0]=tensor([0, 2, 0]) | |
self.num_nodes | 1000 | 節點個數 | |
self.feats_per_node | 3 | 節點特征個數 | |
self.nodes_feats | randn((1000,3)) | 節點隨機特征 | |
self.num_non_existing | -3870863 | 1000**2 -4870863 |
2.4 建立預測任務
# build the taskertasker = build_tasker(args,dataset) # 預測任務link_pred
- 調用build_tasker()函數,這里的dataset見2.3節
2.4.2 進入class Link_Pred_Tasker
注釋:
2.5 tran\val\test的分離器
- 調用函數
splitter = sp.splitter(args,tasker) # 訓練,測試,驗證集
2.5.1 進入
2.6
三、model egcn-o.py
3.1 class EGCN()
3.2 class GRCU()
3.3 class mat_GRU_cell()
3.4 class mat_GRU_gate()
3.5 class TopK()
附錄、utlis.py
導入
def create_parser():parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)parser.add_argument('--config_file',default='experiments/parameters_example.yaml', type=argparse.FileType(mode='r'), help='optional, yaml file containing parameters to be used, overrides command line parameters')return parser
注釋:
- 《ArgumentParser()用法解析》
- 《argparse之參數formatter_class》,
- 《yaml文件格式說明及編寫教程》
- 《argparse.FileType實例講解》, 用argparse.FileType,除了可以實現輸入參數為文件外(遇到不存在的文件,會提示錯誤,這樣就不用自己去判斷文件是否存在了),還可以很好的實現通過命令行管道來接收數據。
class Namespace(object):'''helps referencing object in a dictionary as dict.key instead of dict['key']'''def __init__(self, adict):self.__dict__.update(adict)
注釋: 1. 《 dict 詳解》, 《__dict__的用法》