在这篇文章中,我们将仔细研究一个名为GCN的著名图神经网络。首先,我们先直观的了解一下它的工作原理,然后再深入了解它背后的数学原理。

>>>>

为什么要用Graph?

许多问题的本质上都是图。在我们的世界里,我们看到很多数据都是图,比如分子、社交网络、论文引用网络。

  图的例子。(图片来自[1])

Graph上的任务

  • 节点分类:预测特定节点的类型。

  • 链接预测:预测两个节点是否有联系

  • 社区检测:识别密集联系的节点群落。

  • 网络相似性:两个(子)网络的相似性有多大?

机器学习的生命周期

在图中,我们有节点特征(代表节点的数据)和图的结构(表示节点如何连接)。

对于节点来说,我们可以很容易地得到每个节点的数据。但是当涉及到图的结构时,要从中提取有用的信息就不是一件容易的事情了。例如,如果2个节点彼此距离很近,我们是否应该将它们与其他对节点区别对待呢?高低度节点又该如何处理呢?其实,对于每一项具体的工作,仅仅是特征工程,即把图结构转换为我们的特征,就会消耗大量的时间和精力。

  图上的特征工程。(图片来自[1])

如果能以某种方式同时得到图的节点特征和结构信息作为输入,让机器自己去判断哪些信息是有用的,那就更好了。

这也是为什么我们需要图表示学习的原因。

  我们希望图能够自己学习 "特征工程"。(图片来自[1])

图卷积神经网络(GCNs)

论文:基于图神经网络的半监督分类(2017)[3]

GCN是一种卷积神经网络,它可以直接在图上工作,并利用图的结构信息。

它解决的是对图(如引文网络)中的节点(如文档)进行分类的问题,其中仅有一小部分节点有标签(半监督学习)。

在Graphs上进行半监督学习的例子。有些节点没有标签(未知节点)。  

主要思想

就像"卷积"这个名字所指代的那样,这个想法来自于图像,之后引进到图(Graphs)中。然而,当图像有固定的结构时,图(Graphs)就复杂得多。

从图像到图形的卷积思想。(图片来自[1])

GCN的基本思路:对于每个节点,我们从它的所有邻居节点处获取其特征信息,当然也包括它自身的特征。假设我们使用average()函数。我们将对所有的节点进行同样的操作。最后,我们将这些计算得到的平均值输入到神经网络中。

在下图中,我们有一个引文网络的简单实例。其中每个节点代表一篇研究论文,同时边代表的是引文。我们在这里有一个预处理步骤。在这里我们不使用原始论文作为特征,而是将论文转换成向量(通过使用NLP嵌入,例如tf-idf)。NLP嵌入,例如TF-IDF)。

让我们考虑下绿色节点。首先,我们得到它的所有邻居的特征值,包括自身节点,接着取平均值。最后通过神经网络返回一个结果向量并将此作为最终结果。

GCN的主要思想。我们以绿色节点为例。首先,我们取其所有邻居节点的平均值,包括自身节点。然后,将平均值通过神经网络。请注意,在GCN中,我们仅仅使用一个全连接层。在这个例子中,我们得到2维向量作为输出(全连接层的2个节点)。

在实际操作中,我们可以使用比average函数更复杂的聚合函数。我们还可以将更多的层叠加在一起,以获得更深的GCN。其中每一层的输出会被视为下一层的输入。

2层GCN的例子:第一层的输出是第二层的输入。同样,注意GCN中的神经网络仅仅是一个全连接层(图片来自[2])。

让我们认真从数学角度看看它到底是如何起作用的。

直观感受和背后的数学原理

首先,我们需要一些注解

我们考虑图G,如下图所示。

从图G中,我们有一个邻接矩阵A和一个度矩阵D。同时我们也有特征矩阵X。

那么我们怎样才能从邻居节点处得到每一个节点的特征值呢?解决方法就在于A和X的相乘。

看看邻接矩阵的第一行,我们看到节点A与节点E之间有连接,得到的矩阵第一行就是与A相连接的E节点的特征向量(如下图)。同理,得到的矩阵的第二行是D和E的特征向量之和,通过这个方法,我们可以得到所有邻居节点的向量之和。

计算 "和向量矩阵 "AX的第一行。

  • 这里还有一些需要改进的地方。

  1. 我们忽略了节点本身的特征。例如,计算得到的矩阵的第一行也应该包含节点A的特征。

  2. 我们不需要使用sum()函数,而是需要取平均值,甚至更好的邻居节点特征向量的加权平均值。那我们为什么不使用sum()函数呢?原因是在使用sum()函数时,度大的节点很可能会生成的大的v向量,而度低的节点往往会得到小的聚集向量,这可能会在以后造成梯度爆炸或梯度消失(例如,使用sigmoid时)。此外,神经网络似乎对输入数据的规模很敏感。因此,我们需要对这些向量进行归一化,以摆脱可能出现的问题。

在问题(1)中,我们可以通过在A中增加一个单位矩阵I来解决,得到一个新的邻接矩阵Ã。

