文章目录

  • 原标题:如何用图卷积网络在图上进行深度学习

    • 第一部分 图卷积网络的高级介绍

      • 图卷积网络是什么?

        • 一个简单的传播规则

          • 简化
          • 一个简单的图
          • 应用传播规则
        • 问题来了!!
          • 添加自环
          • 特征表示归一化
        • 合并
          • 添加权重
          • 添加激活函数
        • 回归现实
          • Zachary’s Karate Club
          • 构建GCN
        • 结论
        • 参考文献

原标题:如何用图卷积网络在图上进行深度学习

第一部分 图卷积网络的高级介绍

在图上进行机器学习是一项困难的任务,因为它的复杂性很高,同时也是由于信息丰富的图结构。这篇文章是关于如何用图卷积网络(GCNs)对图进行深度学习的系列文章中的第一篇。GCNs是一种强大的神经网络,旨在直接处理图并利用它们的结构信息。

在这篇文章中,我将介绍GCNS,并通过编码示例说明如何通过GCN的隐藏层传播信息。我们将看到GCN如何从前面的层聚合信息,以及这种机制如何生成图中节点的有用的特征表示。

图卷积网络是什么?

GCNs是一种非常强大的在图上进行机器学习的神经网络框架。事实上,它们是如此强大,以至于即使是随机初始化的2层GCN也可以生成网络中节点的有用的特征表示。下图显示了这样一个GCN是如何生成一个网络中每个节点的二维表示的,它可以在不经过任何训练的情况下保持它们在网络中的相对接近性。

一个简单的图

下面的图是一个简单的例子:

上图的邻接矩阵为:

A = np.matrix([
[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 1, 0, 0],
[1, 0, 1, 0]],
dtype=float
)

(注:上图是一个有向无权图,边可以是单方向的,如 0→1,可以也是双向的,如 1←→2;图的邻接矩阵表示了图中的连接情况,如上面的矩阵中,第一行就表示第一个节点(对应图中的 0号节点,简称节点0,下同)的连边情况,其中第二个元素为1表示有一条从第一个节点指向第二个节点(节点1)的边,没有边则对应元素为0;注意本例中只将从某节点出发指向其他节点的边表示在邻接矩阵中,从其他节点指向该节点的边不表示,默认为0,如 3→0 在矩阵中对应的元素为第四行第一列,而第一行第四列元素为0,换句话说,节点0是节点3的邻居节点,但是节点3却不是节点0的邻居节点,节点0只有一个邻居节点就是节点1.)

接下来,我们需要特征!我们根据每个节点的索引为其生成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的邻居。(注:如第二行元素为5,就是节点1的两个邻居节点2和3的特征值之和.)

问题来了!!

可能你已经发现了问题:

  • 节点的聚合表示不包括它自己的特征!这个表示只是其邻居节点特征的集合,因此只有具有自环的节点才会在聚合中包含自己的特征(除非节点具有自环)。[1]
  • 大度的节点在特征表示中会有较大的值,而小度的节点将具有较小的值。这可能导致渐变[1, 2]消失或爆炸,但随机梯度下降算法也有问题,这些算法通常用于训练这类网络,并且对每个输入特征的尺度(或取值范围)敏感。

(注:自环指某节点有自己指向自己的边;在简单有向图中,度表示从某节点出发的边数,或者说其邻居节点的个数.)

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

添加自环

