如何利用图卷积网络对图进行深度学习(上)
副问题[/!--empirenews.page--]
基于图的呆板进修是一项坚苦的使命,由于图的布局很是伟大,并且信息量也很大。这篇文章是关于怎样用图卷积收集(GCNs)对图举办深度进修的系列文章中的第一篇,GCNs是一种强盛的神经收集,旨在直接处理赏罚图并操作其布局信息。 在这篇文章中,我将先容GCNs,并举例声名怎样通过GCN的潜匿层撒播信息。我们将看到GCN怎样聚合来自前几层的信息,以及该机制怎样天生图中节点的有效特性暗示。 什么是图卷积收集?GCNs是一种很是强盛的用于图形呆板进修的神经收集系统布局。究竟上,它们很是强盛,纵然是随机启动的2层GCN也可以天生收集中节点的有效特性暗示。下图声名白由这种GCN发生的收集中每个节点的二维暗示。请留意,纵然没有任何实习,收集中节点的相对靠近度也保存在二维暗示中。 矫正式地说,图卷积收集(GCN)是一种对图举办运算的神经收集。给定一个图G=(V,E),GCN作为输入
因此,GCN中的潜匿层可以被写为H= f (H,A)),个中 H= X和f是一个撒播[1]。每一层H对应于一个N×F特征矩阵,个中每一行是一个节点的特性暗示。在每一层,行使撒播法则f将这些特性聚合起来形成下一层的特性。这样,特性在每一层变得越来越抽象。在这个框架中,GCN的变体只在撒播法则f[1]的选择上有所差异。 一个简朴的撒播法则最简朴的撒播法则之一是[1]: f(H,A)=σ(AHW)个中W是第i层的权重矩阵,σ长短线性激活函数,如ReLU函数。权重矩阵的维数为F × F;换句话说,权重矩阵的第二维度的巨细抉择了下一层的特性数。假如您认识卷积神经收集,则此操纵相同于过滤操纵,由于这些权重在图中的节点之间共享。 简化让我们从最简朴的条理来研究撒播法则。若是 i=1,s.t.f是输入特性矩阵的函数, σ是恒等式函数,而且 选择重量s.t.AHW=AXW=AX。 一个简朴的图形示例作为一个简朴的例子,我们将行使下图: 下面是它的numpy连接矩阵暗示。 A = np.matrix([ [0, 1, 0, 0], [0, 0, 1, 1], [0, 1, 0, 0], [1, 0, 1, 0]], dtype=float ) 接下来,我们必要成果!我们按照节点的索引为每个节点天生2个整数特性。这样便于往后手动确认矩阵计较。 In [3]: X = np.matrix([ [i, -i] for i in range(A.shape[0]) ], dtype=float) X Out[3]: matrix([ [ 0., 0.], [ 1., -1.], [ 2., -2.], [ 3., -3.] ]) 应用撒播法则好吧!我们此刻有一个图,它的连接矩阵a和一组输入特性X。让我们看看当我们应用撒播法则时会产生什么: In [6]: A * X Out[6]: matrix([ [ 1., -1.], [ 5., -5.], [ 1., -1.], [ 2., -2.]] 产生了什么事?每个节点(每一行)的暗示此刻是其相邻特性的总和!换句话说,图卷积层将每个节点暗示为其邻域的荟萃。我勉励你本身搜查一下计较功效。留意,在这种环境下,假如存在V到N的边,则节点N是节点V的邻人。 哦哦!题目就在面前!你也许已经发明白题目: 节点的聚合暗示不包罗其自身的成果!该暗示是邻人节点特性的聚合,因此只有具有自轮回的节点才会在聚合中包括本身的特性。[1] 具有大角度的节点在其特性暗示中将具有大值,而具有小角度的节点将具有小值。这也许导致梯度消散或爆炸[1,2],但对付凡是用于实习此类收集且对每个输入特性的比例(或取值范畴)敏感的随机梯度降落算法也是有题目的。 在下面,我将别离接头这些题目。 添加Self-Loops 要办理第一个题目,只需向每个节点添加一个self-loop[1,2]。在实践中,这是通过在应用撒播法则之前将单元矩阵I添加到连接矩阵A来实现的。 In [4]: I = np.matrix(np.eye(A.shape[0])) I Out[4]: matrix([ [1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.] ]) In [8]: A_hat = A + I A_hat * X Out[8]: matrix([ [ 1., -1.], [ 6., -6.], [ 3., -3.], [ 5., -5.]]) 因为节点此刻是其自身的邻人,因此在总结其邻人的特性时会包括该节点的自身特性! 类型化特性暗示通过将连接矩阵A与反度矩阵D相乘,可以通过节点度对特性暗示举办类型化[1]。因此,我们的简化撒播法则如下所示: f(X,A) =DAX让我们看看会产生什么。起首计较次数矩阵。 In [9]: D = np.array(np.sum(A, axis=0))[0] D = np.matrix(np.diag(D)) D Out[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 * A Out[10]: matrix([ [0. , 1. , 0. , 0. ], [0. , 0. , 0.5, 0.5], [0. , 0.5, 0. , 0. ], [0.5, 0. , 0.5, 0. ] ]) (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |