【深度学习5】GCN 图卷积神经网络原理

news/2024/7/7 15:12:53

目录

前言

GCN是做什么的

GCN主要思想

数学原理

GCN长什么样

GCN为什么是这个亚子

GCN有多牛

其他关于GCN的点滴

参考文章:

何时能懂你的心——图卷积神经网络(GCN) - 知乎 (zhihu.com)

2020年,我终于决定入门GCN - 知乎 (zhihu.com)

前言

GCN问世已经有几年了(2016年就诞生了),其在非欧式数据上有非常广泛的应用和效果,由于需要对网络负荷节点拓扑分析,故学习GCN的基本原理,考虑利用图聚类方法进行拓扑聚类。

GCN是做什么的

在扎进GCN的汪洋大海前,我们先搞清楚这个玩意儿是做什么的,有什么用。

深度学习一直都是被几大经典模型给统治着,如CNN、RNN等等,它们无论再CV还是NLP领域都取得了优异的效果,那这个GCN是怎么跑出来的?是因为我们发现了很多CNN、RNN无法解决或者效果不好的问题——图结构的数据。

回忆一下,我们做图像识别,对象是图片,是一个二维的结构,于是人们发明了CNN这种神奇的模型来提取图片的特征。CNN的核心在于它的kernel,kernel是一个个小窗口,在图片上平移,通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性:一个小窗口无论移动到图片的哪一个位置,其内部的结构都是一模一样的,因此CNN可以实现参数共享。这就是CNN的精髓所在。

再回忆一下RNN系列,它的对象是自然语言这样的序列信息,是一个一维的结构,RNN就是专门针对这些序列的结构而设计的,通过各种门的操作,使得序列前后的信息互相影响,从而很好地捕捉序列的特征。

上面讲的图片或者语言,都属于欧式空间的数据,因此才有维度的概念,欧式空间的数据的特点就是结构很规则。但是现实生活中,其实有很多很多不规则的数据结构,典型的就是图结构,或称拓扑结构,如社交网络、化学分子结构、知识图谱等等;即使是语言,实际上其内部也是复杂的树形结构,也是一种图结构;而像图片,在做目标识别的时候,我们关注的实际上只是二维图片上的部分关键点,这些点组成的也是一个图的结构。

图的结构一般来说是十分不规则的,可以认为是无限维的一种数据,所以它没有平移不变性。每一个节点的周围结构可能都是独一无二的,这种结构的数据,就让传统的CNN、RNN瞬间失效。所以很多学者从上个世纪就开始研究怎么处理这类数据了。这里涌现出了很多方法,例如GNN、DeepWalk、node2vec等等,GCN只是其中一种,这里只讲GCN,其他的后面有空再讨论。

GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得到图的嵌入表示(graph embedding),可见用途广泛。因此现在人们脑洞大开,让GCN到各个领域中发光发热。

Graph上的任务

节点分类:预测特定节点的类型。
链接预测:预测两个节点是否有联系
社区检测:识别密集联系的节点群落。
网络相似性:两个(子)网络的相似性有多大

节点聚类:将节点无监督学习分成几类

GCN主要思想

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

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

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

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

GCN的神经网络只是一个全连接层: 

数学原理

 后续请参考:GCN图卷积网络入门详解 - 简书 (jianshu.com)

GCN长什么样

GCN的公式看起来还是有点吓人的,论文里的公式更是吓破了我的胆儿。但后来才发现,其实90%的内容根本不必理会,只是为了从数学上严谨地把事情给讲清楚,但是完全不影响我们的理解,尤其对于我这种“追求直觉,不求甚解”之人。

下面进入正题,我们直接看看GCN的核心部分是什么亚子:

假设我们手头有一批图数据,其中有N个节点(node),每个节点都有自己的特征,我们设这些节点的特征组成一个N×D维的矩阵X,然后各个节点之间的关系也会形成一个N×N维的矩阵A,也称为邻接矩阵(adjacency matrix)。X和A便是我们模型的输入。

GCN也是一个神经网络层,它的层与层之间的传播方式是:

这个公式中:

  • A波浪=A+I,I是单位矩阵
  • D波浪是A波浪的度矩阵(degree matrix),公式为 D~ii=∑jA~ij
  • H是每一层的特征,对于输入层的话,H就是X
  • σ是非线性激活函数

