AttPool: Towards Hierarchical Feature Representation in Graph Convolutional Networks via Attention

论文:AttPool: Towards Hierarchical Feature Representation in Graph Convolutional Networks via Attention Mechanism

AttPool:基于注意力机制的图卷积网络分层特征表示

来源:ICCV 2019

论文链接: ICCV_2019_paper

github链接:https://github.com/hjjpku/Attention_in_Graph

Kipf的GCN不能解决图分类问题,因此,文中提出了一种新的基于注意力机制的Graph Pooling方法AttPool来进行图分类任务。AttPool能够自适应地选择对图表示有意义的节点,并通过聚集节点中基于注意力系数的加权信息生成层次特征。

1 背景介绍

self-attention 和 masked attention的区别

为什么说文中的attention机制是一种self-attention呢?和GAT中的marsked attention有什么区别呢?

self-attention是一种Global graph attention,会将注意力分配到图中所有的节点上,直接计算图结构中任意两个节点之间的关系,一步到位地获取图结构的全局几何特征。

self−attention利用了attention机制,分三个阶段进行计算:

  • (1) 引入不同的函数和计算机制,根据Query和某个Key,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值
  • (2) 引入类似softmax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过softmaxs的内在机制更加突出重要元素的权重;
  • (3)第二阶段的计算结果ai即为valuei对应的权重系数,然后进行加权求和即可得到attention数值。

通过self-attention注意力机制可以计算任意两个样本的关系,一个样本可以用其他所有样本来表示,但是存在一些问题:
(1)基于空间相似假设,一个样本应与一定范围内的样本关系较密切
(2)样本较多的时候,计算量非常大。

为了解决这上述问题,GAT中使用了一种 masked attention 的方法:对于一个样本来说只利用邻域内的样本计算注意力系数和新的表示,即仅将注意力分配到节点的一阶邻居节点集上

Motivation

全局池化:

  • Deep convo-lutional networks on graph-structured data. 2015

分层池化方法:

  • DiffPool,2018
  • Graph u-net, 2019

Contributions

  • 受到上面两种分层池化方法的启发,文中使用global attention mechanism来帮助选择对图分类更有意义的节点。(因此,文中使用的global attention机制类似于self-attention,而和用于帮助学习节点特征的masked attention(GAT中的attention)是不同的。)
  • 为了防止由于GCNs中对称拉普拉斯平滑所导致的注意力被卡在图的某些部分和采样冗余信息,文中还提出了local attention机制用于在子图选择过程中保持节点的重要性和分散性之间的平衡。文中提出的两种基于attention机制的pooling方法也是可微的(可使用SGD训练),并且能够结合各种GCNs从而使用端到端的方式训练。

2 方法

对于图分类任务,文中的网络结构为:基于attention的卷积 + 基于attention的池化,然后重复,后面再接MLP。

2.1 卷积

还是Kipf的GCN:

H l + 1 = ReLU ⁡ ( A ^ H l W l ) ( 1 ) A ^ = D ~ − 1 2 A ~ D ~ − 1 2 ( 2 ) \begin{aligned} H^{l+1} &=\operatorname{ReLU}\left(\hat{A} H^{l} W^{l}\right) \qquad(1) \\ \hat{A} &=\widetilde{D}^{-\frac{1}{2}} \widetilde{A} \widetilde{D}^{-\frac{1}{2}} \qquad(2) \end{aligned} Hl+1A^=ReLU(A^HlWl)(1)=D 21A D 21(2)

2.2 AttPool的Pooling

输入: G l : < H l ∈ R N l × C l , A l ∈ R N l × N l > G^{l}:<H^{l} \in \mathbf{R}^{\mathbf{N}_{l} \times \mathbf{C}_{l}}, A^{l} \in \mathbf{R}^{\mathbf{N}_{l} \times \mathbf{N}_{l}} > Gl:<HlRNl×Cl,AlRNl×Nl>
输出: G l + 1 : < H l + 1 ∈ R k × C l , A l + 1 ∈ R k × k > G^{l+1}:<H^{l+1} \in \mathbf{R}^{\mathbf{k} \times \mathbf{C}_{l}}, A^{l+1} \in \mathbf{R}^{\mathbf{k} \times \mathbf{k}} > Gl+1:<Hl+1Rk×Cl,Al+1Rk×k>

