醋醋百科网

Good Luck To You!

GCN-通俗易通,醍醐灌顶,茅塞顿开

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的相关任务研究,任务关于预测分析,有兴趣的小伙伴可以一起交流。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言