我们先不用考虑为什么要这样去设计一个公式。我们现在只用知道: D~−12A~D~−12 这个部分,是可以事先算好的,因为D波浪由A计算而来,而A是我们的输入之一。

所以对于不需要去了解数学原理、只想应用GCN来解决实际问题的人来说,你只用知道:哦,这个GCN设计了一个牛逼的公式,用这个公式就可以很好地提取图的特征。这就够了,毕竟不是什么事情都需要知道内部原理,这是根据需求决定的。

为了直观理解,我们用论文中的一幅图:

上图中的GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间的连接关系,即A,都是共享的

假设我们构造一个两层的GCN,激活函数分别采用ReLU和Softmax,则整体的正向传播的公式为:

最后,我们针对所有带标签的节点计算cross entropy损失函数:

就可以训练一个node classification的模型了。由于即使只有很少的node有标签也能训练,作者称他们的方法为半监督分类

当然,你也可以用这个方法去做graph classification、link prediction,只是把损失函数给变化一下即可。

三、GCN为什么是这个亚子

我前后翻看了很多人的解读,但是读了一圈,最让我清楚明白为什么GCN的公式是这样子的居然是作者Kipf自己的博客:http://tkipf.github.io/graph-convolutional-networks/ 推荐大家一读。

作者给出了一个由简入繁的过程来解释:

我们的每一层GCN的输入都是邻接矩阵A和node的特征H,那么我们直接做一个内积,再乘一个参数矩阵W,然后激活一下,就相当于一个简单的神经网络层嘛,是不是也可以呢?

实验证明,即使就这么简单的神经网络层,就已经很强大了。这个简单模型应该大家都能理解吧,这就是正常的神经网络操作。

但是这个简单模型有几个局限性:

  • 只使用A的话,由于A的对角线上都是0,所以在和特征矩阵H相乘的时候,只会计算一个node的所有邻居的特征的加权和,该node自己的特征却被忽略了。因此,我们可以做一个小小的改动,给A加上一个单位矩阵I,这样就让对角线元素变成1了。
  • A是没有经过归一化的矩阵,这样与特征矩阵相乘会改变特征原本的分布,产生一些不可预测的问题。所以我们对A做一个标准化处理。首先让A的每一行加起来为1,我们可以乘以一个 D−1 ,D就是度矩阵。我们可以进一步把 D−1 拆开与A相乘,得到一个对称且归一化的矩阵: D−1/2AD−1/2 。

通过对上面两个局限的改进,我们便得到了最终的层特征传播公式:

其中 A^=A+I , D^ 为 A^ 的degree matrix。

公式中的 D−1/2AD−1/2 与对称归一化拉普拉斯矩阵十分类似,而在谱图卷积的核心就是使用对称归一化拉普拉斯矩阵,这也是GCN的卷积叫法的来历。原论文中给出了完整的从谱卷积到GCN的一步步推导,我是看不下去的,大家有兴趣可以自行阅读。

四、GCN有多牛

在看了上面的公式以及训练方法之后,我并没有觉得GCN有多么特别,无非就是一个设计巧妙的公式嘛,也许我不用这么复杂的公式,多加一点训练数据或者把模型做深,也可能达到媲美的效果呢。

但是一直到我读到了论文的附录部分,我才顿时发现:GCN原来这么牛啊!

为啥呢?

因为即使不训练,完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了!这跟CNN不训练是完全不一样的,后者不训练是根本得不到什么有效特征的。

我们看论文原文:

然后作者做了一个实验,使用一个俱乐部会员的关系网络,使用随机初始化的GCN进行特征提取,得到各个node的embedding,然后可视化:

可以发现,在原数据中同类别的node,经过GCN的提取出的embedding,已经在空间上自动聚类了。

而这种聚类结果,可以和DeepWalk、node2vec这种经过复杂训练得到的node embedding的效果媲美了

说的夸张一点,比赛还没开始,GCN就已经在终点了。看到这里我不禁猛拍大腿打呼:“NB!”

还没训练就已经效果这么好,那给少量的标注信息,GCN的效果就会更加出色

作者接着给每一类的node,提供仅仅一个标注样本,然后去训练,得到的可视化效果如下:

这是整片论文让我印象最深刻的地方。