过程如下:
首先根据attention function f a t t f_{a t t} fatt求出每个节点的注意力分数, f a t t f_{a t t} fatt就是global attention 和local attenion,后面再介绍。 A t t Att Att应该是一个行和为1的小数构成的attention向量:
A t t = f a t t ( H l ) , A t t ∈ R N l × 1 ( 5 ) A t t=f_{a t t}\left(H^{l}\right), A t t \in \mathbf{R}^{\mathbf{N}_{l} \times \mathbf{1}} \qquad(5) Att=fatt(Hl),AttRNl×1(5)
下面根据attention向量 A t t Att Att更新embedding矩阵(计算Hardmard积):

H a t t l = A t t ⊙ H l , H a t t l ∈ R N l × C l ( 6 ) H^{a t t^{l}}=A t t \odot H^{l}, H^{a t t^{l}} \in \mathbf{R}^{\mathbf{N}_{l} \times \mathbf{C}_{l}} \qquad(6) Hattl=AttHl,HattlRNl×Cl(6)

然后根据池化比率 α \alpha α和第 l l l层的节点数 N l N_l Nl确定需要选择的节点数量 k k k:

k = max ⁡ ( 1 , ⌊ α N l ⌋ ) ( 4 ) \begin{array}{c} k=\max \left(1,\left\lfloor\alpha N_{l}\right\rfloor\right) \qquad(4) \\ \end{array} k=max(1,αNl)(4)
上式保证了 k k k是一个大于等于1的整数。

再根据注意力分数根据排序函数 f T o p K ( A t t , k ) f_{T o p K}(A t t, k) fTopK(Att,k)选出 k k k个池化后保留的节点:
I d x = f T o p K ( A t t , k ) ( 3 ) I d x=f_{T o p K}(A t t, k) \qquad(3) Idx=fTopK(Att,k)(3)
根据下标向量idx(被选的为1,没被选的为0)更新矩阵 A ′ A' A,注意,此处的矩阵 A ′ A' A是使用softmax进行归一化了的,其实,这里的 A ′ A' A就是类似DiffPool里的簇分配矩阵 S S S,个人觉得这里用 A ′ A' A表示没有用 S S S表示清楚:

A i ′ = A I d x ( i ) l , A ′ ∈ R k × N l ( 7 ) A_{i}^{\prime}=A_{I d x(i)}^{l}, A^{\prime} \in \mathbf{R}^{\mathbf{k} \times \mathbf{N}_{l}} \qquad(7) Ai=AIdx(i)l,ARk×Nl(7)
最后,根据更新子图的embedding矩阵:

H l + 1 = A ′ H a t t l , H l + 1 ∈ R k × C l ( 8 ) H^{l+1}=A^{\prime} H^{a t t^{l}}, H^{l+1} \in \mathbf{R}^{\mathbf{k} \times \mathbf{C}_{l}} \qquad(8) Hl+1=AHattl,Hl+1Rk×Cl(8)
更新子图的邻接矩阵:

A l + 1 = A ′ A l A ′ T , A l + 1 ∈ R k × k ( 9 ) A^{l+1}=A^{\prime} A^{l} A^{\prime T}, A^{l+1} \in \mathbf{R}^{\mathbf{k} \times \mathbf{k}} \qquad(9) Al+1=AAlAT,Al+1Rk×k(9)
最后的 H l + 1 H^{l+1} Hl+1 A l + 1 A^{l+1} Al+1可以传到下一层的GCN中去学习更高级的特征。

Global attention

