翻译: How to do Deep Learning on Graphs with Graph Convolutional Networks

什么是图卷积网络

图卷积网络是一个在图上进行操作的神经网络。给定一个图\(G=(E,V)\) ,一个GCN的输入包括:

  • 一个输入特征矩阵X,其维度是\(N\times F^0\) ,其中N是节点的数目,\(F^0\)是每个节点输入特征的数目
  • 一个\(N \times N\)的对于图结构的表示的矩阵,例如G的邻接矩阵A

GCN的一个隐藏层可以写成\(H^i=f(H^{i-1},A)\),其中\(H^0=X\)并且\(f\)是一个propagation。每层\(H^i\)对应一个\(N \times F^i\)的特征矩阵,矩阵的每行是一个节点的特征表示。在每层,这些特征通过propagation rule f 聚合起来形成下一层的特征。通过这种方式,特征变得越来越抽象在每一层。在这个框架中,GCN的各种变体仅仅是在propagation rule f 的选择上有不同。

一个简单的 Propagation Rule

一个可能最简单的传播规则是:

\(f(H^{i},A)=\sigma(AH^iW^i)\)

其中\(W^i\)是第i层的权重并且\(\sigma\)是一个非线性激活函数例如ReLU函数。权重矩阵的维度是\(F^i \times F^{i+1}\);也就是说权重矩阵的第二个维度决定了在下一层的特征的数目。如果你对卷积神经网络熟悉,这个操作类似于 filtering operation 因为这些权重被图上节点共享。

简化

让我们在简单的水平上研究 propagation rule 。令:

  • \(i=1,\space s.t. \space f\)是一个输入特征矩阵的函数,
  • \(\sigma\)是恒等函数(Identity function),并且
  • 选择权重矩阵满足\(AH^0W^0=AXW^0=AX\)

也就是说,\(f(X,A)=AX\)。这个传播规则或许太过简单,但是后面我们将会对缺失的部分进行补充。做个旁注,\(AX\) 现在等于一个多层感知机的输入层。

一个简单的例子

我们将使用下面的图作为一个简单的例子:

这个图的邻接矩阵表示是

  1. A = np.matrix([
  2. [0, 1, 0, 0],
  3. [0, 0, 1, 1],
  4. [0, 1, 0, 0],
  5. [1, 0, 1, 0]],
  6. dtype=float
  7. )

接下来,我们需要特征!我们根据每个节点的索引来生成两个整数特征。这会使得后面手动验证矩阵的计算过程更容易。

  1. X = np.matrix([
  2. [i, -i]
  3. for i in range(A.shape[0])
  4. ], dtype=float)

使用 Propagation Rule

