2022年10月7日

图卷积神经网络(GCN)

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

​ 一文让你看懂图卷积神经网络(GCN)!!! - 知乎 (zhihu.com)

​ Graph Convolutional Networks | Thomas Kipf | University of Amsterdam (tkipf.github.io)

原始论文:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL 1609.02907.pdf (arxiv.org)

本篇内容是对本人不了解的知识进行总结

参考的别人的文章就很不错了。不再重复造轮子了。

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

概述

​ 图的结构一般来说是十分不规则的,可以认为是无限维的一种数据,所以它没有平移不变性。每一个节点的

周围结构可能都是独一无二的,这种结构的数据,就让传统的CNN、RNN瞬间失效。所以很多学者从上个世纪就

开始研究怎么处理这类数据了。这里涌现出了很多方法,例如GNN、DeepWalk、node2vec等等,GCN只是其

中一种,这里只讲GCN。

​ GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,只不过它的对象是图数据。

GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类

(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得

图的嵌入表示(graph embedding),可见用途广泛。因此现在人们脑洞大开,让GCN到各个领域中发光发

热。

公式

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

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

这个公式中:

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

这个部分,是可以事先算好的,因为D波浪由A计算而来,而A是我们的输入之一。

论文中的一幅图:

上图中的GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间

的连接关系,即A,都是共享的

GCN作者给出的公式理解:Graph Convolutional Networks | Thomas Kipf | University of Amsterdam (tkipf.github.io)

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

我们的每一层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的一步步推导,我是看不下去

的,大家有兴趣可以自行阅读。

手推一下:

对称归一化拉普拉斯矩阵

转载来源:对称归一化拉普拉斯矩阵的意义 - 知乎 (zhihu.com)

gcn中对邻接矩阵进行对称归一化拉普拉斯标准化一开始是因为图谱论中的一些知识点,理解上很费劲,不过我在

看源代码的时候发现其实可以从标准化层面,很容易的理解对称归一化拉普拉斯变换的实际意义。

A=G.to_adjacency_matrix().todense()
np.fill_diagonal(A,np.ones(A.shape[0])) ## 加入了自环的邻接矩阵
A=pd.DataFrame(A)
A

cora图数据集的邻接矩阵加入自环之后。

A1=A/np.sqrt(A.sum(axis=1))
A2=A1.T/np.sqrt(A.sum(axis=0))
A2=A2.T
A2

对称归一化拉普拉斯矩阵:

下面我们对对称归一化拉普拉斯矩阵的计算过程进行拆解,发现,这不就是做横向和纵向的标准化吗。。只不过多了一个根号

A1=A/A.sum(axis=1)

首先是横向标准化,这一步的意义从深度学习的角度来说是很容易理解的,因为graph中,不同节点之间的edge

的weight差异可能很大,比如节点0和其他节点的edge的weights范围在0~1之间,而节点1和其他节点的

weights范围在100~1000之间,对于金融中通过user之间的交易关系来构建的图尤其如此,交易的金额作为

weights则不同用户之间的交易金额(即edge)权重差异可能非常大。这对于nn的训练来说问题比较大,比如

GCN处理有权图问题,不对邻接矩阵进行横向标准化,则sum之后,不同节点的领域的sum结果量纲差异可能会

很大,比如节点A和领域的edge weights范围在0~1,sum的结果可能也就是10以内,节点B和领域的edge

weights范围在1000~10000,sum的结果就非常大了,这样gnn中做节点非线性变换的dense层会很头疼,难收

敛啊。

那么显然,我们做个横向标准化就可以解决这样的问题了,因为对于GNN来说,我们无非是想学习到所有节点和

领域的某种隐藏的关联模式,而对于不同用户来说,edge weights的绝对大小不重要,相对大小才重要。这和时

间序列预测中的多序列预测问题是一样的,不同商品的销量的绝对值差异很大,但是我们要学习到的是相对的模式

而不是绝对的模式,因此在多序列的时间序列预测问题中也常常会做横向标准化,即将所有商品的销量放缩到大致

相同的区间。

接下来是纵向标准化,纵向标准化相对来说就比较“graph独有”了,

A2=A1.T/A.sum(axis=0)

这里也非常有意思,我们做纵向标准化实际上是希望将节点的领节点对其的“贡献”进行标准化。比如说脉脉上的

用户之间的关注关系就是天然的同构图,假设我们要做节点分类判定某个用户A是不是算法工程师,并且假设A用

户仅仅和另一个算法工程师B以及10个猎头有关注的关系,直观上,猎头对用户A的节点类别的判定的贡献应该是

很小的,因为猎头往往会和算法,开发,测试,产品等不同类型的用户有关联关系,他们对于用户A的“忠诚关联

度”是很低的,而对于算法工程师B而言,假设他仅仅和A有关联, 那么明显,B对A的“忠诚关联度”是很高

的,B的node features以及B和A的关联关系在对A进行节点分类的时候应该是更重要的。

那么,纵向标准化就较好的考虑到了上面的问题,思想很简单,假设节点1和节点2有一个权重为1的edge相连,

节点2和其他1000个节点也有关联,那么节点2对于节点1的贡献度为1/1000,即用edge weights除以节点2的度

(有权图上用加权度)。

而对称归一化拉普拉斯矩阵,实际上是横纵向标准化之后又开了根号,开根号不影响计算结果的相对大小,不改变

实际的物理意义。

因此,对称归一化拉普拉斯矩阵可以看作是对原始的邻接矩阵的一种横纵向标准化。(注:上述的计算是包括了自

环的,不影响理解)

其实在sage,gat之类的gnn中,也是可以引入这样的标准化方法的,总的来说gnn的标准化的三种形式:

1 node features的标准化,这个不用说,和nn训练之前要做标准化一个道理;

2 横向标准化,消除不同节点的edge weights的差异性避免NN训练难收敛的问题;

3 纵向标准化,区别对待节点的领域节点对其的贡献度,“忠诚”的节点贡献度更大,不忠诚的节点贡献度更小。

厉害之处

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

**完全使用随机初始化的参数W,GCN提取出来的特征就以及十分优秀了!**这跟CNN不训练是完全不一样的,后者

不训练是根本得不到什么有效特征的。

我们看论文原文:

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

的embedding,然后可视化:

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

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

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

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

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

杂谈

原论文中的推到证明,我是真不行

不得不说,这最后不给训练直接得到embedding,就完成了自动聚类,也是震惊到我了。

GCN强啊,难怪让看的论文一半GNN相关,一半transform。

图卷积神经网络(GCN)相关推荐

  1. (21) 出行需求预测新视角---基于图卷积神经网络GCN的出租车OD需求预测

    交通预见未来(21): 出行需求预测新视角---基于图卷积神经网络GCN的出租车OD需求预测 1.文章信息 <Origin-Destination Matrix Prediction via G ...

  2. 图卷积神经网络(GCN)综述与实现(PyTorch版)

    图卷积神经网络(GCN)综述与实现(PyTorch版) 本文的实验环境为PyTorch = 1.11.0 + cu113,PyG = 2.0.4,相关依赖库和数据集的下载请见链接. 一.图卷积神经网络 ...

  3. 深入理解图卷积神经网络(GCN)原理

    深入理解图卷积神经网络(GCN)原理 文章目录 深入理解图卷积神经网络(GCN)原理 前言 一.为什么需要GCN 二.GCN的原理 1.图的定义 2.GCN来了 2.1 矩阵计算公式 2.2 以小规模 ...

  4. DeepLearning | 图卷积神经网络(GCN)解析(论文、算法、代码)

    本篇博客主要讲述三种图卷积网络(Graph Convolutional Network, GCN)的算法原理及python实现,全文阅读时间约10分钟. 博主关于图神经网络的文章 DeepLearni ...

  5. 图卷积神经网络GCN大白话解读!

    何时能懂你的心--图卷积神经网络(GCN) https://zhuanlan.zhihu.com/p/71200936 蝈蝈 把知道的讲清楚.公众号SimpleAI,欢迎来逛逛. 已关注 天雨粟 . ...

  6. 图卷积神经网络(GCN)入门

    GCN是从CNN来的 CNN成功在欧式数据上:图像,文本,音频,视频 图像分类,对象检测,机器翻译 CNN基本能力:能学到一些局部的.稳定的结构,通过局部化的卷积核,再通过层级堆叠,将这些局部的结构变 ...

  7. tensorflow lstm 预测_图卷积神经网络GCN与递归结构RNN相结合的时间序列预测

    时间序列预测任务可以按照不同的方法执行.最经典的是基于统计和自回归的方法.更准确的是基于增强和集成的算法,我们必须使用滚动周期生成大量有用的手工特性.另一方面,我们可以使用在开发过程中提供更多自由的神 ...

  8. 图卷积神经网络(GCN)理解与tensorflow2.0代码实现

    图(Graph),一般用 G=(V,E)G=(V,E)G=(V,E) 表示,这里的VVV是图中节点的集合,EEE 为边的集合,节点的个数用NNN表示.在一个图中,有三个比较重要的矩阵: 特征矩阵XXX ...

  9. 【深度学习理论】(5) 图卷积神经网络 GCN

    尽管在过去的几年中,神经网络的兴起与成功应用使得许多目标检测.自然语言处理.语音识别等领域都有了飞跃发展,但是将 RNN 或者GCN这样的深度学习模型拓展到任意结构的图上是一个有挑战性的问题.受限于传 ...

  10. 图卷积神经网络GCN中的关键公式推导---干货

    GCN推导(比较关键的部分) GCN公式推导的时候,需要用到线性代数和傅里叶变换的一些定理, 比如拉普拉斯矩阵是实对称矩阵,其标准化都的数值分布在[0,2]之间 比如傅里叶变换的原理就是多个正弦余弦函 ...

最新文章

  1. 容易混淆的php函数,个人笔记
  2. python 状态码转字典文本_python爬虫 处理521状态码
  3. 常规dll 的接口函数定义+客户端程序接口函数导入
  4. java socket oc_Java Socket编程(三) 服务器Sockets
  5. 成员变量、局部变量、实例变量、静态变量、类变量、常量
  6. struts2中,在使用 convention 插件的情况下,如何使用 “chain” 这个resu
  7. ACdream - 1073 雷霆战机
  8. 第二十三章 宋桓公自行其是讨苦吃 齐桓公连克宋郑震东方
  9. AMD推两款集成CPU和GPU的新FirePro处理器
  10. asp.net师电子化信息库的设计与实现(源代码+论文)ASP.NET汽车销售管理系统的设计与开发(源代码+论文)
  11. 团队组成五个基本要素_团队的5个基本构成要素(5P):目标、定位、计划、职权、人...
  12. 小米9/9 SE于3月19日开放购买!雷军:螺丝刀已备好,百万出货
  13. 洞泾智能机器人产业基地_松江洞泾加快布局人工智能全产业链 腾讯优图创新基地揭牌...
  14. 会声会影2023最新旗舰版下载功能介绍
  15. C#的ListBox加入隐含对象处理手法与Delphi的对比
  16. 陌陌推出“树莓”APP入局种草赛道,如何避免碰瓷“小红薯”?
  17. Django HttpResponse响应
  18. FastVNC(远程协助工具) v1.0
  19. 做FPGA的出路在哪里?——同行的感受,我的方向
  20. Python之Re模块匹配正则表达式详解

热门文章

  1. EMD经验模态分解实例(转C代码)
  2. 大一大学计算机导论论文,大学计算机导论论文3500字_大学计算机导论毕业论文范文模板.doc...
  3. GPU硬件结构和编程模型(源于nvidia的CUDA文档)
  4. 【.NET Core】 hangfire
  5. linux如何判断数组是否为空,Linux fgetcsv取得的数组元素为空字符串的解决方法
  6. Lattice:1、MachXO系列CPLD器件专业名词(缩略语及器件介绍)
  7. 谈谈几种去中心化币币交易所的优缺点
  8. 倍福--ip地址修改
  9. 无线路由器接网线上网的设置方法
  10. 常用传感器-温湿度传感器SHT30