“ GCN原来这么简单”
01
什么是图卷积?
然而现实世界中,图中的顶点还包含若干的属性信息,如社交网络中的用户节点信息,引用文献包含的文本信息等,对于这类信息,基于Graph Embedding 的方法通常是将节点特征向量 Embedding 提供给后续任务使用。如下图 1 所示,我们可以通过节点间的关系矩阵(邻接矩阵)和每个节点的嵌入,面向特殊任务进行学习嵌入表示。
图 1 图的空间结构、节点、以及节点间关系表示
更形式化地说,图卷积网络(GCN)是一个对图数据进行操作的神经网络。给定图 G = (V, E),其中V为顶点,E为边信息,GCN 的输入为:
1、一个输入维度为 N × D 的特征矩阵 X,其中 N 是图网络中的节点数,而 D表示的是每个节点的输入特征维度,本文假设为300维;
2、一个图结构的维度为 N × N 的矩阵表征,本文简化为图 G 的邻接矩阵 A。
因此,GCN 中的隐藏层可以写作 H^{i+1} = F(H^{i}, A))。其中,H^0 = X,F 是一种传播规则,可以简化为传统的前馈神经网络函数。每一个隐藏层 H^{i} 都对应一个维度为 N × F^{i} 的特征矩阵,该矩阵中的每一行都是某个节点的特征表征。在每一层中,GCN 会使用传播规则 F 将这些信息聚合起来,从而形成下一层的特征。这样一来,在每个连续的层中特征就会变得越来越抽象。在该框架下,GCN 的各种变体只不过是在传播规则 F 的选择上有所不同。如下图 2 所示:
图 2 GCN的实现过程。图(a)C 可以表示为原始输入,F 表示经过隐藏层后的图表示。(b)我们可以假设基于节点表示的聚类任务。
02
GCN实现原理与过程-简化
GCN原文公式,
本文对此公式进行了简化,简化的程度已经达到了人人都能看懂的程度。下面,本文将给出一个最简单的传播规则示例:F(H^{i}, A) = σ(AH^{i}W^{i})。其中,W^{i} 是第 i 层的权重矩阵,σ 是非线性激活函数(如 ReLU 函数)。权重矩阵的维度为 F(H^{i})× F(H^{i+1}),即权重矩阵第二个维度的大小决定了下一层的特征数。和卷积神经网络相比,会发现由于这些权重在图中的节点间共享,该操作与卷积核滤波操作类似。
以上步骤可以继续简化,接下来我们在最简单的层次上研究传播规则。令:
1、i = 1,(F 是作用于输入特征矩阵的函数);
2、σ 为激活函数。
F (X, A) = AX,因此,AX 等价于多层感知机的输入层。
我们用numpy实现前馈过程:
A = np.matrix([
[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 1, 0, 0],
[1, 0, 1, 0]],
dtype=float
)
X = np.matrix([
[i, -i]
for i in range(300)
], dtype=float)
A * X 属于 R^{4*300}
若是发现A中不包含自己的特征,我们可以给A加一个单位向量A=A+E。
03
GCN实现
def GCN(adj_dim, num_class, feature_dim, dropout_rate=0.5, l2_reg=0, feature_less=True, ):
Adjs = [Input(shape=(None,), sparse=True)]
if feature_less:
X_in = Input(shape=(1,), )
emb = Embedding(adj_dim, feature_dim, embeddings_initializer=Identity(1.0), trainable=False)
X_emb = emb(X_in)
H = Reshape([X_emb.shape[-1]])(X_emb)
else:
X_in = Input(shape=(feature_dim,), )
H = X_in
H = GraphConvolution(16, activation='relu', dropout_rate=dropout_rate, l2_reg=l2_reg)(
[H] + Adjs)
Y = GraphConvolution(num_class, activation='softmax', dropout_rate=dropout_rate, l2_reg=0)(
[H] + Adjs)
model = Model(inputs=[X_in] + Adjs, outputs=Y)
return model
这里feature_less的作用是告诉模型我们是否有额外的顶点特征输入,当feature_less为True的时候,我们直接输入一个单位矩阵作为特征矩阵,相当于对每个顶点进行了onehot表示。具体的实现代码,可以参考:
https://github.com/shenweichen/GraphNeuralNetwork.
感谢大家的阅读!!!下期,我们会对GCN进行更为深入的讲解。最近,小编也在进行GCN的相关任务研究,任务关于预测分析,有兴趣的小伙伴可以一起交流。