对图神经网络(GNN)的一个基本的介绍
很久之前,我刚开始接触神经网络的时候,就有这么一句传闻——“不要碰图神经网络,会变得不幸!”
为什么?我今天就带你了解一下。
基本知识
首先,我们看一下图神经网络在学习一个图的时候,到底是一个什么过程:
可以看到,这个例子给的和传统的卷积网络类似,我们层与层之间只是学习点的1近邻的内容,但是随着层的叠加,我们每个节点的感受野会逐渐增大,最终得到整个图上几乎所有顶点的信息。
我们先说一下数据结构的表示:
在研究普通的数据结构“图”的时候,我们常常将图表示成两个类别的元素,一个是节点,一个是边。当然了,节点可以细分不同的类型,比如说有些节点只能出不能进或者反之,而边也可以分成有向和无向等类别,但是在神经网络里面,图常常用三个信息来表示,除了点和边之外,还有一个U,称之为全局特征,我理解着就是整个全局代表什么,比如对于一个社交网络,这个社交网络是什么类型的,主要用于什么,不同的点和边有什么特点等等,可能都可以作为U的理解性的存在。
当然了,具象的意义肯定不能直接被网络处理,神经网络最喜欢的还是向量、矩阵这些存储结构,那么一个图就可以这么存储:
将点、边、全局信息分别表示成矩阵的存在,当然了,这些矩阵不一定要保证长度相同,因为如果想做相加、相乘等操作的时候,可以做投影。
不同类型的数据如何表示成图
诚然,我在学习GNN之前,我对图的印象只停留在类似社交媒体,你关注我我关注你这类数据上,但其实图算是我认知中最强大的数据结构之一,因为它实在是太灵活了,几乎所有的数据都可以用它来表示,我们举几个例子。
1、image
图片可以表示成图吗?当然可以!!要知道,图片是规则排列的数据,而图是不规则的数据,我们当然可以让一个能表示不规则数据的数据结构去表示规则的数据!如上图,将相邻的像素认为是相邻的node,而每一个node就是一个像素,那么相邻像素连接一个无向的边即可,我们就可以把图片转换成图,只不过这张图看上去非常的规则而已。与此同时,我们也可以设计一个邻接矩阵来表示这个图,毕竟真正的图只是方便人类理解,没办法输入到网络中去。
2、text
相对于图片是个规则排列的数据来说,文本虽然不规则,但是文本也有前后连接关系,即一个单词有前面的词和后面的词,这是一个时序关系,我们可以借助这个关系对这个图进行构建,这就是一个有向图,而且每个单词的入度和出度不会超过1.
当然了,虽然文本和图片都可以表示成图,但是在平时我们很少这么表示,因为文本和图片相对图来说是非常规则的数据,很好处理,谁闲的没事这么表示,对吧,这里只是做一个示范,展示图这个数据结构的强大的表示能力。
3、分子结构
类似分子结构这类数据结构,我们想用图以外的数据结构来表示是非常困难的!因此我们只能用图来表示:
4、人物关系
社交关系也很难用规则的数据结构来表示,因此也常常用图来表示。
写到这里应该可以给大家一个印象了吧?就是说,图这个东西表示能力很强大,几乎所有的数据都可以用这种数据结构来表示,但是,我们能不用就不用(比如图片,比如文本),因为它实在是太复杂了。当我们在一个问题中使用图这种数据结构,那很有可能是因为那个任务中的数据很难用图意外的数据结构去表示,这就是前面说的——没事不要碰图神经网络。
图常见的任务
首先是图这种level的任务,比如确定一个图里是不是包括环?当然了,这种不需要网络,直接一个算法就能解决。
点level的任务:比如预测一个节点的信息,或者给节点做分类等等。
边level的任务:这里找到的任务非常有趣,我直接上图吧!
在一张图片中,我们做了实例分割,我们想判断每个实例正在进行的动作和意图,我们也想知道不同实例之间的联系,这就有用到了图。上面这个例子看着花里胡哨的,其实简化一下,就是对边的一种分类,如下:
在网络中的主要问题
其实这个问题与点云有点类似,即一个点云是由点构成的,但是点与点之间是没有顺序可言的,也就是说,我的点云不管按什么顺序输入到网络中,你给我的反馈结果应该是完全相同的才对,所谓的置换不变性。图也有这个特点,你要输入到网络中,你的图肯定有一个顺序,比如节点的顺序,那么不管你是按什么顺序输入的这个图,你最后的结果应该是一致的才对。
打个比方,如果用邻接矩阵的话,你的数据可能有以下两类排列:
可以说这是两个完全不同的矩阵,但是不幸的是,它表示的是同一张图。。。
因此,虽然邻接矩阵表示一张图的数据存储方式对网络很友好,但是我们很难直接处理它,因为两个矩阵对于网络来说必然是两个不同的输出。
因此,就在上面的图的三个要素的基础上(V,E,U),增加了一个新的玩意,叫adjacency list,即邻接链表,用来存储每条边连接的点的信息,如下:
我们仍然用向量来表示每个点,每条边,以及整体的图,但是我们把点和边之间的关系解耦出来了,存在了一个邻接列表里,我们只需要这个列表的顺序和edge的顺序保持一致,就能永远记录下每个边所连接的两个顶点到底是谁。与此同时,我们就可以单独处理点和边了,
而我们单独处理每个点的时候,比如接了一个MLP,这时候这个点是与其他点无关的,因此不受到顺序影响,边同理。
简单的GNN
比较简单的GNN就像上面说的一样,单独对点、边和整体做MLP,所有点共享一个MLP,边也同理,因为点与点、边与边之间没有发生信息交换,所以我最终输入了多少点,输出还是多少点;输入了多少边,最终还是多少边,这是最简单的一种学习方式,我们只挖掘了单要素自己的信息,我们可以将这个层进行叠加,进一步挖掘其信息。但是输出的最后一层的特征我们仍然可以用来做一些任务,比如预测某个点的类别,我们可以直接将点拿出来,后面接一个线性层,再接一个Softmax层,选择权重最大的类别,如下:
当然了,我们可能也有其他需求,比如我们的图最初有些点是未知的,因此我们没有这个点的向量,但是我们想要预测这个点,那么比较简单的方法就是我们对这个点的邻居节点的向量做一个pooling,比如简单的max叠加,就可以认为我们拥有了这个点的特征向量:
与之类似,如果我们想要预测边的向量,那么我们就将这个边的两个定点的数据进行叠加。
而如果想要预测全局的向量呢,我们就可以对全局所有的点进行叠加。
那总体来说呢,整个结构就是很简单的:
我们首先对这个图的点、边、整体的向量分别做MLP,这作为一个block,称之为GNN block,随后我们就得到了保留点边关系的特征图,最后我们接我们需要的下游任务即可。
当然了,这只是最简单的情况,它对边、点之间的联系的利用是非常浅薄的,因此我们需要让这些要素产生信息交换。
举个例子,如果我想要更新一个点的信息,那么我一定要单独对这个点做MLP吗?不一定啊,我可以把卷积的思想引入,我对这个点和这个点的邻居做一个汇聚,然后再去MLP处理,然后再去更新参数:
这样的话,我们就利用了这个点的临近的节点,那随着我们层数的叠加,我们每个点的感受野也会越来越大,最后达到本文开头展示的效果。与卷积神经网络不同的是,卷积神经网络带有权重信息,但是这里没有权重的概念,大家的权重是一致的。
这就是点与点之间做信息传递的例子,可以表示成下图:
当然了,我也可以让边汇聚点的信息,点汇聚边的信息:
但是做边与点之间的信息传递的时候,会涉及到更新的问题,即我到底先让边汇聚点,还是让点先汇聚边?如下:
两种操作往往导致不同的结果,但是与其他很多深度学习领域不同的是,一般这类操作结果都差不多,但是对于图神经网络来说,结果是不同的,而且至今没有任何谁好谁坏的说法。
比较粗暴的方案是,两个一起汇聚:
即,我在汇聚边的时候,我先不要求,保留上一层的数据,再继续汇聚点,最后一块作为下一层的数据。
当然了,也有结合整体信息的方案:
讲到这里玩法其实就很类似了,就是不同特征矩阵的一个叠加选择的问题。
GNN playground(难调的网络)
原文给了一个playground,我调了半天没调出个所以然:
其实很多深度学习领域,参数越大往往效果最起码不会变差,特别是ResNet带来的残差方法,当大模型在当今时代横着走。但是相对来说,图神经网络就连这被接受程度最普遍的经验都不太符合,相反的它对几乎所有的超参数都异常敏感,我们直接上几张图体验一下:
我们定睛一看,这些散点图几乎是没有规律的,但是其实那条比较普适的规律还是在很小程度上有所遵循的,一方面是上限,可以看到提升参数量(不管是模型还是特征向量维度),整个模型精度的上限是有所提高的,只不过不管你的模型多大,它仍然可能效果非常的差;与此同时,最后一张图也表示了不同信息的交互带来的收益,看中位数其实还是汇聚几乎所有信息能够带来的收益最大,这个是符合整个深度学习的大经验的,但是这个网络仍然是一个十分敏感的网络,非常难调。
后面做了一些横向的拓展,我个人不是很感兴趣,但是这个playground非常形象地证明了那句话——不要碰图神经网络,会变得不幸!因为真的太难调了。
横向拓展的部分分享了一张图,如下:
这里想用一种汇聚办法将不同节点关系区分开来,但是你发现不管用什么方法,我们都没办法保证普适。那有人会问,对max mean sum进行叠加呢?那我要回答,也不行,因为说到底仍然是数学公式,而图里面,一个节点所连接的节点数量是未知的,节点类型也未知,我们真的很难设计一种方案去区分,这可能也是图神经网络对所有超参数都很敏感的一个主要的原因?或者说特点。
这是我第一次接触GNN,真的挺叫人摸不着头脑的,是一个很难驯服的模型。
参考:
https://distill.pub/2021/gnn-intro/
A Gentle Introduction to Graph Neural Networks
Sanchez-Lengeling, et al., "A Gentle Introduction to Graph Neural Networks", Distill, 2021.
https://www.bilibili.com/video/BV1iT4y1d7zP/?spm_id_from=333.337.search-card.all.click&vd_source=920f8a63e92d345556c1e229d6ce363f
零基础多图详解图神经网络(GNN/GCN)【论文精读】