【未完】【GNN笔记】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs
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__的用法》