图的机器学习是一项艰巨的任务,因为它非常复杂,而且信息结构也很丰富。这篇文章是有关如何使用图卷积网络(GCN)在图上进行深度学习的系列文章中的第一篇,图卷积网络是一种功能强大的神经网络,旨在如何利用其结构信息并且直接在图上进行工作。该系列的文章是:

  • 图卷积网络的高级介绍(本文)
  • 频谱图卷积的半监督学习(下一篇)
    在本文中,我将对GCN进行介绍,并使用编码示例说明如何通过GCN的隐藏层传播信息。我们将看到GCN如何汇总来自先前各层的信息,以及该机制如何产生图中节点的有用特征表示。
什么是图卷积网络?

GCN是用于基于图的机器学习的非常强大的神经网络体系结构。实际上,它们是如此强大,以至于随机初始化的2层GCN都可以生成网络中节点的有用特征表示。下图说明了由此类GCN生成的网络中每个节点的二维表示。注意,即使没有任何训练,网络中节点的相对信息仍保留在二维表示中。

GCN图卷积神经网络详解 图卷积神经网络应用_邻接矩阵


更确切地说,图卷积网络(GCN)是在图上运行的神经网络。给定图G =(V,E),则GCN作为输入:

  • 输入特征矩阵N×F⁰特征矩阵X,其中N是节点数,F⁰是每个节点输入的特征数,以及
  • 图结构的N×N矩阵表示形式,例如G的邻接矩阵A
    因此,GCN中的隐藏层可以写成Hⁱ= f(Hⁱ⁻¹,A)),其中H⁰= X,f是传播函数。每一层Hi对应于一个N×Fi特征矩阵,其中每一行是一个节点的特征表示。在每一层,使用传播规则f汇总这些特征,以形成下一层的特征表示。这样,每个连续层的特征变得越来越抽象。在此框架中,GCN的变体仅在传播规则f 的选择上有所不同。
一个简单的传播规则

最简单的可能传播规则之一是:
f(Hⁱ,A)=σ(AHⁱWⁱ)
其中Wⁱ是第i层的权重矩阵,而σ是非线性激活函数,例如ReLU函数。权重矩阵的尺寸为Fⁱ×Fⁱ⁺¹;换句话说,权重矩阵的第二维的大小确定了下一层的特征数量。如果您熟悉卷积神经网络,则此操作类似于过滤操作,因为这些权重在图中的节点之间共享。

简化版

让我们从最简单的角度学习传播规则。假设

  • i = 1,且 f是输入特征矩阵的函数
  • σ是恒等函数,并且
  • 选择权重AH⁰W⁰=AXW⁰= AX。
    换句话说,f(X,A)= AX。这个传播规则可能有点太简单了,但是我们稍后会添加缺失的部分。作为附带说明,AX现在等效于多层感知器的输入层。
一个简单的图示例

GCN图卷积神经网络详解 图卷积神经网络应用_神经网络_02


下面是其numpy邻接矩阵表示形式:

GCN图卷积神经网络详解 图卷积神经网络应用_权重_03


接下来,我们需要特征!我们根据其索引为每个节点生成2个整数特征,这样便于以后手动矩阵运算。

GCN图卷积神经网络详解 图卷积神经网络应用_卷积网络_04

使用传播规则

好的!现在,我们有了一个图形,其邻接矩阵A和一组输入特征X。让我们看看应用传播规则时会发生什么:

GCN图卷积神经网络详解 图卷积神经网络应用_GCN图卷积神经网络详解_05


发生了什么?现在,每个节点(每行)的表示形式都是其邻居特征的总和!换句话说,图卷积层将每个节点表示为其邻居的集合。我鼓励您自己检查一下计算。注意,在这种情况下,如果存在从v到n的边,则节点n是节点v的邻居。

Uh oh! Problems on the Horizon!

您可能已经发现了问题:

  • 节点的汇总表示不包括其自身的功能!该表示是邻居节点特征的集合,因此只有具有自环的节点才会在集合中包括自己的特征。
  • 度数较大的节点的特征表示将具有较大的值,而度数较小的节点将具有较小的值。这可能会导致梯度消失或爆炸,但对于通常用于训练此类网络并且对每个输入特征的比例(或值的范围)敏感的随机梯度下降算法也存在问题。
    在下文中,我将分别讨论每个问题。
添加自环节点(Adding Self-Loops)

为了解决第一个问题,可以简单地向每个节点添加一个自环。实际上,这是通过在应用传播规则之前将单位矩阵i添加到邻接矩阵A来完成的。

GCN图卷积神经网络详解 图卷积神经网络应用_GCN图卷积神经网络详解_06


由于该节点现在是其自身的邻居,因此在聚合其邻居的特征时会包括该节点自己的特征!

归一化特征表示(Normalizing the Feature Representations)