取lambda=1(使得节点本身的特征和邻居一样重要),我们就有Ã=A+I,注意,我们可以把lambda当做一个可训练的参数,但现在只要把lambda赋值为1就可以了,即使在论文中,lambda也只是简单的赋值为1。

通过给每个节点增加一个自循环,我们得到新的邻接矩阵

对于问题(2): 对于矩阵缩放,我们通常将矩阵乘以对角线矩阵。在当前的情况下,我们要取聚合特征的平均值,或者从数学角度上说,要根据节点度数对聚合向量矩阵ÃX进行缩放。直觉告诉我们这里用来缩放的对角矩阵是和度矩阵D̃有关的东西(为什么是D̃,而不是D?因为我们考虑的是新邻接矩阵Ã 的度矩阵D̃,而不再是A了)。

现在的问题变成了我们要如何对和向量进行缩放/归一化?换句话说:

我们如何将邻居的信息传递给特定节点?我们从我们的老朋友average开始。在这种情况下,D̃的逆矩阵(即,D̃^{-1})就会用起作用。基本上,D̃的逆矩阵中的每个元素都是对角矩阵D中相应项的倒数。

例如,节点A的度数为2,所以我们将节点A的聚合向量乘以1/2,而节点E的度数为5,我们应该将E的聚合向量乘以1/5,以此类推。

因此,通过D̃取反和X的乘法,我们可以取所有邻居节点的特征向量(包括自身节点)的平均值。

到目前为止一切都很好。但是你可能会问加权平均()怎么样?直觉上,如果我们对高低度的节点区别对待,应该会更好。

 但我们只是按行缩放,但忽略了对应的列(虚线框)。 

为列增加一个新的缩放器。

新的缩放方法给我们提供了 "加权 "的平均值。我们在这里做的是给低度的节点加更多的权重,以减少高度节点的影响。这个加权平均的想法是,我们假设低度节点会对邻居节点产生更大的影响,而高度节点则会产生较低的影响,因为它们的影响力分散在太多的邻居节点上。

在节点B处聚合邻接节点特征时,我们为节点B本身分配最大的权重(度数为3),为节点E分配最小的权重(度数为5)。

因为我们归一化了两次,所以将"-1 "改为"-1/2"

例如,我们有一个多分类问题,有10个类,F  被设置为10。在第2层有了10个维度的向量后,我们将这些向量通过一个softmax函数进行预测。

Loss函数的计算方法很简单,就是通过对所有有标签的例子的交叉熵误差来计算,其中Y_{l}是有标签的节点的集合。

层的数量

 #layers的含义 

层数是指节点特征能够传输的最远距离。例如,在1层的GCN中,每个节点只能从其邻居那里获得信息。每个节点收集信息的过程是独立进行的,对所有节点来说都是在同一时间进行的。

当在第一层的基础上再叠加一层时,我们重复收集信息的过程,但这一次,邻居节点已经有了自己的邻居的信息(来自上一步)。这使得层数成为每个节点可以走的最大跳步。所以,这取决于我们认为一个节点应该从网络中获取多远的信息,我们可以为#layers设置一个合适的数字。但同样,在图中,通常我们不希望走得太远。设置为6-7跳,我们就几乎可以得到整个图,但是这就使得聚合的意义不大。

例:收集目标节点 i 的两层信息的过程

GCN应该叠加几层?

在论文中,作者还分别对浅层和深层的GCN进行了一些实验。在下图中,我们可以看到,使用2层或3层的模型可以得到最好的结果。此外,对于深层的GCN(超过7层),反而往往得到不好的性能(虚线蓝色)。一种解决方案是借助隐藏层之间的残余连接(紫色线)。

不同层数#的性能。图片来自论文[3]

做好笔记

  • GCNs用于图上的半监督学习。

  • GCNs同时使用节点特征和结构进行训练

  • GCN的主要思想是取所有邻居节点特征(包括自身节点)的加权平均值。度低的节点获得更大的权重。之后,我们将得到的特征向量通过神经网络进行训练。

  • 我们可以堆叠更多的层数来使GCN更深。考虑深度GCNs的残差连接。通常,我们会选择2层或3层的GCN。

  • 数学笔记:当看到对角线矩阵时,要想到矩阵缩放。

  • 这里有一个使用StellarGraph库的GCN演示[5]。该仓库还提供了许多其他GNN的算法。

论文作者的说明

该框架目前仅限于无向图(加权或不加权)。但是,可以通过将原始有向图表示为一个无向的两端图,并增加代表原始图中边的节点,来处理有向边和边特征。

下一步是什么呢

对于GCN,我们似乎可以同时利用节点特征和图的结构。然而,如果图中的边有不同的类型呢?我们是否应该对每种关系进行不同的处理?在这种情况下如何聚合邻居节点?最近有哪些先进的方法?

在图专题的下一篇文章中,我们将研究一些更复杂的方法。

如何处理边的不同关系(兄弟、朋友、......)?

参考文献

[1] Excellent slides on Graph Representation Learning by Jure Leskovec (Stanford): https://drive.google.com/file/d/1By3udbOt10moIcSEgUQ0TR9twQX9Aq0G/view?usp=sharing