为了解决第一个问题,可以简单地向每个节点[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 + IA_hat * X
Out[8]: matrix([[ 1., -1.],[ 6., -6.],[ 3., -3.],[ 5., -5.]])

由于节点现在成了自己的邻居,所以在加和其邻居节点的特征时,节点本身的特征也包括在内!

特征表示归一化

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

(注:节点的度矩阵是一个对角矩阵,对角线上元素即为该节点的邻居节点个数.)

看看会发生什么。先计算下度矩阵。

In [9]: D = np.array(np.sum(A, axis=1))    # 原文此处是按照列求和,计算得到的是入度矩阵;实际上根据上文的邻接矩阵,应该是按照行求和,得到出度矩阵,才符合题意,故后文都是采用出度矩阵进行计算,计算结果与原文稍有出入D = [x[0] for x in D]  D = np.matrix(np.diag(D))D
Out[9]: matrix([[1., 0., 0., 0.],[0., 2., 0., 0.],[0., 0., 1., 0.],[0., 0., 0., 2.]])

在应用这个规则前,我们先看看对邻接矩阵 A进行变换后发生了什么。

# Before
A = np.matrix([[0, 1, 0, 0],[0, 0, 1, 1], [0, 1, 0, 0],[1, 0, 1, 0]],dtype=float
)
# After
In [10]: D**-1 * A
Out[10]: matrix([[0. , 1. , 0. , 0. ],[0. , 0. , 0.5, 0.5],[0. , 1. , 0. , 0. ],[0.5, 0. , 0.5, 0. ]
])

观察到邻接矩阵的每一行中的权重(值)已被对应行的节点的度除了。我们再对变换后的邻接矩阵应用传播规则。

In [11]: D**-1 * A * X
Out[11]: matrix([[ 1. , -1. ],[ 2.5, -2.5],[ 1. , -1. ],[ 1. , -1. ]])

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

合并

我们现在将自环和归一化操作结合起来。此外,为了简化讨论,我们将重新引入先前丢弃的权重和激活函数。

添加权重

第一要务是运用权重。请注意,这里 D_hat是 A_hat=A+I的度矩阵,也就是具有自环的 A 的度矩阵。

In [45]: W = np.matrix([[1, -1],[-1, 1]])D_hat**-1 * A_hat * X * W
Out[45]: matrix([[ 1., -1.],[ 4., -4.],[ 3., -3.],[ 3.333333, -3.333333]])

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

In [46]: W = np.matrix([[1],[-1]])D_hat**-1 * A_hat * X * W
Out[46]: matrix([[1.],[4.],[3.],[3.333333]]
)

添加激活函数

我们选择保留特征表示的维数,并应用 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.],[3., 0.],[3.333333, 0.]])

瞧!一个完整的隐藏层,包含邻接矩阵、输入特征、权重和激活功能!

回归现实

最后,我们可以在真实的图上应用一个图卷积网络。我将向你们展示如何生成在文章前面出现的这种特征表示。

Zachary’s Karate Club

Zachary的空手道俱乐部是一个常用的社交网络,节点代表空手道俱乐部的成员,边表示其相互之间的关系。当Zachary在研究空手道俱乐部时,管理员和教练之间发生了冲突,导致俱乐部分裂成两半。下面显示了该网络的图表示,并根据节点属于俱乐部的哪个部分做了标记。管理员和教练分别用 A和 I 标记。

构建GCN

现在我们来建立图卷积网络。实际上我们不会训练网络,而只是随机地初始化它,以产生我们在这篇文章开始时看到的特征表示。我将使用Networkx(python中专门为复杂网络和图论研究开发的第三方库),它可以很方便地表示俱乐部的图结构,并计算 A_hat和 D_hat 矩阵。

from networkx import to_numpy_matrix
zkc = 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=1))
D_hat = [x[0] for x in D_hat]
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层。这里我们只使用单位矩阵作为特征表示,即每个节点被表示为一个独热编码(one-hot encoded)的分类变量。

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

提取特征表示

feature_representations = {node: np.array(output)[node] for node in zkc.nodes()}

瞧!特征表示将Zachary空手道俱乐部中的社团清楚地区分开了。我们还没开始训练呢!

(注:在网络科学中,社团一般指网络中内部连接紧密外部连接稀疏的子网络;上图中,两个社团用不同的颜色表示出来,可以看到,两种颜色已经在很大程度上分离开了.)

应该注意到,在这个例子中,随机初始化权重很可能在x或y轴上出现0值,这是ReLU函数的结果,所以需要一些随机初始化来生成上面的数字。

结论

在这篇文章中,我给出了图卷积网络的高级介绍,并说明了GCN中每一层节点的特征表示是如何基于其邻域聚合的。我们看到了如何使用Numpy建立这些网络,以及它们的强大:即使是随机初始化的GCNs,也可以将Zachary空手道俱乐部中的社团分开。

在下一篇文章中,我将深入探讨一些技术细节,并介绍一些最近发表的GCNs。

参考文献

[1] Blog post on graph convolutional networks by Thomas Kipf.
[2] Paper called Semi-Supervised Classification with Graph Convolutional Networks by Thomas Kipf and Max Welling.

