Paper : Graph Convolutional Networks with EigenPooling
Code :
作者提出了EigenPool用来进行图的层次性池化操作,相比于DIFFPOOL,EigenPool 主要解决的是面对层次化聚类过程中,如何将合并成一个超级节点的子图的结构信息保留下来的问题,DIFFPOOL采用的是简单的加和,而EigenPool用子图上的信号在该子图上的图傅里叶变换来代表结构信息与属性信息的整合输出,具有如下几个特点
与此相伴的有若干个缺点:聚类过程无法进行学习,硬簇聚类可能会对准确率有所损失。总的来说,本文有以下4个贡献点
EigenPool算法分为两部分,1)图坍缩,将图分为一组子图,并通过将子图视为超节点来形成粗化图; 2)使用EigenPooling将原始图信号转换为在粗化图上定义的信号。
EigenPool 采用谱聚类的方法得到图坍缩的结果,谱聚类的思想是让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。经典的谱聚类算法流程如下
采样算子:采样算子描述的是原图与子图之间节点关系的映射,假设原图节点个数为 N N N,子图节点个数为 N k N_k Nk,子图 k 中节点集合为 τ k \tau^{k} τk,采样算子 C ( k ) ∈ { 0 , 1 } N × N k C^{(k)} \in \{0,1\}^{N\times N_k} C(k)∈{0,1}N×Nk 定义为
C i j ( k ) = { 1 τ j ( k ) = v i 0 otherwise C_{ij}^{(k)} = \left\{\begin{matrix} 1 & \tau^{(k)}_{j} = v_i \\ 0 & \text{otherwise} \end{matrix}\right. Cij(k)={10τj(k)=viotherwise
给定原图中某信号 x ∈ R N × d \text x \in \mathbb R^{N\times d} x∈RN×d,在子图 k 上进行降采样
x ( k ) = ( C ( k ) ) T x \text x^{(k)} = (C^{(k)})^\text T\text x x(k)=(C(k))Tx
同理,在子图 k 上的图信号在原图上升采样
x ′ = C ( k ) x ( k ) \text x' = C^{(k)}\text x^{(k)} x′=C(k)x(k)
对邻接矩阵进行降采样可以采取相似的形式
A ( k ) = ( C ( k ) ) T A C ( k ) A^{(k)} = (C^{(k)})^\text T A C^{(k)} A(k)=(C(k))TAC(k)
子图内邻接矩阵包含了所有坍缩掉的边
A int = ∑ k C ( k ) A ( C ( k ) ) T A_\text{int} = \sum_k C^{(k)} A (C^{(k)})^\text T Aint=k∑C(k)A(C(k))T
子图间邻接矩阵包含了所有超级节点之间的边
A ext = A − A int A_\text{ext} = A-A_\text {int} Aext=A−Aint
假定簇分配矩阵表示为 S S S,那么坍缩后的邻接矩阵定义为
A coar = S T A ext S A_\text{coar} = S^\text T A_\text{ext} S Acoar=STAextS
假定 L ( k ) L^{(k)} L(k) 表示子图 k 上的拉普拉斯矩阵,特征值 u 1 ( k ) . . . u N k ( k ) ∈ R N k u_1^{(k)}...u_{N_k}^{(k)}\in \mathbb R^{N_k} u1(k)...uNk(k)∈RNk,使用升采样将特征值映射到原图中
u ‾ l ( k ) = C ( k ) u l ( k ) ∈ R N subject to l = 1... N k \\\overline u_{l}^{(k)} = C^{(k)} u_{l}^{(k)} \in \mathbb R^{N} \\\text{subject to } l=1...N_k ul(k)=C(k)ul(k)∈RNsubject to l=1...Nk
将所有子图中第 l l l 个特征向量拼接起来构成矩阵
Θ l = [ u ‾ l ( 1 ) . . . u ‾ l ( K ) ] ∈ R N × K \Theta_l = [\overline u_{l}^{(1)}...\overline u_{l}^{(K)}] \in \mathbb R^{N\times K} Θl=[ul(1)...ul(K)]∈RN×K
如果某子图特征向量个数不足 l l l 个,补零。
假定池化层的输入 X ∈ R N × d X \in \mathbb R^{N\times d} X∈RN×d 表示节点上的特征表示,那么在 Θ l \Theta_l Θl 上的池化操作定义为
X l = Θ l T X ∈ R K × d X_l = \Theta_l^\text T X \in \mathbb R^{K\times d} Xl=ΘlTX∈RK×d
池化输出定义为
X pool = [ X 0 . . . X max ( N k ) ] X_\text{pool} = [X_0...X_{\max(N_k)}] Xpool=[X0...Xmax(Nk)]
也可以只是用前 H H H 个来进行输出,即
X coar = [ X 0 . . . X H ] X_\text{coar} = [X_0...X_H] Xcoar=[X0...XH]
局部视角
使用前H个系数而丢弃其他意味着我们将更多的注意力放在图形信号的“平滑”部分,这在许多应用中很常见,例如信号去噪和压缩。通过使用前H个系数,我们可以保留大多数信息,同时降低计算成本。
全局视角
下式中,不失一般性,假定 X ∈ R N × 1 X\in \mathbb R^{N\times 1} X∈RN×1
特性1:完美重构
特性2:能量/信息保留
特性3:近似能量保留
特性4:节点顺序具有排列不变性
作者主要从两个角度进行实验,一个是相比其他pool算法对准确率的提升,另一个是超参数H的影响。
其中,EigenGCN后面的数字表示H的大小,对比实验中,作者得到如下若干结论
下图是真实数据集上,H的大小对保留能量比率的影响
EigenPool的提出告诉我们对传统算法的研究永远不过时,EigenPool使用的是图论中的GFT进行变换和操作,与DIFFPOOL算法相比有更强的理论依据,因此个人认为该篇paper相比DIFFPOOL具有更高的价值。不过有一个缺点在于没有对时间代价的分析,EigenPool的两步处理可能比较耗时。