用GCN、graphSAGE、GAT处理Cora数据集的节点分类任务。
目标:调 隐藏层数目、隐藏层的维度、训练次数
默认固定参数:学习率lr =0.01 权重衰减weight_decay 5e-3 优化器 ADAM dropout = 0.5
GAT 使用多头注意力 默认为 3。
展示的结果,都是多次训练中最好的结果。
对比1: 此时 隐藏层数目为2,训练次数500
model\隐藏层维度 | 32 | 64 | 128 |
GraphSage | 0.778 | 0.78 | 0.78 |
GCN | 0.772 | 0.79 | 0.79 |
GAT | 0.764 | 0.774 | 0.776 |
基本上 随着隐藏维度的上升,模型效果变好,但是提升的幅度在变小
注:GAT效果还没其他模型好
对比2: 此时隐藏层维度32,训练次数500
model \ 隐藏层数目(深度) | 2 | 8 | 16 | 32 |
GraphSage | 0.792 | 0.316 | 0.316 | 0.316 |
GCN | 0.774 | 0.312 | 0.232 | 0.278 |
GAT | 0.768 | 0.316 | 0.316 | 0.316 |
显而易见,出现了oversmoothing。
对比3:此时隐藏层维度32,训练次数500
model \ 隐藏层数目(深度) | 2 | 3 | 4 | 5 |
GraphSage | 0.774 | 0.77 | 0.406 | 0.442 |
GCN | 0.762 | 0.774 | 0.25 | 0.226 |
GAT | 0.774 | 0.77 | 0.752 | 0.716 |
显而易见,还是有oversoothing。从实验结果看,对于core数据集,隐藏层数目为三层效果最好。超过三层就开始出现oversoothing。根据结果,似乎对于GAT,它oversmoothing衰减的较慢。
注:可以通过一些手段克服oversmoothing
对比4:此时隐藏层维度为32,隐藏层数目为2
model \ 训练次数 | 100 | 500 | 1000 | 5000 | 50000 |
GraphSage | 0.776 | 0.784 | 0.784 | 0.784 | |
GCN | 0.732 | 0.776 | 0.754 | 0.778 | |
GAT | 0.776 | 0.77 | 0.778 | 0.784 |
50000次时间太久了,略过。根据现有的结果也能看出来,GNN对训练次数要求不是很高,基本上五百次就够了!
对比5: 隐藏层维度为64,隐藏层为3层,训练次数为1000
model \ heads | 2 | 5 | 16 |
GAT | 0.776 | 0.786 | 0.79 |
根据结果,可以看出来,多头注意力机制,头越多结果越好
注: 不知道为什么在GAT最后结果中并没有使用正则化,而且我使用L2正则化后效果也没变得更好。
ps: CORA数据集就一个图,所以就不需要batch,那么也就不需要batch normalization
其他:使用的GNN模型都是使用自己写的GNN层,没有调用pyG里面封装的。最后取得的效果差强人意,不知道为什么我的GAT结果并不是很好。当然其他模型也没有别人的结果好。论文里面在处理cora数据集的节点分类任务时,GCN、GAT 准确度分别为81.5 和83.1。