在所有节点中学习每个节点的注意力系数:
 Att  i = softmax ⁡ i ( H × W ) = exp ⁡ ( H i × W ) ∑ j ∈ N exp ⁡ ( H j × W ) ( 10 ) \text { Att }_{i}=\operatorname{softmax}_{i}(H \times W)=\frac{\exp \left(H_{i} \times W\right)}{\sum_{j \in N} \exp \left(H_{j} \times W\right)} \qquad(10)  Att i=softmaxi(H×W)=jNexp(Hj×W)exp(Hi×W)(10)

其中, W ∈ R C × 1 W \in \mathbf{R}^{\mathbf{C} \times \mathbf{1}} WRC×1,是一个可学的且所有节点共享的线性转换。

Local Attention

根据Kipf的GCN公式,对每个节点 v i v_i vi,它的输出为:

H i l + 1 = ReLU ⁡ ( ∑ j ∈ 1 − h o p ( i ) A ^ i j H j l W l ) ( 11 ) H_{i}^{l+1}=\operatorname{ReLU}\left(\sum_{j \in 1-h o p(i)} \hat{A}_{i j} H_{j}^{l} W^{l}\right) \qquad(11) Hil+1=ReLUj1hop(i)A^ijHjlWl(11)

由式(11)可知,GCN层将顶点的新特征计算为其自身及其1-hop邻居的加权平均特征的线性变换,其中

A ^ H = ( D ~ − 1 2 A ~ D ~ − 1 2 ) H ( 12 ) \hat{A} H=\left(\widetilde{D}^{-\frac{1}{2}} \widetilde{A} \widetilde{D}^{-\frac{1}{2}}\right) H \qquad(12) A^H=(D 21A D 21)H(12)
根据文章Deeper insightsinto graph convolutional networks for semi-supervised learning,上述形式是一种特殊的拉普拉斯平滑的形式。文中指出,GCN在节点及其一阶邻居间进行信息传播,可能会导致节点间的特征平滑。也就是说,离得近的节点往往会有相似的注意力系数,因此,一堆共享冗余信息的节点可能会被选择出来,而位于图的其他部分的节点很可能有能对图分类有意义的特征,可能被忽略了。

如下图所示,红色表示选择的k个点可能会出现集中在一个区域的情况:

为了避免由于拉普拉斯平滑导致的局部邻居的attention的相似性,导致最后选择的k个节点也集中在图中的一个部分的情况,文中提出了local attention集中来使在在进行子图选择时,importance和dispersion保持平衡。

和global attention类似,首先学习一个共享的线性变换矩阵 W ∈ R C × 1 W \in \mathbf{R}^{\mathbf{C} \times \mathbf{1}} WRC×1,然后为每个节点计算1-hop attention:

A t t i 1 − h o p = A i i exp ⁡ ( H i × W ⋅ τ ) ∑ j ∈ N ( A i j exp ⁡ ( H j × W ⋅ τ ) ) ( 13 ) A t t_{i}^{1-h o p}=\frac{A_{i i} \exp \left(H_{i} \times W \cdot \tau\right)}{\sum_{j \in N}\left(A_{i j} \exp \left(H_{j} \times W \cdot \tau\right)\right)} \qquad(13) Atti1hop=jN(Aijexp(Hj×Wτ))Aiiexp(Hi×Wτ)(13)
其中, τ \tau τ是一个可学习的用于调节softmax函数敏感度的参数。

最后,将每个节点的attention值和它的度相乘,从而为每个节点计算local attention系数:

A t t i = A t t i 1 − h o p ⋅ ∑ j ∈ N A i j A t t_{i}=A t t_{i}^{1-h o p} \cdot \sum_{j \in N} A_{i j} Atti=Atti1hopjNAij
乘以度的目的是消除节点的 1-hop 邻居数量造成的偏差,从而实现全局的公平比较。

2.3 使用AttPool来进行层次化的图分类任务

如下图所示,将多个GCN层和AttPool模块叠加起来,其中一个GCN+AttPool模块称作AttGCN。每个AttGCN层的输出都作为下一个AttGCN的输入。此外,每个AttGCN后面都接一个MLP,这个MLP把AttGCN输出的graph embedding作为输入,然后预测图的标签。⊕表示将不同阶段的损失和预测相加,得到总体分类损失和最终预测。