[2] Video Graph Convolutional Networks (GCNs) made simple: https://www.youtube.com/watch?v=2KRAOZIULzw

[3] Paper Semi-supervised Classification with Graph Convolutional Networks (2017): https://arxiv.org/pdf/1609.02907.pdf

[4] GCN source code: https://github.com/tkipf/gcn

[5] Demo with StellarGraph library: https://stellargraph.readthedocs.io/en/stable/demos/node-classification/gcn-node-classification.html

—THE END—

编辑 ∑Gemini

来源:雷锋网

文章推荐

☞最全数学各个分支简介

☞十大中国数学之最

☞数学和编程

☞机器学习中需要了解的 5 种采样方法

☞北大读博手记:怎样完成自己的博士生涯?非常具有指导性!

☞施一公:为什么要独立思考、为什么要尊重科学?

GCN图卷积网络入门详解相关推荐

  1. gcn 图卷积神经网络_GCN图卷积网络入门详解

    字幕组双语原文:[GCN]图卷积网络(GCN)入门详解 英语原文:Graph Convolutional Networks (GCN) 翻译:听风1996.大表哥 在这篇文章中,我们将仔细研究一个名为 ...

  2. SGC - Simplifying Graph Convolutional Networks 简化的图卷积网络 论文详解 ICML 2019

    文章目录 1 相关介绍 1.1 Simple Graph Convolution (SGC)提出的背景 1.2 SGC效果 2 Simple Graph Convolution 简化的图卷积 2.1 ...

  3. 通俗易懂:图卷积神经网络入门详解

    作者 | 蝈蝈 来源 | 转载自知乎用户蝈蝈 [导读]GCN问世已经有几年了(2016年就诞生了),但是这两年尤为火爆.本人愚钝,一直没能搞懂这个GCN为何物,最开始是看清华写的一篇三四十页的综述,读 ...

  4. 图卷积神经网络入门详解

    图卷积缘起 在开始正式介绍图卷积之前,我们先花一点篇幅探讨一个问题:为什么研究者们要设计图卷积操作,传统的卷积不能直接用在图上吗? 要理解这个问题,我们首先要理解能够应用传统卷积的图像(欧式空间)与图 ...

  5. GCN图卷积网络 | 介绍

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

  6. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  7. 【图结构】之图注意力网络GAT详解

    作者:張張張張 github地址:https://github.com/zhanghekai [转载请注明出处,谢谢!] GATGATGAT源代码地址:https://github.com/Petar ...

  8. 神经网络学习笔记4——GNN图神经和GCN图卷积网络

    系列文章目录 博客依托于国外GNN综述 结合沐神视频 文章目录 系列文章目录 图神经 一.图是什么? 二.机器学习中使用图 1.邻接矩阵的表达 2.GNN 1.独自更新 2.VE交互更新 3.UVE交 ...

  9. FCN(全卷积网络)详解

    FCN详解 全卷积网络就是在全连接网络的基础上,通过用卷积网络替换全连接网络得到的. 首先看一下什么是全连接网络,以及全连接网络的缺点. 通常的CNN网络中,在最后都会有几层全连接网络来融合特征信息, ...

最新文章

  1. Matlab2013a安装简单教程以及遇到的问题解决(反复提示激活问题)
  2. css3 自定义滚动条样式
  3. 面向对象是软件开发范式的根本性颠覆: 主体建模, 非目标导向, 松耦合, 非逻辑分解, 软件进化...
  4. NeurIPS 2021 | 图上不均衡表示学习新视野:基于拓扑结构的不均衡学习
  5. 计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力
  6. redis 可视化工具_自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer...
  7. cannot import name 'NPCAP_PATH'
  8. php智能文章相关性匹配,PHP中的Pearson相关性
  9. 便宜制作服务器,组建私有云:除了购买NAS服务器外试试自己手工打造吧!
  10. 百度大脑iOCR助力财务报销智能化,省时省力
  11. b B KB MB GB TB 之间的关系与换算
  12. 使用keytool工具常用证书转换
  13. 【51】PWM控制使用
  14. 《CCNP安全Secure 642-637认证考试指南》——8.8节填空
  15. 科班腾讯阿里云的高质量面试题
  16. Qt Central Widget
  17. JavaWeb 利用poi导出下拉框excel模版
  18. JavaScript商品详情介绍
  19. java+mybatis 数据统计每天/月 并补全日期
  20. 不会时间序列预测?不要紧,大神来教你

热门文章

  1. java treeset比较,java中TreeSet的两种排序比较的方式
  2. C++学习之路 | PTA乙级—— 1059 C语言竞赛 (20 分)(精简)
  3. C++学习之路 | PTA乙级—— 1006 换个格式输出整数 (15分)(精简)
  4. webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段
  5. google账号解除游戏绑定_成长守护平台解除实名认证 公众号解绑操作流程
  6. 六、区块链主流共识算法浅析
  7. 编程之美 - 哪个题目最美?
  8. JAVA入门级教学之(深入throws的异常抛出机制)
  9. mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询
  10. 用python实现打开虚拟机_如何使用python从虚拟机读取文件