《Self-Attention Graph Pooling》阅读笔记
前言
因为自己目前在做的实验也有可能涉及到图池化的方法,所以近期读的关于图池化的文章比较多。经常会在文章的相关工作中看到SAGPool,今天终于抽空把它看掉了。这篇文章最主要的贡献就是利用自注意力机制实现图池化,既利用了节点的特征,又利用了图的拓扑信息。
论文链接:https://arxiv.org/pdf/1904.08082.pdf
代码链接:https://github.com/inyeoplee77/SAGPool
一、模型
1.自注意图池化
整体框架如下图所示:
这是一个比较容易理解的模型。首先通过图卷积以及激活函数处理,得到各个节点的自注意力得分;其次,根据自注意力得分的排序,保留前k个得分最高的节点组成掩膜;最后,根据掩膜保留指定节点的特征以及这些节点之间的拓扑信息。
1).自注意力掩膜
现在在模型中加入注意力机制已经不是什么新鲜事了。注意力机制说白了就是让模型多关注重要的信息,少关注不重要的信息。自注意力机制是注意力机制的改进版,减少了对外部信息的依赖,更善于捕捉特征的内在相关性。
首先通过图卷积的方法来计算节点的自注意力得分 Z ∈ RN × 1(图卷积既能利用节点的特征,又能利用图的拓扑信息)
其次根据各个节点自注意力得分的**降序**,**选择一定比例的节点进行保留**(按比例保留,可以不受输入节点数量的影响)
所保留节点的索引就构成了池化掩膜。
2).图池化
有了掩码之后,还需要定义池化后的图的特征矩阵以及邻接矩阵。
特征矩阵:
- 根据掩膜索引,从原特征矩阵中抽取相应的特征向量
- 将这些向量与其对应的自注意力系数相乘,得到下一层的特征矩阵
邻接矩阵:
- 在原邻接矩阵中,抽取这些被保留节点之间的邻接关系构成下一层的邻接矩阵
3).SAGPool的变体
1.多跳形式
在用图卷积计算自注意力得分时,通过添加二阶邻接矩阵的形式,将节点的二阶邻居考虑进来。记为SAGPollaugmentation。
2.堆叠形式
在用图卷积计算自注意力得分时,通过堆叠两层GNN的形式,将节点的二阶邻居考虑进来。记为SAGPollserial。
3.多头形式
通过多个并行的GNN分别计算节点的自注意力得分,最后取其均值作为结果。记为SAGPollparallel。
2.具体结构
1).卷积层
有很多的图卷积方法可以使用,本文则采用了GCN。
2).读出层
将节点的特征聚合成一个长度固定的表示向量,本文采用了mean-pooling和max-pooling的拼接。
3).全局池化模型
每层的卷积结果进行拼接,整个模型仅作一次池化。
4).层次池化模型
模型进行多次池化,逐渐缩小图的尺寸;并且,每次池化后都接读出层,总结该图的特征表示。
二、实验
1.数据集
2.对比试验
不管是全局池化还是层次池化,SAGPool的效果都比对比方法要好一些。
节点数少的数据集上,全局池化模型要好;节点数多的数据集上,层次池化模型相对较好。
由于SAGPool比gPool多考虑了拓扑结构,所以性能有所提升。
3.变体实验
对比了不同框架的GNN对结果的影响,好像差不太多,略有起伏吧;对比了各种变体对结果的影响,除了SAGPoolh,parallel,M=2要差一点,其他的也不能说差别特别大吧。
4.节点数的影响
DiffPool是通过GNN的方式来生成分配矩阵,将节点分配到不同的簇中。这个方法有两个明显的弊端:第一,节点数对模型参数量影响相当大;第二,簇的数量要根据每个图重新选择。而SAGPool和gPool则没有这种弊端。
总结
继续我的康复训练。