Deep Learning 中的GCN
**Deep learning中的Convoulution就是要设计含有trainable共享参数的kernel,从
( f ∗ h ) G = U ( λ 1 . . . λ n ) U T f (f*h)_G=U \begin{pmatrix} \lambda_1 & & \\ &...& \\ & &\lambda_n\\ \end{pmatrix}U^Tf (f∗h)G=U⎝⎛λ1...λn⎠⎞UTf
中可以看出graph convolution中的卷积参数就是
d i a g ( h ^ ( λ l ) ) diag(\hat{h}(\lambda_l)) diag(h^(λl))
第一代GCN
Spectral Networks and Locally Connected Networks on Graphs简单粗暴地把 d i a g ( h ^ ( λ l ) ) diag(\hat{h}(\lambda_l)) diag(h^(λl))变成了卷积核 d i a g ( θ l ) diag(\theta_l) diag(θl),也就是:
y o u t p u t = σ ( U g θ ( Λ ) U T x ) y_{output}=\sigma(Ug_{\theta}(\Lambda)U^Tx) youtput=σ(Ugθ(Λ)UTx)
(为避免混淆,本文中称 g θ ( Λ ) g_{\theta}(\Lambda) gθ(Λ)是卷积核, U g θ ( Λ ) U T Ug_{\theta}(\Lambda)U^T Ugθ(Λ)UT的运算结果为卷积运算矩阵)
g θ ( Λ ) = ( θ 1 . . . θ n ) g_{\theta}(\Lambda)=\begin{pmatrix} \theta_1 & & \\ &...& \\ & &\theta_n\\ \end{pmatrix} gθ(Λ)=⎝⎛θ1...θn⎠⎞
式(3)就是标准的第一代GCN中的layer了,其中 σ ( ∙ ) \sigma(\bullet) σ(∙)是激活函数, Θ = ( θ 1 , θ 2 , . . . , θ n ) \Theta=(\theta_1,\theta_2,...,\theta_n) Θ=(θ1,θ2,...,θn)跟三层神经网络中的weight一样是任意参数,通过初始化赋值然后利用误差反向传播进行调整,x就是graph上对应于每个顶点的feature vector(由数据集提取特征构成的向量)。
第一代的参数方法存在一些弊端,主要在于:
- 每次前向传播,都要计算 U , d i a g ( θ l ) U,diag(\theta_l) U,diag(θl)及 U T U^T UT三者的矩阵乘积,特别是对于大规模的graph,计算的代价较高,也就是论文中 O ( n 2 ) O(n^2) O(n2)的计算复杂度。
- 卷积核不具有spatial localization
- 卷积核需要n个参数
第二代GCN
Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering把
h
^
(
λ
l
)
\hat{h}(\lambda_l)
h^(λl)巧妙地设计成了
∑
j
=
0
K
α
j
λ
l
i
\sum_{j=0}^{K}\alpha_j \lambda_l^i
∑j=0Kαjλli也就是:
y
o
u
t
p
u
t
=
σ
(
U
g
θ
(
Λ
)
U
T
x
)
y_{output}=\sigma(Ug_{\theta}(\Lambda)U^Tx)
youtput=σ(Ugθ(Λ)UTx)
g
θ
(
Λ
)
=
(
∑
j
=
0
K
α
j
λ
l
i
.
.
.
∑
j
=
0
K
α
j
λ
l
i
)
g_{\theta}(\Lambda)=\begin{pmatrix} \sum_{j=0}^K\alpha_j \lambda_l^i & & \\ &...& \\ & &\sum_{j=0}^{K}\alpha_j \lambda_l^i\\ \end{pmatrix}
gθ(Λ)=⎝⎜⎛∑j=0Kαjλli...∑j=0Kαjλli⎠⎟⎞
通过矩阵乘法再来转化:
g
θ
(
Λ
)
=
(
∑
j
=
0
K
α
j
λ
l
i
.
.
.
∑
j
=
0
K
α
j
λ
l
i
)
=
∑
j
=
0
K
α
j
Λ
j
g_{\theta}(\Lambda)=\begin{pmatrix} \sum_{j=0}^{K}\alpha_j \lambda_l^i & & \\ &...& \\ & &\sum_{j=0}^{K}\alpha_j \lambda_l^i\\ \end{pmatrix} = \sum_{j=0}^K\alpha_j\Lambda^j
gθ(Λ)=⎝⎜⎛∑j=0Kαjλli...∑j=0Kαjλli⎠⎟⎞=j=0∑KαjΛj
进而:
上式成立是因为:
(4)式就变成了:
y
o
u
t
p
u
t
=
σ
(
∑
j
=
0
K
α
j
L
j
x
)
y_{output}=\sigma(\sum_{j=0}^K\alpha_jL^jx)
youtput=σ(∑j=0KαjLjx)其中
(
α
1
,
α
2
,
.
.
.
,
α
K
)
(\alpha_1,\alpha_2,...,\alpha_K)
(α1,α2,...,αK)是任意的参数,通过初始化赋值然后利用误差反向传播进行调整。
式(5)所涉及的卷积核其优点在于:
(1)卷积核只有k个参数,一般k远小于n,参数的复杂度被大大降低了。
(2)矩阵变换后不需要再做特征分解了,直接用拉普拉拉斯矩阵l进行变换。
(3)卷积核具有很好的spatial localization,特别地,K就是卷积核的receptive field感受野,也就是说每次卷积会将中心顶点K-hop neighbor上的feature进行加权求和,权系数就是αk,更直观地看,K=1就是对每个顶点上一阶neighbor的feature进行加权求和,如下图所示:
同理,K=2的情形如下图所示:
ps:上图只是以一个顶点作为实列,GCN每一次卷积对所有顶点都完成了图示的操作。
图池化模块
泛化卷积神经网络到图结构数据的另一个关键点, 那就是图池化模块了. 尤其是对于图级分类任务.
和原始CNN中的池化模块类似, 图池化模块可以容易的减少方差和通过从原始特征数据中下采样来减少计算复杂度.
Mean/max/sum池化是实现这一点的最原始和最有效的方法,因为在池化窗口中计算均值/最大/和值是快速的。
-
Henaff等人证明了在网络的开始加入一个简单的max/mean池化, 对于降低图的维度和减轻昂贵的图傅里叶变换操作的损耗是尤其重要的.
-
而Defferrard(ChebNet)等人, 进一步优化了max/min池化操作, 设计了一种有效的池化策略。
- 使用设计的粗化操作经过粗化后,将输入图及其粗化版本的顶点转化为一棵平衡的二叉树.
- 在最粗糙的层次上对节点进行任意排序,然后在平衡二叉树中将这种排序传播到较低的层次,最终在最精细的层次上产生一个规则的排序.
- 池化这样的重排的1D信号比原始的效率要高得多。
-
SortPooling操作也被在架构DGCNN中提出, 也是进行了类似的重排操作, 将顶点重排到更有意义的顺序. 不同于ChebNet, 这里是根据顶点图中的结构化的角色来进行的排序.
- 这个方法将来自空间图卷积的图的无序顶点特征看做一个连续的WL颜色, 并且用来对顶点排序.
- 除了对顶点特征进行排序外,它还通过截断/扩展图的特征张量将图的大小统一为k. 如果n>k,则删除最后的n-k行, 否则添加k-n零行.
- 该方法通过求解一个具有挑战性的底层图结构任务,即置换不变量,增强了池化网络以提高GCN的性能.
-
DIFFPOOL池化模块, 可以生成图的层次表达, 它不仅可以与CNN相结合,而且可以与各种(various)图型神经网络进行端到端的结合.
- 与以前的所有粗化方法相比,DIFFPOOL并不简单地将节点聚集在一个图中,而是为一组广泛的输入图的分层池节点提供了一个通用的解决方案.
- DIFFPOOL通过使用两个GNN对节点进行集群来重新定义图池模块. 任何标准的GCN模块都能够与DIFFPOOL相结合,不仅可以提高性能,而且可以加快卷积运算的速度.