前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图卷积网络图深度学习(下)

图卷积网络图深度学习(下)

作者头像
AiTechYun
发布2019-10-31 12:11:56
8000
发布2019-10-31 12:11:56
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
编辑 | sunlei 发布 | ATYUN订阅号

在上一部分,我们了解了图卷积网络的概念和它的传播规则,今天我们继续学习以下内容:

前文回顾:图卷积网络图深度学习(上)

规范化特性表示

通过将邻接矩阵A与D[1]的逆矩阵相乘,可以通过节点度对特征表示进行规范化[1]。因此,我们的简化传播规则如下所示:

f(X, A) = D⁻¹AX

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

代码语言:javascript
复制
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.]
             ])

在应用这条规则之前,让我们看看在转换邻接矩阵之后会发生什么。

之前

代码语言:javascript
复制
A = np.matrix([
       [0, 1, 0, 0],
       [0, 0, 1, 1], 
       [0, 1, 0, 0],
       [1, 0, 1, 0]],
       dtype=float
)

之后

代码语言:javascript
复制
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. ]
])

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

代码语言:javascript
复制
In [11]: D**-1 * A * X
Out[11]: matrix([
                     [ 1. , -1. ],
                     [ 2.5, -2.5],
                     [ 0.5, -0.5],
                     [ 2. , -2. ]
               ])

得到与相邻节点特征均值对应的节点表示。这是因为(转换的)邻接矩阵中的权重对应于邻接节点特征的加权和中的权重。我再次鼓励您亲自验证这一观察结果。

把所有的东西放在一起

我们现在结合了自循环和规范化技巧。此外,我们将重新引入我们先前丢弃的权重和激活函数,以简化讨论。

把权重加回去

首先要做的是运用权重。注意,这里D_hat是A_hat = A + I的次数矩阵,即,具有强制自循环的A的度矩阵。

代码语言:javascript
复制
In [45]: W = np.matrix([
                   [1, -1],
                   [-1, 1]
             ])
              D_hat**-1 * A_hat * X * W
Out[45]: matrix([
                    [ 1., -1.],
                    [ 4., -4.],
                    [ 2., -2.],
                    [ 5., -5.]
             ])

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

代码语言:javascript
复制
In [46]: W = np.matrix([
                   [1],
                   [-1]
            ])
            D_hat**-1 * A_hat * X * W
Out[46]: matrix([[1.],
             [4.],
             [2.],
             [5.]]
)

添加激活函数

我们选择保留特征表示的维数,并应用ReLU激活函数。

代码语言:javascript
复制
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”标记。

建立GCN

现在让我们建立图卷积网络。我们实际上不会训练网络,只是随机初始化它,以生成我们在本文开头看到的特性表示。我们将使用networkx,它有一个容易获得的俱乐部的图形表示,并计算A_hat和D_hat矩阵。

代码语言:javascript
复制
from networkx import karate_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 + I
D_hat = np.array(np.sum(A_hat, axis=0))[0]
D_hat = np.matrix(np.diag(D_hat))

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

代码语言:javascript
复制
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层。这里我们只使用身份矩阵作为特征表示,即每个节点被表示为一个热编码的分类变量。

代码语言:javascript
复制
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

我们提取特征表示。

代码语言:javascript
复制
feature_representations = {
      node: np.array(output)[node] 
      for node in zkc.nodes()}

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

zachary空手道俱乐部节点的特征表示

我应该注意到,在这个示例中,由于ReLU函数的作用,随机初始化的权重很可能在x轴或y轴上给出0个值,因此需要进行一些随机初始化才能生成上面的图。

结论

在这篇文章中,我对图卷积网络做了一个高级的介绍,并说明了GCN中每一层节点的特征表示是如何基于其邻域的集合的。我们看到了如何使用numpy构建这些网络,以及它们的强大功能:即使是随机初始化的GCNs,也可以将Zachary空手道俱乐部中的社区分开。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 规范化特性表示
  • 之前
  • 之后
  • 把权重加回去
  • 添加激活函数
  • Zachary空手道俱乐部
  • 建立GCN
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档