该模型的两个的优点:

  • 在训练阶段,基于注意力的节点选择和用于分类的图表示学习是相互关联的,因此可以相互增强,加速模型的收敛。
  • 在测试阶段,通过综合考虑不同感受野的结果,可以做出更可靠的预测。

3 实验

数据集

数据集按规模可分为三组:

  • small(NCI1, PROTEINS)
  • medium(COLLAB, D&D)
  • large(REDDIT-BINARY, REDDIT-MULTI-12K)

参数设置

  • 10-fold交叉验证
  • 数据集按照SortPool进行预处理
  • NCI-1, COLLAB and REDDIT数据集使用64 hidden units的4层 AttGCN,而对于更小的数据集D&D and PROTEINS使用3层一半大小的AttGCN,以防止过拟合
  • 在第一个AttGCN中使用了3层GCN,后面的AttGCN使用一层GCN
  • pooling ratio:0.5
  • 所有数据集的都使用2层100个隐含单元的MLP,batch size 20,500 epochs,Adam优化器,学习率为0.001
  • 使用Xavier作为参数初始化方法
  • 使用交叉熵损失函数进行训练

实验结果

每一个AttGCN层的分类准确率

下图中表示每一个AttGCN层在不同的attention机制下的分类准确率

实验结论:

  • 可以看到,深层的精度总是高于第一层,而峰值点的位置因数据集的不同而不同。结果表明,不同层次的graph embedding具有不同的表达能力,根据不同的数据集,最有效的表达出现在不同的层次。
  • 还可以发现当通过融合不同AttGCN层的平均分数进行预测时,比任何单一的AttGCN层获得更好的性能。结果表明,层次信息在图分类任务中具有重要意义。

如下图所示第三层的AttPool-L比其他层的有更好的可辨性(discriminability)。

和其他Pooling方法的对比

下表中Graph U-net*和DiffPool*表示在AttPool中把池化模块分别替换为Graph U-net和DiffPool中的池化方式,而其他模块不变。为了与原来的DiffPool方法保持一致,文中在每个DiffPool层使用一个3层的GCN来生成分配矩阵,并且设置DiffPool层后的最大节点数为每个数据集平均节点数的2倍。

文中的分层预测的模型和传统的预测方式的对比

文中的分层预测模型指在每个AttPool层后都加一个MLP,最后综合多个MLP来进行预测,类似于集成学习里的方法(用w/ H标记),而传统的预测方式指像DiffPool里的在最后追加一个MLP(用w/o H标记)。

实验结果:整体而言都是文中的分层预测模型更优(用w/ H标记)。

Global Attention和Local Attention的对比

实验结论:

  • 在中小规模的数据集上,两种注意力机制的性能相当,但是在大规模数据集上(如Reddit),Local Attention在REDDIT-BINARY和REDDIT-MULTI-12K数据集上分别比Global Attention高2.85%和2.9%。结果表明,Local Attention可以作为一种更好的大图表示学习方法。
  • 从图4还可以看出,Global Attention的节点选择策略倾向于选择集中在中的某一部分,而Local Attention的选择策略倾向于一种稀疏选择。

问题

以下列出几个个人比较有疑惑的问题,望大佬们参与讨论:

  • Q1: 实验1中表格里的“AVG”具体是如何计算的?
    “AVG“是把不同层的分类器输出的softmax概率取平均,再取最大值作为分类结果。
  • Q2:如何理解Local attention的计算方式?
  • Q3: 如何理解文中的10-fold交叉验证?
    10-fold交叉验证:交叉验证的思路是用9:1的划分比例做10fold交叉验证,即每个epoch有10个精度输出,再取10个精度的平均值最大的epoch的checkpoint作为训练完成的模型,这个方法是与文中对比的其他工作保持一致的。

有错误的地方还望不吝指出,欢迎进群交流GNNs(入群备注信息!!!,格式:姓名(或网名) -(学校或其他机构信息)- 研究方向)。

猜你喜欢

转载自blog.csdn.net/yyl424525/article/details/112435922