本文是跟着李沐老师的论文精度系列进行GNN的学习的,详细链接请见:零基础多图详解图神经网络(GNN/GCN)【论文精读】

该论文的标题为《A Gentle Introduction to Graph Neural Networks》,是对GNN的简介。那么论文的第一张图呢把鼠标放上去某一个结点将会表示出该节点的生成过程,可以看到放于Layer1中的某个节点时,它是由Layer2中的多个节点生成,而Layer2中的这些结点又有Layer3的部分节点生成,因此只要层次够深,那么一个节点就可以处理原始大片节点的信息

图这种数据结构在当前随处可见,因此图神经网络如果能够发挥对图这种结构的良好处理能力,将会有很广泛的应用场景,例如药物的生成、车流量检测、推荐系统、人物关系等等。

文章的主要内容分为四块,分别是

  • 什么样的数据结构可以表示为图
  • 图和别的数据结构的区别在哪,为什么要用图神经网络
  • 构建一个GNN查看内部各模块的内容
  • 提供一个GNN的操作平台

1、什么是图

图实际上就是表示实体(顶点)的信息以及它们之间的连接关系(边)。而图的节点所包含的信息、边表达的信息、以及整个图表达的信息都可以用向量来表示。因此就存在三种向量。

而图又分为有向图和无向图,如下:

那么数据如何表示为图呢?

1.1 图片表示为图

如果将每个像素点看成一个顶点,而邻接的关系看成图中的边的,那么就可以用邻接矩阵来表示这个图像了,如下:

在图中我们可以看到,最左边的图呢代表每个像素它的位置,两位数字分别代表行和列,那么它旁边的那些像素总共有8个和它靠近,那么在第三张图中就有8的顶点和它存在边的连接。而如何将第三张图表示成数据呢,就是用邻接矩阵,可以看到邻接矩阵的行和列每个元素都是一个顶点,如果顶点和顶点之间存在边的关系那么将会在矩阵的对应位置用蓝色的点进行标注。因此我们就将图片表示成了一个图,再用邻接矩阵这种结构来表示图了。

1.2 文本表示为图

文本可以看成一个序列,将每个单词看成一个顶点,而相邻的单词可以看成存在有向边的连接,再用邻接矩阵来表示,如下:

1.3 其他数据结构表示为图

例如咖啡因分子:

人物关系图:

空手道道馆中老师与学生的关系图:

等等。

1.4、数据表示成图后存在哪些问题

图上的问题大致上可以分为三类,第一类是关于整个图的任务,第二类是关于图中的顶点的任务,第三类任务是关于图中的边的任务。

  • 关于整个图的任务

    例如我们将分子的结构表示成图之后,我们要识别该图中是否有两个环,那么我们就可以做成一个分类任务:

  • 关于顶点的属性判断的任务

    对顶点进行划分,划分成两类,例如上述提到的空手道老师的任务,两位老师因为意见不合而决裂,那么我们所有的学生都要做出选择哪位老师的任务,因此就是对顶点的类型进行分类的任务:

  • 关于边的属性判断的任务

    例如在下图中,先对各种元素进行提取成顶点,然后判断各个顶点之间是什么关系,例如观看、攻击等等:

也就是对一个图中的边的属性进行划分:

1.5、将机器学习用于图模型中将会有什么挑战

首先,前面说到的图的信息、顶点的信息、边的信息可以用向量来表示,这对于神经网络是由友好的。但是关于各个顶点之间的连接性应该怎么表达是一个大问题。而我们前面提到邻接矩阵,首先它所占用的空间会非常大,其次对于这种稀疏矩阵的高效处理也是一个很大的问题,再者如果我们将矩阵中的某些列或者某些行进行交换,是不会影响邻接矩阵所表示的含义的,如下图:

或者看下面这个例子,对于四个顶点的图可以有这么多可能的邻接矩阵:

这就需要我们保证我们的网络也能够在应对这样的变化时做出相同的决策。

那么我们可以用到如下这种数据结构来表示:

对于每个顶点和每条边,我们都可以用标量或者向量来表示它们的内部属性,全局的图也是一样的。而对于所有的连接信息,我们则可以维护一个连接列表的结构,其中每一个值代表每条边对应连接的两个节点。

2、图神经网络(GNN)

原文中对于GNN的定义是:

A GNN is an optimizable transformation on all attributes of the graph (nodes, edges, global-context) that preserves graph symmetries (permutation invariances)