好了,现在我们有了一个图,以及它的邻接矩阵A和一个输入特征的集合X。让我们看看当使用传播规则时会发生什么:

  1. In [6]: A * X
  2. Out[6]: matrix([
  3. [ 1., -1.],
  4. [ 5., -5.],
  5. [ 1., -1.],
  6. [ 2., -2.]]

发生了什么,每个节点的表示(每一行)现在等于他的邻居的特征的和!换句话说,图卷积层将每个节点表示成它的邻居的总数。在手动验证的时候注意,一个节点 n 是一个节点 v 的邻居只有在存在一个从 v 到 n 的边时。

即将出现的问题

你可能已经注意到了问题:

  • 一个节点的聚集表示不包括它自己的特征!这个表示只是它的邻居节点特征的聚集,所以只有有一个自循环的节点才会包括它自己的特征在聚集中。
  • 具有很大度数的节点将会有很大的值在它们的特征表示中,而具有很小度数的节点将会有很小的值。这些可能造成梯度消失或者梯度爆炸。这对于随机梯度下降也可能是有问题的,随机梯度下降通常被用来训练这样的网络,而且对于每个输入特征的值的范围是敏感的。

下面,我将分别讨论这些问题

加入 Self-Loops

为了处理第一个问题,我们可以通过简单地给每个节点加入一个自循环。在实践中,这可以通过把单位矩阵 I 加到邻接矩阵 A (在应用传播规则之前)上来实现。

  1. I = np.matrix(np.eye(A.shape[0]))
  2. A_hat = A + I
  1. In [8]: A_hat = A + I
  2. A_hat * X
  3. Out[8]: matrix([
  4. [ 1., -1.],
  5. [ 6., -6.],
  6. [ 3., -3.],
  7. [ 5., -5.]])

因为现在每个节点是自己的邻居,所以节点在计算邻居节点的特征之和的过程中也把自己的特征加进去了。

Normalizing the Feature Representations

特征表示可以通过节点的度来进行归一化,方法是将邻接矩阵 A 转换为 A 和度矩阵D的逆的乘积。因此我们简化的传播规则看起来向这样:

\(f(X,A) = D^{-1}AX\)

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

  1. D = np.array(np.sum(A,axis=0))[0]
  2. D = np.matrix(np.diag(D))
  1. In [9]: D
  2. Out[9]: matrix([
  3. [1., 0., 0., 0.],
  4. [0., 2., 0., 0.],
  5. [0., 0., 2., 0.],
  6. [0., 0., 0., 1.]
  7. ])

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

转换前

  1. A = np.matrix([
  2. [0, 1, 0, 0],
  3. [0, 0, 1, 1],
  4. [0, 1, 0, 0],
  5. [1, 0, 1, 0]],
  6. dtype=float
  7. )

转换后

  1. In [10]: D**-1 * A
  2. Out[10]: matrix([
  3. [0. , 1. , 0. , 0. ],
  4. [0. , 0. , 0.5, 0.5],
  5. [0. , 0.5, 0. , 0. ],
  6. [1. , 0. , 1. , 0. ]
  7. ])

注意到邻接矩阵每行的权重在原来权重的基础上除以对应行的节点的度数。我们在变化后的邻接矩阵上应用传播规则:

  1. In [11]: D**-1 * A * X
  2. Out[11]: matrix([
  3. [ 1. , -1. ],
  4. [ 2.5, -2.5],
  5. [ 0.5, -0.5],
  6. [ 2. , -2. ]
  7. ])

我们将邻居节点特征均值作为节点的表示。

总结

我们现在把自循环和归一化技巧结合起来。另外,我们将再次引入权重和激活函数(这在前面为了简化讨论而省略了)。

加入权重

首先第一件事是应用权重。注意到这里 D_hat 是矩阵 A_hat = A + I 的度矩阵。

  1. In [45]: W = np.matrix([
  2. [1, -1],
  3. [-1, 1]
  4. ])
  5. D_hat**-1 * A_hat * X * W
  6. Out[45]: matrix([
  7. [ 1., -1.],
  8. [ 4., -4.],
  9. [ 2., -2.],
  10. [ 5., -5.]
  11. ])

如果我们想要减少输出特征表示的维度,我们可以减少权重矩阵的规模:

  1. In [46]: W = np.matrix([
  2. [1],
  3. [-1]
  4. ])
  5. D_hat**-1 * A_hat * X * W
  6. Out[46]: matrix([[1.],
  7. [4.],
  8. [2.],
  9. [5.]]
  10. )

加入激活函数

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

  1. In [51]: W = np.matrix([
  2. [1, -1],
  3. [-1, 1]
  4. ])
  5. relu(D_hat**-1 * A_hat * X * W)
  6. Out[51]: matrix([[1., 0.],
  7. [4., 0.],
  8. [2., 0.],
  9. [5., 0.]])

这就是一个带有邻接矩阵,输入特征,权重和激活函数的完整的隐藏层。

回到现实

最后,我们在一个真实的图上应用一个图卷积网络。我将会告诉你怎样去产生特征表示就像我们前面讲的。

Zachary's Karate Club

Zachary's Karate Club 是一个广泛使用的社交网络。其中的节点表示一个空手道俱乐部的成员,而边表示相互之间的关系。当Zachary在研究空手道俱乐部时,在管理员和教员之间产生了矛盾,这使得俱乐部分成了两个部分。下面的图展示了网络的图表示并且节点根据各自的派别作了标记。管理员和教员分别标记为'A' 和 'I'。

构建GCN

现在让我们来建立图卷积网络。事实上我们将不会训练这个网络,而是简单地进行随机初始化来产生特征表示。

How to do Deep Learning on Graphs with Graph Convolutional Networks的更多相关文章

  1. Geometric deep learning on graphs and manifolds using mixture model CNNs

    Monti, Federico, et al. "Geometric deep learning on graphs and manifolds using mixture model CN ...

  2. 论文解读(JKnet)《Representation Learning on Graphs with Jumping Knowledge Networks》

    论文信息 论文标题:Representation Learning on Graphs with Jumping Knowledge Networks论文作者:Keyulu Xu, Chengtao ...

  3. 论文解读(GraphSMOTE)《GraphSMOTE: Imbalanced Node Classification on Graphs with Graph Neural Networks》

    论文信息 论文标题:GraphSMOTE: Imbalanced Node Classification on Graphs with Graph Neural Networks论文作者:Tianxi ...

  4. 论文解读(DropEdge)《DropEdge: Towards Deep Graph Convolutional Networks on Node Classification》

    论文信息 论文标题:DropEdge: Towards Deep Graph Convolutional Networks on Node Classification论文作者:Yu Rong, We ...

  5. Deep Learning 26:读论文“Maxout Networks”——ICML 2013

    论文Maxout Networks实际上非常简单,只是发现一种新的激活函数(叫maxout)而已,跟relu有点类似,relu使用的max(x,0)是对每个通道的特征图的每一个单元执行的与0比较最大化 ...

  6. What are some good books/papers for learning deep learning?

    What's the most effective way to get started with deep learning?       29 Answers     Yoshua Bengio, ...

  7. 基于Deep Learning 的视频识别方法概览

    深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者.互联网视频在最近几年也特别火,短视频.视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器.当这两个火碰在一起,会 ...

  8. deep learning 的综述

    从13年11月初开始接触DL,奈何boss忙or 各种问题,对DL理解没有CSDN大神 比如 zouxy09等 深刻,主要是自己觉得没啥进展,感觉荒废时日(丢脸啊,这么久....)开始开文,即为记录自 ...

  9. A beginner’s introduction to Deep Learning

    A beginner’s introduction to Deep Learning I am Samvita from the Business Team of HyperVerge. I join ...

随机推荐

  1. win10下面opencv安装

    记得以前是安装好的,但是用了conda更新所有包以后,cv2不好用了,试验了很多方法都不管用,最后只能卸载opencv然后重新安装了. 如果电脑上安装了很多版本的python,比如我就安装了pytho ...

  2. winForm入门学习

    Windows窗体 属性: name:对象的名称 windowsState:初始化窗体的大小,Normal,Minimized,Maximized StartPosition:窗体起始位置,Manua ...

  3. Session Timer机制分析

    Session Timer机制分析 功能介绍 会话初始化协议(SIP)并没有为所建立的会话定义存活机制.尽管用户代理可以通过会话特定的机制判断会话是否超时,但是代理服务器却做不到这点.如此一来,代理服 ...

  4. Flutter 38: 图解 Flutter 基本动画 (二)

    小菜前两天学习了以下 Animation 的基本动画,接下来小菜学习以下稍微进阶版的 Animation 动画. 复合动画 小菜前两天学习的主要是基本的单一动画,当然多个动画效果集一身也是毫无问题的, ...

  5. dedeampz 套件关于PHP开启curl方法

    php开启curl方法主要用到三个文件libeay32.dll,php_curl.dll,ssleay32.dll 打开dede的安装目录,更改对应版本PHP中的php.ini文件,在 ; exten ...

  6. ARM体系结构与编程读书笔记——处理器的寄存器

    ARM处理器共有37个寄存器,其中包括: 31个通用寄存器,包括程序计数器(PC)在内,寄存器都是32位: 6个状态寄存器,这些寄存器都是32位的,目前只使用了其中12位: 通用寄存器 可以分为下面3 ...

  7. python错误大全

    1.NameError:name 'Ture' is not defined 这个是名字没有定义,也可能写错了 while True: 2.IndentationError: unindent doe ...

  8. 详解mpstat等性能监测命令的使用

    mpstat是Multiprocessor Statistics的缩写,是实时监控工具,报告与cpu的一些统计信息这些信息都存在/proc/stat文件中,在多CPU系统里,其不但能查看所有的CPU的 ...

  9. mysql 表字段与关键字相同的话

    desc is a reserved keyword (short for DESCENDING in ORDER BY). Enlose it into backticks: INSERT INTO ...

  10. js实现QQ跳转到支付宝APP并领取红包!附:动图demo

    前天我在sg开源了js实现微信跳转到支付宝并领红包的代码.https://segmentfault.com/a/11...于是朋友圈开始刷屏,各种套路,各种标题,再附上短链接,引起了很多人的好奇,然后 ...