该篇文章主要是通过图坍缩机制来分层学习图的结构特征。GCN能够通过层次结构来学习节点的分层表示,但是其无法学习到图的分层表示。对于图级分类任务而言,图的分层表示有利于更进一步地得到图的精简表示。该篇论文通过簇分配矩阵来对图中的节点进行软分配。与硬分配不同,它不是直接将某一个节点划分到某一个簇中,而是同一个概率分布向量来分配该节点对于各个指定的簇的贡献度。所有节点的概率分布向量就组成了簇分配矩阵S。通过簇分配矩阵S,我们就能够得到簇的特征表示以及簇与簇之间的连接强度。转换公式如下所示:
簇分配矩阵可以通过另外一个GCN层来获得。输入通道为图中节点特征的长度,而输出通道则为簇的个数。而pooling层具有排列组合不变性,即不管节点在图中的编号如何变换,它都能正确地将其划分。作者在论文中指出,仅通过梯度信号,模型难以收敛。因为这是一个非凸优化的问题。所以作者在训练的过程中加入了一下两个惩罚项:
- Auxiliary Link Prediction Object,其计算代码如下所示:
.
其旨在于让A和SST两个矩阵尽可能地相似,即对两者相减,然后求其L2范数。该惩罚项阻止让具有相似特征以及局部结构的两个不相连的节点被分配到同一个簇中。 - Entropy。由于每一个节点的簇分配向量应该是趋向于One hot编码形式。所以,作者通过Entropy惩罚项来使得簇分类趋向于驼峰形式。
为了使得模型的训练过程更加稳定,作者还将每层节点嵌入特征的L2范数加到了最终的Loss Function之中。在测试过程中,我们可以将节点分配给概率最大的簇。该篇文章中虽然使用软分配来未每个节点指定一个簇,而且最大的簇个数是认为指定,但是在端到端的训练过程中,模型也会学习到簇的个数,即并不是每个簇都会被分配到节点。
由于我在github中没有找到相关完整的基于torch_geometric来实现Diff_Pool的项目。所以我就自己动手实现。但是由于我并未看懂原文中作者自己所构建的网络模型,所以我就自己构造了一个图神经网络并使用了Diff_Pool来对D&D数据集进行分类。项目地址如下:
https://github.com/ShuGuoJ/DiffPool.git