意思就是GNN 是对图的所有属性(节点、边、全局上下文)的可优化转换,它保留了图的对称性(置换不变性),也就是将顺序变化之后不会影响的。而这里用到的神经网络结构为message passing neural network,即信息传递神经网络,它会对图中的各种属性向量进行转换,但不会改变其连接性。并且其输入和输出都是一个图。

2.1 最简单的GNN

一个最简单的GNN如上图所示:对于图、顶点、边这三类属性分类构造一个多层感知机(MLP),然后将对应的向量输入进去后得到一个新的向量来表示新的信息。而这并不会改变原来连接性的信息,因此图的结构仍然是保持不变的。那么我们如何将这些信息转换成我们想要的输出呢

假设现在是对顶点的信息进行预测,就是之前空手道的二分类任务,那么我们可以在最后一层输出的图后,接上一个全连接层,然后再接上一个Softmax层即可,例如我们要进行二分类任务,那我们的全连接层的输出维度设为2即可,n分类就设为n。 需要注意的是不管有多少个顶点,它们是共享一个全连接层的,共享其中的参数。那么也就是所有的顶点共享一个全连接层,所有的边共享一个全连接层, 全局自己就拥有一个全连接层。

那么再来看稍微复杂一点的情况,例如某个顶点我们没有其向量该怎么办呢,可以采用pooling技术,即将与该顶点相连的边的向量和全局的向量进行相加,就得到了代表这个顶点的向量,那么我们就可以拿这个向量去做预测等任务了,示意图如下:

其中红色的箭头代表四条边的向量,蓝色箭头的向量代表全局的向量,那么相加就可以得到该顶点的向量了,可表示成下面的示意图:

那么如果有顶点的向量而没有边的向量也是同理,只需要将该边所连接的两个顶点的向量和全局的向量进行相加即可,即:

而如果是拥有顶点的向量而没有全局的向量,那么可以将全部顶点的向量加起来作为全局的向量,即:

所以不管缺乏哪一类的属性都可以通过pooling来补齐

因此完整的最简单的GNN如下图:

但这部分的问题是在GNN blocks中并没有考虑到图的结构信息,这相当于对信息的浪费,结构可能不太理想。那么要用到下面的技术。

2.2 在图表的各部分之间传递信息

这部分的思想其实很容易理解,例如在对顶点进行更新时并不是直接进入MLP之中,而是将该顶点的向量和与之相连的所有顶点的向量求和,再进入MLP之中得到该顶点的更新向量,即:

这种情况呢就是只在顶点之间进行信息传递,即:

我们还可以实现更复杂的信息传递,例如把顶点的信息传递给边,把边的信息传递给顶点,即下图:

其中\(\rho _{V_n-E_n}\)代表将顶点的信息传递到边,即将边相连的两个顶点的向量加到边的向量之上,而\(\rho _{E_n-V_n}\)就是将边的信息传递到顶底,即将顶点有关系的边的向量都加到顶点的向量之上。完成之后再进入各自的MLP进行更新。这里需要注意的是这两个顺序交换是不一样的,即下面两种处理方式是不一样的:

但目前也没有特别明显的证明哪一种更好。另外一个办法就是两边同时更新,两种方式同时实施,即:

其实从之前我们就没有深入讲解说为什么需要一个全局的向量。这是因为如果你的图很大,有很多的节点但是连接又不够紧密的话,那么消息从一个顶点传递到远处的顶点可能需要很久的时间或者说很多次的传递过程,那么便虚拟化一个顶点,可以称为master node,该点呢与所有的顶点都相连,同时与所有的边都相连,作为消息传递的重要部分。那么对于全局向量加入了信息传递的过程就可以表示为下图,其中更新边的信息的时候是顶点和全局都传递信息,更新顶点的信息的时候是边和全局都传递信息,而同样,更新全局信息的时候也边和顶点都传递信息。

前述的pooling操作不仅仅可以求和,还可以做平均、取最大值这类操作。

3、当前技术综述

图除了我们前述的那种结构之外,是存在许多种其他结构的,例如下面这两种:

第一种是具有多种的边的类型,存在有向边和无向边;而第二种呢代表图可能是多层的,即当前层的某一个顶点其实可能是一整个图。

另外一个需要注意的点在于,如果层数较多那么后面层中的某一个顶点可能记录的信息就是整个图的信息了,那么求梯度的时候会非常复杂,因此可以尝试的方法是每次进行采样,采样得到一个子图然后再该子图上进行消息传递。

