预备知识:
在 numpy中,矩阵的元素操作对矩阵维度的要求,通过一种叫做 broadcasting的机制实现。我们称两个矩阵相容(compatible),如果它们相互对应的维度(行对行,列对列)满足以下条件:
- 对应的维度均相等, 或 有一个维度的大小是1
- 矩阵的Hadamard 乘积是一个元素运算,就像向量一样。对应位置的值相乘产生新的矩阵。
- 在 numpy 中,只要矩阵和向量的维度满足 broadcasting的要求,你便可以对他们使用 Hadamard 乘积运算.
动机:
节点嵌入的学习对图节点分类与连接预测是非常有效的,然而现在的节点分类只停留在初级水平,也就是只是用简单的全局池化去聚集节点特征,或者是手动设计,固定的启发式的为图结构设计粗化层次。前面的一个比较大的提升是可微分粗化池化层(DIFFPOOL),其像一个CNNs的下采样,用自适应的方法对图的size进行reduce,但是之前的池化复杂度达到了平方阶,所以不能推广到大的图。所以现在我们结合图神经网络设计的几个最新进展,以证明在不牺牲稀疏性的情况下,具有竞争力的层次图分类结果是可能的。
模型
准备工作:
- 节点特征: X ∈ R N × F \mathbf{X}\in \mathbb{R}^{N\times F} X∈RN×F
- 邻接矩阵:
A
∈
R
N
×
N
\mathbf{A}\in \mathbb{R}^{N\times N}
A∈RN×N
如果我们的节点没有特征可用,则可以使用节点的度作为人造特征,比如可以用one-hot编码。这里邻接矩阵采用二值对称(即无向无权图)
类似CNN,我们这里用了readout层类比pooling层,它将学习的representation转换成了固定长度的向量表示(dualMPNN里边有用到),用于最后的预测(比如一个简单的MLP)。
卷积层
- A ^ = A + I N \hat{\mathbf{A}}=\mathbf{A}+\mathbf{I}_N A^=A+IN
- D ^ i j = ∑ j A ^ i j \hat{D}_{ij}=\sum_j \hat{A}_{ij} D^ij=∑jA^ij
- σ = R e l u \sigma=Relu σ=Relu
-
θ
,
θ
′
∈
R
F
×
F
′
\mathbf{\theta},\mathbf{\theta}' \in \mathbb{R}^{F\times F'}
θ,θ′∈RF×F′
前一项是卷积,后面一项相当于是跳跃连接(skip-connect)
池化层
之前DIFFPOOL中是吧N个点变成[kN]个簇。现在我们是学graph U-Net的思想,将节点减去[kN]个,k属于0到1之间。
为了可以决定哪些节点是要留下来的,我们采用节点得分,这个得分用网络自己学习出来,所以要是可微的操作,这里定义一个向量
p
⃗
∈
R
F
×
1
\vec{p}\in \mathbb{R}^{F\times 1}
p∈RF×1,与X相乘之后可以得到每个节点的得分,按照得分排名可以选择留下来的指标,大概流程是:
- ||.||为二范数
- y ⃗ ∈ R N × 1 \vec{y}\in \mathbb{R}^{N\times 1} y∈RN×1
- top-k表示从给定向量中选出前k个指标
- ⊙ \odot ⊙是哈达玛乘积,预备知识有
- . i ⃗ ._{\vec{i}} .i表示指标操作,从矩阵中选出指定的 i i i个,X的话是选出 i 列,A的话行列都取。
Redout layer
我们经经过图卷积之后的矩阵都不便用于预测等操作,都是将这个得到的representation变成一个fixed-size的representation,最简单的方式就是直接将所有节点的嵌入表示都加起来,最后取平均,就像变成一个节点一样。这里我们采用全局最大节点嵌入与全局平均拼接起来,之后再利用JK-net架构,最后把所有中间的特征矩阵
X
l
X^{l}
Xl加起来。
- N l N^{l} Nl是图节点的数量,
- x ⃗ i l \vec{x}_i^{l} xil是第 i 个节点的特征,
- || 表示拼接
最后将
s
⃗
(
l
)
\vec{s}^{(l)}
s(l)加起来,即
s
⃗
=
∑
l
=
1
L
s
⃗
(
l
)
\vec{s}=\sum_{l=1}^L \vec{s}^{(l)}
s=l=1∑Ls(l)
然后再放进MLP中进行预测,最后可以得到预测。
实验
文章的主要亮点只是占的内存少而已,其他还不如DIFFPOOL。