看到这里,我觉得,以后有机会,确实得详细地吧GCN背后的数学琢磨琢磨,其中的玄妙之处究竟为何,其物理本质为何。这个时候,回忆起在知乎上看到的各路大神从各种角度解读GCN,例如从热量传播的角度,从一个群体中每个人的工资的角度,生动形象地解释。这一刻,历来痛恨数学的我,我感受到了一丝数学之美,于是凌晨两点的我,打开了天猫,下单了一本正版《数学之美》。哦,数学啊,你真如一朵美丽的玫瑰,每次被你的美所吸引,都要深深受到刺痛,我何时才能懂得你、拥有你?

其他关于GCN的点滴:

  1. 对于很多网络,我们可能没有节点的特征,这个时候可以使用GCN吗?答案是可以的,如论文中作者对那个俱乐部网络,采用的方法就是用单位矩阵 I 替换特征矩阵 X
  2. 我没有任何的节点类别的标注,或者什么其他的标注信息,可以使用GCN吗?当然,就如前面讲的,不训练的GCN,也可以用来提取graph embedding,而且效果还不错。
  3. GCN网络的层数多少比较好?论文的作者做过GCN网络深度的对比研究,在他们的实验中发现,GCN层数不宜多,2-3层的效果就很好了。

http://www.niftyadmin.cn/n/3538192.html

相关文章

ELSE 技术周刊(2018.01.01期)

业界动态 小程序又搞事情,H5 开发的春天来了! 就在刚刚,微信官方公布了几个小程序爆炸性的新闻,在 2017 年的年底,这个新闻似乎是在告诉大家,小程序能做的事越来越多,2018 年你再也没法再忽视它…

【深度学习6】图神经网络库 PyTorch Geometric(PYG)手动安装流程(绝对成功)

目录 PyTorch Geometric简介 安装PyTorch Geometric PyTorch Geometric简介 官方网站:PyG Documentation — pytorch_geometric documentation (pytorch-geometric.readthedocs.io) PyTorch Geometric 中设计了一种新的表示图数据的存储结构,也是 PyT…

UTF-8 UTF-16 UTF-32 比较

优点 UTF-8 兼容 ASCII能适应许多 C 库中的 \0 结尾惯例没有字节序问题良好的多语种支持(相对 GBK 等跟语种绑定的编码方式)以英文和西文符号比较多的场景下(例如 HTML/XML),编码较短由于是变长,字符空间足…

网站logo

2019独角兽企业重金招聘Python工程师标准>>> 网站logo即打开首页时浏览器所展示的网站标志性的图片&#xff1a; 1、ico图片 2、页面<head></head>加入如下代码&#xff0c;一般将图片和首页文件放到同一路径下。 <link rel"shortcut icon&qu…

pytest 失败用例重试

https://www.cnblogs.com/jinzhuduoduo/articles/7017405.html http://www.lxway.com/445949491.htm https://www.cnblogs.com/feiyi211/p/6625841.html 转载于:https://www.cnblogs.com/dieyaxianju/p/8179183.html

【论文精读3】20WWW Structural Deep Clustering Network (SDCN网络图聚类)

参考好文&#xff1a; 图神经网络时代的深度聚类 - 知乎 (zhihu.com) 几篇文献讲解。 深度聚类算法研究综述(A Survey of Deep Clustering Algorithms) - 凯鲁嘎吉 - 博客园 (cnblogs.com) 深度学习聚类大总结包含公式。 【石川 | 北京邮电大学计算机学院教授】图神经网络…

oracle定时器执行一遍就不执行或本就不执行

转&#xff1a;http://blog.csdn.net/qq_23311211/article/details/76283689 以sqlplus/ assysdba进入sql命令模式&#xff0c;使用sql&#xff1a;select value from v$parameter where name like %job_queue_processes% &#xff0c; 看查询结果是否为0&#xff0c;若是或者数…

【深度学习6】对比学习(Contrastive Learning)入门

主要内容&#xff1a; 1. 何为对比 2. 如何构造正负样本 3. 对比学习loss 4. 对比学习loss代码 1. 何为对比 「对比学习」属于无监督学习的一种&#xff0c;即给一堆数据&#xff0c;没有标签&#xff0c;自己学习出一种特征表示。 我们知道的无监督方法有聚类(迭代地更…