由于图结构非常复杂,信息量大,所以图的机器学习是一个很难的任务。本文展示了如何使用图卷积网络(GCN)对图进行深度学习,图卷积网络是一种强大的神经网络,可直接在图上运行并利用其结构信息。本文介绍了GCN,并使用代码示例来说明信息是如何通过GCN的隐藏层传播的。读者将看到GCN如何聚合来自前几层的信息,以及这种机制如何产生图中节点的有用特征表示。什么是图卷积网络?GCN是一类非常强大的图数据神经网络架构。事实上,它是如此强大,以至于即使是随机初始化的两层GCN也可以生成图网络中节点的有用特征表示。下图显示了这个两层GCN生成的每个节点的2D表示。请注意,即使没有任何训练,这些2D表示也能够保留图中节点的相对接近度。更正式地说,图卷积网络(GCN)是一种对图数据进行操作的神经网络。给定一个图G=(V,E),GCN的输入是:一个维度为N×F?的输入特征矩阵X,其中N是图网络中的节点数,F?是每个节点的输入特征数.图结构由一个维数为N×N的矩阵表示,例如图G的邻接矩阵A。[1]因此,GCN中的隐藏层可以写为H?=f(H??1,A))。其中H?=X,f是传播规则[1]。每个隐藏层H?对应一个N×F?维度的特征矩阵,这个矩阵中的每一行都是一个节点的特征表示。在每一层中,GCN使用传播规则f聚合此信息以形成下一层的特征。这样,特征在每个连续的层中变得越来越抽象。在此框架下,GCN的各种变体仅在传播规则f[1]的选择上有所不同。ASimpleExampleofPropagationRules下面,本文将给出一个最简单的传播规则的例子[1]:f(H?,A)=σ(AH?W?)其中W?是第i层的权重矩阵,σ是非线性激活函数(如ReLU函数)。权重矩阵的维度为F?×F??1,即权重矩阵第二维的大小决定了下一层的特征个数。如果您熟悉卷积神经网络,您会发现此操作类似于卷积核过滤,因为这些权重在图中的节点之间共享。简化接下来我们研究最简单级别的传播规则。设:i=1,(约束条件f是作用于输入特征矩阵的函数)σ是恒等函数选择权重(约束条件:AH?W?=AXW?=AX)即f(X,A)=AX。这个传播规则可能过于简单,遗漏的部分会在本文后面补上。此外,AX相当于一个多层感知器的输入层。1.简单图示例我们将使用下面的图作为一个简单示例:一个简单的有向图。上面用numpy写的有向图的邻接矩阵表示如下:A=np.matrix([[0,1,0,0],[0,0,1,1],[0,1,0,0],[1,0,1,0]],dtype=float)接下来,我们需要提取特征!我们根据其索引为每个节点生成两个整数特征,这简化了本文后面对矩阵运算的手动验证。过程。In[3]:X=np.matrix([[i,-i]foriinrange(A.shape[0])],dtype=float)XOut[3]:matrix([[0.,0.],[1.,-1.],[2.,-2.],[3.,-3.]])2.应用传播规则我们现在构建了一个具有邻接矩阵A和输入集的图X的特征。让我们看看将传播规则应用于它时会发生什么:In[6]:A*XOut[6]:matrix([[1.,-1.],[5.,-5.],[1.,-1.],[2.,-2.]]每个节点(每一行)的表示现在是其邻居的特征之和!换句话说,图卷积层取每个节点表示为它的邻居的聚合。你可以自己验证这个计算。注意,在这种情况下,如果从v到n有一条边,则节点n是节点v的邻居。你可能遇到的问题发现问题:一个节点的聚合表示不包含它自己的特征!表示是相邻节点特征的聚合,所以只有具有自环的节点才会将自己的特征包含在聚合中[1]。度大的节点在其特征表示中的值就大,度小的节点的值就小。这会导致梯度消失或爆炸[1,2],并且还会影响随机梯度下降算法(随机梯度下降算法通常用于训练此类网络,并且每个输入特征的尺度(或取值范围)非常敏感).接下来,本文将分别讨论这些问题。1.添加自循环为了解决第一个问题,我们可以直接为每个节点添加一个自循环[1,2]。具体来说,这可以通过在应用传播规则之前将邻接矩阵A添加到单位矩阵I来实现。In[4]:I=np.matrix(np.eye(A.shape[0]))IOut[4]:matrix([[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]])In[8]:AA_hat=A+IA_hat*XOut[8]:matrix([[1.,-1.],[6.,-6.],[3.,-3.],[5.,-5.]])现在,由于每个节点都是自己的邻居,每个节点在对相邻节点的特征求和的过程中也会包含自己的特征!2.通过将邻接矩阵A与度矩阵D的逆相乘来对特征表示进行归一化,对度矩阵D进行变换,以便通过节点的度对特征表示进行归一化。所以我们的简化传??播规则如下:f(X,A)=D?1AX让我们看看会发生什么。我们首先计算节点的度矩阵。In[9]:D=np.array(np.sum(A,axis=0))[0]D=np.matrix(np.diag(D))DOut[9]:matrix([[1.,0.,0.,0.],[0.,2.,0.,0.],[0.,0.,2.,0.],[0.,0.,0.,1.]])在应用传播规则之前,让我们看看变换邻接矩阵后会发生什么。变换前A=np.matrix([[0,1,0,0],[0,0,1,1],[0,1,0,0],[1,0,1,0]],dtype=float)转换后In[10]:D**-1*AOut[10]:matrix([[0.,1.,0.,0.],[0.,0.,0.5,0.5],[0.,0.5,0.,0.],[0.5,0.,0.5,0.]])可以观察到邻接矩阵中每一行的权重(值)除以行对应的节点的度数。接下来,我们将传播规则应用于转换后的邻接矩阵:In[11]:D**-1*A*XOut[11]:matrix([[1.,-1.],[2.5,-2.5],[0.5,-0.5],[2.,-2.]])得到相邻节点特征均值对应的节点表示。这是因为(转换后的)邻接矩阵的权重对应于相邻节点特征的加权和的权重。你可以自己验证这个结果。集成现在,我们将结合自循环和规范化技巧。此外,我们将重新讨论之前为了简化讨论而省略的权重和激活函数的操作。1.添加权重首先要做的是应用权重。注意这里的D_hat是A_hat=A+I对应的度矩阵,即强制自环矩阵A的度矩阵。In[45]:W=np.matrix([[1,-1],[-1,1]])D_hat**-1*A_hat*X*WOut[45]:matrix([[1.,-1.],[4.,-4.],[2.,-2.],[5.,-5.]])如果我们想降低输出特征表示的维度,我们可以降低权重matrixW的尺度:In[46]:W=np.matrix([[1],[-1]])D_hat**-1*A_hat*X*WOut[46]:matrix([[1.],[4.],[2.],[5.]])2.添加激活函数在本文中,我们选择保持特征表示的维度并应用ReLU激活函数。In[51]:W=np.matrix([[1,-1],[-1,1]])relu(D_hat**-1*A_hat*X*W)Out[51]:matrix([[1.,0.],[4.,0.],[2.,0.],[5.,0.]])这是一个完全隐藏的带有邻接矩阵、输入特征、权重和激活函数的层!Applicationinrealscenarios***,我们将图卷积网络应用到一个真实的图上。本文将向读者展示如何生成上述特征表示。1.Zachary空手道俱乐部Zachary空手道俱乐部是一个广泛使用的社交网络,其中节点代表空手道俱乐部的成员,边代表成员之间的相互关系。扎卡里在调查空手道俱乐部时,管理人员和教练发生了冲突,导致俱乐部一分为二。下图显示了网络的图形表示,其中节点根据节点属于俱乐部的哪个部分进行标记,“A”和“I”分别表示属于管理员和教员阵营的节点。ZacharyKarateClubGraphNetwork2.构建GCN接下来,我们将构建一个图卷积网络。我们实际上不会训练网络,而只是随机初始化它以生成我们在本文开头看到的特征表示。我们将使用networkx,它有一个可以轻松实现的Zachary空手道俱乐部的图形表示。然后,我们将计算A_hat和D_hat矩阵。fromnetworkximportto_numpy_matrixzkc=karate_club_graph()order=sorted(list(zkc.nodes()))A=to_numpy_matrix(zkc,nodelist=order)I=np.eye(zkc.number_of_nodes())AA_hat=A+ID_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层。在这里,我们只使用单位矩阵作为特征表示,即每个节点表示为一个单热编码的分类变量。defgcn_layer(A_hat,D_hat,X,W):returnrelu(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)输出=H_2我们进一步提取特征表示。feature_representations={node:np.array(output)[node]fornodeinzkc.nodes()}你看,像这样的特征表示很好地分离了Zachary的空手道俱乐部中的两个社区。此时,我们甚至还没有开始训练模型!Zachary的空手道俱乐部图网络中节点的特征表示我们应该注意到,在这个例子中,由于ReLU函数,随机初始化的权重在x或y轴上很可能为0,因此需要多次随机初始化迭代才能生成上图。结论在本文中,对图卷积网络进行了高层次的介绍,以及GCN中每一层节点的特征表示是如何基于其相邻节点的聚合来构建的。读者可以了解如何使用numpy构建这些网络,以及它们的强大之处:即使是随机初始化的GCN也可以在Zachary的空手道俱乐部网络中分离社区。ThomasKipf关于图卷积网络的参考博客文章。ThomasKipf和MaxWelling撰写的名为“使用图卷积网络进行半监督分类”的论文。原文链接:https://towardsdatascience.com/how-to-do-deep-learning-on-graphs-with-graph-convolutional-networks-7d2250723780【本文为机器之心专栏原文翻译、微信公众号《机器之心(id:almosthuman2014)》】点此阅读作者更多好文
