如何在图上进行卷积网络的深度学习(一)
作者:TobiasSkovgaardJepsen
编译:ronghuaiyang
导读这是第一部分 , 图卷积网络的高级介绍 。
图的机器学习是一项非常困难的任务 , 因为图的结构非常复杂 , 但同时也提供了丰富的信息 。 本文是关于如何利用图卷积网络(GCNs)对图进行深度学习的系列文章中的第一篇 。 GCNs是一种功能强大的神经网络 , 旨在直接处理图并利用图的结构信息 。
在本文中 , 我将介绍GCNs , 并使用图解的方式说明信息如何通过GCN的隐藏层进行传播 。 我们将看到GCNs是如何聚合来自前一层的信息 , 以及这种机制如何生成图中节点的有用特征表示 。
什么是图卷积网络?GCNs是一种非常强大的图机器学习神经网络结构 。 事实上 , 它们非常强大 , 甚至一个随机初始化的2层GCN都可以生成网络中节点的有用特征表示 。 下图展示了由这样一个GCN生成的网络中每个节点的二维表示 。 请注意 , 即使没有任何训练 , 网络中节点的相对接近性也保留在二维表示中 。
一个简单的传播规则
最简单的传播规则之一是:
我们用最简单的方法检查一下传播规则 。 令:
i=1的时候 , f是关于输入特征矩阵的函数σ是恒等变换函数选择这样的权值 , 使得 , AH?W?=AXW?=AX.换句话说 , f(X,A)=AX , 这个传播法则也许太简单了一点 , 不过我们后面会加点东西 。 另外注意 , AX现在相当于多层感知器的输入层 。
一个简单的图的例子
作为一个简单的例子 , 我们使用下面的图:
In[3]:X=np.matrix([[i,-i]foriinrange(A.shape[0])],dtype=float)XOut[3]:matrix([[0.,0.],[1.,-1.],[2.,-2.],[3.,-3.]])应用传播法则
好了 , 我们现在有了一个图 , 邻接矩阵A还有一组特征X , 我们看看应用传播法则的时候发生了什么:
In[6]:A*XOut[6]:matrix([[1.,-1.],[5.,-5.],[1.,-1.],[2.,-2.]])发生了什么?每个节点(每一行)的表示现在是其邻居特征的总和!换句话说 , 图卷积层将每个节点表示为其邻域的集合 。 我鼓励你自己检查一下计算结果 。 注意 , 在本例中 , 如果存在一条从v到n的边 , 则节点n是节点v的邻居 。
问题浮出水面!
你可能已经发现问题了:
节点的聚合表示不包括它自己的特征!表示是邻居节点特征的集合 , 因此只有具有自循环的节点才会在集合中包含自己的特征度大的节点的特征表示值较大 , 度小的节点的特征表示值较小 。 这可能导致梯度消失或爆炸 , 对于随机梯度下降算法也存在问题 , 这些算法通常用于训练此类网络 , 并且对每个输入特征的尺度(或值范围)敏感 。下面 , 我将分别讨论这些问题 。
加入自循环
要解决第一个问题 , 只需向每个节点添加一个自循环 。 实际上 , 这是通过在应用传播规则之前将单位矩阵I添加到邻接矩阵A来实现的 。
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]:A_hat=A+IA_hat*XOut[8]:matrix([[1.,-1.],[6.,-6.],[3.,-3.],[5.,-5.]])由于节点现在是其自身的邻居 , 所以在聚合其邻居的特征时将包含该节点自己的特征!
特征表示的归一化
特征表示可以通过节点的度来归一化 , 将邻接矩阵A与度矩阵D的逆矩阵相乘进行转换 。 因此 , 我们的简化传播规则是这样的:
之前
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.]])【如何在图上进行卷积网络的深度学习(一)】得到与相邻节点特征均值对应的节点表示 。 这是因为(转换后的)邻接矩阵中的权值对应于相邻节点特征加权和中的权值 。 我再次鼓励你亲自验证这一观察结果 。
合在一起
现在我们结合了自循环和归一化技巧 。 此外 , 我们还将重新介绍先前为简化讨论而放弃的权值和激活函数 。
把权值加回来
首先要做的是使用权重 。 注意这里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.]])如果我们想减小输出特征表示的维数 , 我们可以减小权值矩阵W的大小:
In[46]:W=np.matrix([[1],[-1]])D_hat**-1*A_hat*X*WOut[46]:matrix([[1.],[4.],[2.],[5.]])添加激活函数
我们选择保留特征表示的维数 , 并应用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.]])看!一个完整的带有邻接矩阵 , 输入特征 , 权重和激活函数的隐藏层!
回到现实中
最后 , 我们可以把一个图卷积网络应用到一个真实的图上 。 我将向你展示如何生成我们在本文前面看到的特征表示 。
Zachary的空手道俱乐部
Zachary的空手道俱乐部是一个常用的社交网络 , 每个节点代表一个空手道俱乐部的成员 , 并将他们之间的关系用边来表示 。 在Zachary学习空手道的时候 , 管理员和教练发生了冲突 , 导致空手道俱乐部一分为二 。 下图显示了网络的图表示 , 节点的标记表示了这个人属于俱乐部的哪个部分 。 管理员和教练分别用“A”和“I”标记 。
fromnetworkximportkarate_club_graph,to_numpy_matrixzkc=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+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)output=H_2我们提取特征表示 。
feature_representations={node:np.array(output)[node]fornodeinzkc.nodes()}看!在Zachary的空手道俱乐部中 , 特征表示可以很好的将社区分开 。 我们还没开始训练呢!
英文原文:
推荐阅读
- 小龙虾|三农探析:池塘养殖小龙虾如何高产?高产养殖技术全解析
- 显微镜|假如人类可以把显微镜提升到40亿倍,是不是全新的宇宙观?
- 春天,吃鱼吃肉不如吃它,8块钱炒一盘,鲜香营养,好吃还不发胖
- 菜籽饼|菜籽饼被誉为果园之宝,但用错了烧苗烧根,果农如何来使用?
- 水产养殖|生态水产养殖如何提高鱼病的预防工作?大疆渔业这样建议
- 香芋跟南瓜还能如此吃,不做煎饼,软糯营养,好吃不上火,太美味
- 冬天,吃白菜吃菠菜不如它,营养极高,视力好了,肝脏也健康了
- 转基因|转基因背锅?去年已有不少弃种,如今产地低至3毛钱,果农愁销路
- 粉丝如此做真解馋,不蒸不炖不焖,好吃营养,老公一下子吃了一盘
- 早餐不吃馒头,教你如此做花卷,不用时间发面,松软香甜,真好吃