通过将邻接矩阵A与逆转度矩阵D相乘来变换邻接矩阵A,可以用节点度对特征表示进行归一化。因此,我们简化的传播规则如下所示:


f(X, A) = D⁻¹AX


让我们看看发生了什么。我们首先计算度矩阵。

GCN图卷积神经网络详解 图卷积神经网络应用_邻接矩阵_07


在应用传播规则之前,让我们看看对邻接矩阵进行转换后会发生什么。

GCN图卷积神经网络详解 图卷积神经网络应用_权重_08


观察邻接矩阵每一行中的权重(值)已除以与该行相对应的节点的度。我们将传播规则应用于变换后的邻接矩阵

GCN图卷积神经网络详解 图卷积神经网络应用_神经网络_09


并得到与相邻节点特征均值相对应的节点表示。这是因为(变换后的)邻接矩阵中的权重与相邻节点特征的加权和中的权重相对应。同样,我鼓励您自己验证。

完整的图卷积结构(Putting it All Together)

现在,我们结合了自循环和标准化技巧。此外,我们将重新介绍先前为了简化讨论而丢弃的权重和激活函数。

加入权重

首要任务是加入权重。请注意,这里D_hat是A_hat = A + I的度矩阵,即具有自环的A的度矩阵。

GCN图卷积神经网络详解 图卷积神经网络应用_邻接矩阵_10


如果我们想减少输出特征表示的维数,我们可以减小权重矩阵W的大小:

GCN图卷积神经网络详解 图卷积神经网络应用_权重_11

添加激活函数(Adding an Activation Function)

我们选择保留特征表示的维数并应用ReLU激活功能

GCN图卷积神经网络详解 图卷积神经网络应用_GCN图卷积神经网络详解_12


瞧!一个具有邻接矩阵,输入特征,权重和激活函数的完整隐藏层!

回到实际业务中(Back to Reality)

现在,最后,我们可以在真实图上应用图卷积网络。我将向您展示如何生成我们在文章开头看到的特征表示。

Zachary’s Karate Club

扎卡里(Zachary)的空手道俱乐部是一种常用的社交网络,其中节点代表空手道俱乐部的成员,其边缘相互联系。当扎卡里(Zachary)研究空手道俱乐部时,管理员和教练之间发生了冲突,导致俱乐部分裂为两部分。下图显示了网络的图形表示,并且根据俱乐部的哪个部分标记了节点。管理员和教练分别标有“ A”和“ I”。

GCN图卷积神经网络详解 图卷积神经网络应用_GCN图卷积神经网络详解_13

构建图卷积网络(Building the GCN)

现在让我们建立图卷积网络。我们实际上不会训练网络,而只是简单地随机初始化它以产生我们在本文开头看到的特征表示。我们将使用具有易于使用的networkx来表示俱乐部的图形表示,并计算A_hat和D_hat矩阵。

from networkx import karate_club_graph, to_numpy_matrix
zkc = karate_club_graph()
order = sorted(list(zkc.nodes()))
A = to_numpy_matrix(zkc, nodelist=order)
I = np.eye(zkc.number_of_nodes())
A_hat = A + I
D_hat = np.array(np.sum(A_hat, axis=0))[0]
D_hat = np.matrix(np.diag(D_hat))

接下来,我们将随机初始化权重。

W_1 = np.random.normal(
    loc=0, scale=1, size=(zkc.number_of_nodes(), 4))
W_2 = np.random.normal(
    loc=0, size=(W_1.shape[1], 2))

堆叠GCN层。在这里,我们仅使用单位矩阵作为特征表示,即,每个节点都表示为one-hot编码的分类变量。

def gcn_layer(A_hat, D_hat, X, W):
    return relu(D_hat**-1 * A_hat * X * W)
H_1 = gcn_layer(A_hat, D_hat, I, W_1)
H_2 = gcn_layer(A_hat, D_hat, H_1, W_2)
output = H_2

我们提取特征表示。

feature_representations = {
    node: np.array(output)[node] 
    for node in zkc.nodes()}

瞧!特征表示很好地将Zachary空手道俱乐部中的社区区分开。而且我们还没有开始训练!

GCN图卷积神经网络详解 图卷积神经网络应用_神经网络_14


我应该注意,对于此示例,由于ReLU函数的作用,随机初始化的权重很有可能在x轴或y轴上给出0值,因此需要进行几次随机初始化才能产生上图。

结论

在这篇文章中,我对图卷积网络进行了高级介绍,并说明了GCN中每一层上节点的特征表示是如何基于其邻域的聚合而得出的。我们了解了如何使用numpy构建这些网络,以及它们的功能强大:即使是随机初始化的GCN,也可以在Zachary的空手道俱乐部中分离社区。
在下一篇文章中,我将进一步介绍技术细节,并展示如何使用半监督学习来实现和训练最近发布的GCN。您可以在此处找到该系列的下一篇文章