图卷积网络详细介绍(一)相关推荐

  1. 轻量级图卷积网络LightGCN介绍和构建推荐系统示例

    来源:DeepHub IMBA 本文约4500字,建议阅读9分钟 今天介绍的这个模型被称作:Light Graph Convolution Network 或 LightGCN¹. 推荐系统是当今业界 ...

  2. 图卷积网络(Graph Convolutional Networks, GCN)详细介绍

    本文翻译自博客. 在这篇博文中会为大家详细地介绍目前使用广泛的图神经网络--图卷积网络(Graph Convolutional Networks, GCN)的相关知识.首先将带领大家直觉上感受其工作原 ...

  3. 图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导

    文章目录 1. 为什么会出现图卷积神经网络? 2. 图卷积网络的两种理解方式 2.1 vertex domain(spatial domain):顶点域(空间域) 2.2 spectral domai ...

  4. GCN图卷积网络 | 介绍

    目录 0 前言 1 基于空间域的GCN[2] 2 基于谱域的GCN 2.1拉普拉斯矩阵 2.2为什么GCN要用拉普拉斯矩阵? 2.3 拉普拉斯矩阵的谱分解(特征分解) 2.4卷积的定义 2.5傅里叶变 ...

  5. Survey | 基于图卷积网络的药物发现方法

    本期介绍2019年6月发表在Briefings in Bioinformatics的综述,该综述由康奈尔大学等机构的研究人员撰写,系统总结了GCN及其在药物发现方面的最新进展,重点是与药物相关的应用: ...

  6. 【GCN】图卷积网络(GCN)入门详解

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 Don.hub 单位 | 京东算法工程师 学校 | 帝国理工大学 图卷积网络(GCN)入门详解 什么是GCN GCN 概述 模型定义 数学推导 G ...

  7. LightGCN:用于推荐任务的简化并增强的图卷积网络 SIGIR 2020

    论文链接:https://arxiv.org/abs/2002.02126 代码链接:https://github.com/gusye1234/LightGCN-PyTorch 论文来源:SIGIR ...

  8. (18) 基于时空多图卷积网络的网约车需求预测

    交通预见未来(18): 基于时空多图卷积网络的网约车需求预测 1.文章信息 <Spatiotemporal Multi-Graph Convolution Network for Ride-ha ...

  9. (24) T-GCN-时间图卷积网络用于交通预测

    交通预见未来(24): T-GCN-时间图卷积网络用于交通预测 1.文章信息 <T-GCN: A Temporal Graph Convolutional Network for Traffic ...

  10. 【论文翻译】HCGN:面向集体分类的异构图卷积网络深度学习模型

    HCGN:面向集体分类的异构图卷积网络深度学习模型 摘要 集合分类是研究网络数据的一项重要技术,旨在利用一组具有复杂依赖关系的互联实体的标签自相关性.随着各种异构信息网络的出现,集合分类目前正面临着来 ...

最新文章

  1. [原]VS2012编译GLEW 1.11
  2. R语言应用实战系列(二)-基于R语言的方差分析
  3. java基础系列:集合入门
  4. oracle 中序号的一种生成方式
  5. Foundation框架中常用类的介绍
  6. struts2异常处理
  7. LeetCode 982. 按位与为零的三元组(位运算+计数)
  8. R统计绘图 - 热图美化
  9. 如何修复Mac清倒废纸篓提示“操作无法完成,因为该项目正在使用中”
  10. 武汉理工计算机学院分数线,武汉理工今年计算机分数线
  11. 白皮书 | 以太坊 (Ethereum ):下一代智能合约和去中心化应用平台
  12. 微软开发趣史 | 我们之所以叫它 RAID 是因为它能干掉 BUG
  13. C++ 析构函数不要抛出异常
  14. python画散点图-python学习之matplotlib绘制散点图实例
  15. CSS学习总结(4)——盒模型/背景属性
  16. WIN7系统下如何把IE8升级成IE9
  17. 2.2.7Python-异常处理
  18. 【小米助手备份】-----找回微信聊天记录
  19. 2022年上海市安全员C证考试试题模拟考试平台操作
  20. mysql基础之多表练习题

热门文章

  1. 任务管理器杀不了的进程如何关闭
  2. 24小时从0到1开发阴阳师小程序
  3. 分布式与集群的联系与区别
  4. Linux 防火墙配置
  5. 间距margin、padding - bootStrap4常用CSS笔记
  6. HDU 3339 In Action(最短路+背包)题解
  7. 智能戒指,一个新鲜智能穿戴产物
  8. C# Conditional(方法,属性的忽略)使用
  9. Python远程连接Windows,并调用Windows命令(类似于paramiko)
  10. HDU 3622 Bomb Game(2-sat)