Graph Neural Network——图神经网络的更多相关文章

  1. Graph Embedding Review:Graph Neural Network(GNN)综述

    作者简介: 吴天龙  香侬科技researcher 公众号(suanfarensheng) 导言 图(graph)是一个非常常用的数据结构,现实世界中很多很多任务可以描述为图问题,比如社交网络,蛋白体 ...

  2. 论文解读《Bilinear Graph Neural Network with Neighbor Interactions》

    论文信息 论文标题:Bilinear Graph Neural Network with Neighbor Interactions论文作者:Hongmin Zhu, Fuli Feng, Xiang ...

  3. 论文解读(GCC)《GCC: Graph Contrastive Coding for Graph Neural Network Pre-Training》

    论文信息 论文标题:GCC: Graph Contrastive Coding for Graph Neural Network Pre-Training论文作者:Jiezhong Qiu, Qibi ...

  4. 论文笔记:Person Re-identification with Deep Similarity-Guided Graph Neural Network

    Person Re-identification with Deep Similarity-Guided Graph Neural Network 2018-07-27 17:41:45 Paper: ...

  5. Skeleton-Based Action Recognition with Directed Graph Neural Network

    Skeleton-Based Action Recognition with Directed Graph Neural Network 摘要 因为骨架信息可以鲁棒地适应动态环境和复杂的背景,所以经常 ...

  6. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  7. 异构图神经网络笔记-Heterogeneous Graph Neural Network(KDD19)

    自己讲论文做的异构图神经网络的ppt.再转变成博客有点麻烦,所以做成图片笔记. 论文链接:https://arxiv.org/abs/1903.07293

  8. Recurrent Neural Network(循环神经网络)

    Reference:   Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...

  9. Introduction to neural network —— 该“神经网络” 下拉“祭坛”

    Introduction to neural network 不能自欺欺人. 实干兴邦,空谈误国. -------------------------------------------------- ...

  10. 【图机器学习】cs224w Lecture 8 & 9 - 图神经网络 及 深度生成模型

    目录 Graph Neural Network Graph Convolutional Network GraphSAGE Graph Attention Network Tips Deep Gene ...

随机推荐

  1. 【前端必会】webpack loader 到底是什么

    概述 webpack的使用中我们会遇到各种各样的插件.loader. webpack的功力主要体现在能理解各个插件.loader的数量上.理解的越多功力越深 loader是什么呢? 背景 了解load ...

  2. 手把手教你玩转 Gitea|使用 Docker 安装 Gitea

    使用 Docker 安装 Gitea 的过程非常简单的,堪比"一键式"安装.Gitea 安装使用系列教程将会从多种方式进行全方位的实操演示. 视频演示中使用腾讯云实验环境安装 Do ...

  3. NSIS皮肤插件:vcl-styles-plugins

    vcl-styles-plugins简介   NSISVCLStyles  plugin (dll)是一款应用于nsis安装程序的皮肤插件,插件大小约为1.6MB,实际应用在安装程序中压缩后约为550 ...

  4. STM32的SPI口的DMA读写[原创www.cnblogs.com/helesheng]

    SPI是我最常用的接口之一,连接管脚仅为4根:在常见的芯片间通信方式中,速度远优于UART.I2C等其他接口.STM32的SPI口的同步时钟最快可到PCLK的二分之一,单个字节或字的通信时间都在us以 ...

  5. instanceof的使用和向下转型

    x instanceof A:检验x是否为类A的对象,返回值为boolean型 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instance ...

  6. 自建流媒体如何录制视频。齐博x1齐博x2齐博x3齐博x4齐博x5齐博x6齐博x7齐博x8齐博x9齐博x10

    http://x1.eapis.site/ 先打开配置文件\conf\config.php 里边的内容大概如下,第一项是必须要配置的,换成你的网站域名网址.第二项,如果流媒体服务器配置了https证书 ...

  7. go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务

    0.索引 go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务 0.1源码地址 https://github.com/liuyuede123/go-zero ...

  8. 27.-Django发送邮件

    一.邮件相关协议-SMTP SMTP全称是Simple Mail Transfer Protocol,即简单邮件传输协议(25端口号) 它是由一组从源地址到目的地址传输邮件的规范,通过它来控制邮件的中 ...

  9. k8s集权IP更换

    -.背景描述 背景:在场内进行部署完成后标准版产品,打包服务器到客户现场后服务不能正常使用,因为客户现场的IP地址不能再使用场内的IP,导致部署完的产品环境在客户现场无法使用:此方案就是针对这一问题撰 ...

  10. ES6 学习笔记(三)原始值与引用值

    总结: 1.原始值,表示单一的数据,如10,"abc",true等. 1.1. ES的6种原始值: Undefined.Null.Boolean.Number.String.Sym ...