GraphSAGE模型实验记录【Cora、Citeseer、Pubmed】

1、准备工作

数据集

数据集 #图 #节点 #边 #特征 #标签(y)
Cora 1 2708 5429 1433 7
Citeseer 1 3327 4732 3703 6
Pubmed 1 19717 44338 500 3

数据集划分方式:https://github.com/kimiyoung/planetoid (Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov, Revisiting Semi-Supervised Learning with Graph Embeddings, ICML 2016)

数据集划分(数量) 训练集 验证集 测试集
Cora 140 500 1000
Citeseer 120 500 1015
Pubmed 60 500 1000

代码

参考:https://github.com/FighterLYL/GraphNeuralNetwork/tree/master/chapter7
使用监督学习的方法,增加了Citeseer和Pubmed数据集,并对其代码进行了重构和调试,排除了一些小bug,增加了详细的注释。
完善后的代码:https://github.com/ytchx1999/GraphSAGE-Cora-Citeseer-Pubmed

实验环境

其实本地用mac的CPU跑也蛮快的。。
但是还是用GPU(最开始是一块2080Ti,后面用的Tesla T4)会更快一点,毕竟time is money!

在这里插入图片描述
在这里插入图片描述

2、超参数

BATCH_SIZE = 16  # 批处理大小
EPOCHS = 10
NUM_BATCH_PER_EPOCH = 20  # 每个epoch循环的批次数
LEARNING_RATE =0.10.01# 学习率,每5个epoch x0.1

3、实验结果

在这里插入图片描述

2层SageGCN层

GraphSage(
  in_features=【输入的特征维度】, num_neighbors_list=[10, 10]
  (gcn): ModuleList(
    (0): SageGCN(
      in_features=【输入的特征维度】, out_features=256, aggr_hidden_method=sum
      (aggregator): NeighborAggregator(in_features=【输入的特征维度】, out_features=256, aggr_method=mean)
    )
    (1): SageGCN(
      in_features=256, out_features=【输出的特征维度】, aggr_hidden_method=sum
      (aggregator): NeighborAggregator(in_features=256, out_features=【输出的特征维度】, aggr_method=mean)
    )
  )
)
聚合 + 更新方法 Cora Citeseer Pubmed
mean_pool + sum 0.78 0.57 0.73
max_pool + sum 0.75 0.57 0.75
mean_pool + concat 0.74 0.55 0.75
max_pool + concat 0.75 0.59 0.75

2021.1.14更新
感觉还是数据集划分的问题,根据paper原作者的实验代码,重新划分数据集,做了实验(lr=0.1)

数据集划分(数量) 训练集 验证集 测试集
Cora 1208 500 1000
聚合 + 更新方法 Cora
mean_pool + sum 0.85
max_pool + sum 0.84
mean_pool + concat 0.84
max_pool + concat 0.82

结果比之前好不少了。


2021.1.18更新
使用PyG进行实验。
数据集的划分同最开始,使用full-batch。发现效果要比minibatch好一些。
实现代码:https://github.com/ytchx1999/PyG-GraphSAGE

Net(
  (conv1): SAGEConv(num_node_feature, 16)
  (conv2): SAGEConv(16, num_classes)
)
聚合 + 更新方法 Cora Citeseer Pubmed
mean_pool + sum 0.81 0.67 0.77

在这里插入图片描述


3层SageGCN层

GraphSage(
  in_features=【输入的特征维度】, num_neighbors_list=[10, 5, 5]
  (gcn): ModuleList(
    (0): SageGCN(
      in_features=【输入的特征维度】, out_features=256, aggr_hidden_method=sum
      (aggregator): NeighborAggregator(in_features=【输入的特征维度】, out_features=256, aggr_method=mean)
    )
    (1): SageGCN(
      in_features=256, out_features=128, aggr_hidden_method=sum
      (aggregator): NeighborAggregator(in_features=256, out_features=128, aggr_method=mean)
    )
    (2): SageGCN(
      in_features=128, out_features=【输出的特征维度】, aggr_hidden_method=sum
      (aggregator): NeighborAggregator(in_features=128, out_features=【输入的特征维度】, aggr_method=mean)
    )
  )
)
聚合 + 更新方法 Cora Citeseer Pubmed
mean_pool + sum 0.78 0.50 0.75
max_pool + sum 0.73 0.76
mean_pool + concat 0.77 0.58 0.75
max_pool + concat 0.74 0.77

–: 代表出现了以下的问题。
在这里插入图片描述

4、问题分析

  1. GraphSAGE原文使用的citation数据集是WoS(一个比较大的图),效果要比本实验小图的效果好一些,不过差距也不太大,也进一步说明了GraphSAGE归纳学习的能力。
    在这里插入图片描述

  2. 这是GNN综述《A Comprehensive Survey on Graph Neural Networks》中汇总各个paper的结果,但是GraphSAGE并没有使用到这几个数据集(Cora、Citeseer、Pubmed),可能是因为这几个数据集都比较小,而GraphSAGE对于大图来说效果比较好。GraphSAGE采样可能意味着邻居信息的丢失,这在小图中可能影响很大,因此,效果可能并不如GCN等模型。
    在这里插入图片描述

  3. 关于数据集的划分,总感觉怪怪的,下面(参考引用)也列了一篇吐槽的文章,后面有时间去看一下那篇paper,看看到底为什么要这样划分(可能是个坑)。
    在这里插入图片描述

  4. 关于Citeseer数据集的问题。应该是有15个孤立节点,导致了程序出现问题以及训练精度都不好。我之前也写过一篇博客说过这个问题:《citeseer数据集的读取和处理》
    有2种思路来解决这个问题:①直接删除3312之后的节点;②补全法:Citeseer的测试数据集中有一些孤立的点没有在test.index中(15个),可把这些点当作特征全为0的节点加入到测试集tx中,并且对应的标签加入到ty中。
    在这里插入图片描述
    2020.1.18
    破案了。。15个孤立节点,PyG采用了补全法强行将其补全为3327。。。
    在这里插入图片描述
    总之就是有问题,实际上总共有3327各节点,但是原始数据集是有向图,只有3312个节点有出边。只能说,数据集本身就有问题,这也导致了效果远不如Cora和Pubmed。

5、可视化

以cora + mean_pool + sum为例
在这里插入图片描述

6、参考引用

代码:Chapter7:GraphSage示例(使用Cora数据集)–github
数据集划分:《Revisiting Semi-Supervised Learning with Graph Embeddings》–github


关于数据集:
《GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式》
《GCN数据集Cora、Citeseer、Pubmed文件分析》
《GCN的Benchmark数据集追溯》


下一步计划:
官方复现:PyTorch GraphSAGE Implementation–github

猜你喜欢

转载自blog.csdn.net/weixin_41650348/article/details/112461238