A Gentle Introduction to Graph Neural Networks
这篇文章是Distill上的一篇博客(Google Research)-A Gentle Introduction to Graph Neural Networks (distill.pub)
适合有一定CNN基础的玩家了解一下GNN/GCN的基础
李沐老师的论文精度视频也讲解过这篇博客:零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili
本文是我自己阅读的记录,以及从视频搬过来的一些内容.
什么是图
基础的定义
A graph represents the relations (edges) between a collection of entities (nodes).
图代表了一系列实体之间的关系(节点和边)
图的图示:
可以看到图一般包括了三个要素:点/边/全局
同时,为了具体描述图的这三个要素,可以把对应要素的数据存储在对应的部分中,如下:
按照我的理解,saclars是标量的形式,而embeddedings则是向量的形式
这个图片的例子中顶点带的信息是长度为6的向量,边则是8个,全局是5个,意味着同门的长度可以不一致
上图中,是使用scalars或者embeddings把图的信息存储下来.
引用李沐老师的理解:
核心在于如何把这些我们想要的信息,表示成这些向量.
以及这些向量,能否通过数据学习到
有向图和无向图:
这个还是很直观的.
这一部分我的理解的补充:
图的定义并不复杂,学过数据结构理解起来没有难度.关键的问题在于GNN中如何去表示和存储图,这个是GNN的一个关键,在下文会有详细说明
Image/Text as graph
这里会展示,图和文字可以看作是图.同时通过图的视角去看这两种结构的数据,建立一种直觉,帮助我们去理解其他less grid-like的图数据
一般来说我们会使用一个array来表示image,比如(224x224x3).
但是换一个角度可以把所有的像素点都看作是图的一个node,每个node与和他相邻的像素中都存在一个edge.
当然也可以使用邻接矩阵来表示图之间的相连性.当然这个邻接矩阵一般都会是一个非常巨大的稀疏的数组.
首先使用indices来表示text中的每个字符/单词/序列,然后就可以使用一个indices的序列来表示text.
这样就可以使用一个简单的有向图来表示text,其中每个indices就是一个node,每个node都会有一条边,从该节点指向紧跟着他的那个节点.
Of course, in practice, this is not usually how text and images are encoded: these graph representations are redundant since all images and all text will have very regular structures. For instance, images have a banded structure in their adjacency matrix because all nodes (pixels) are connected in a grid. The adjacency matrix for text is just a diagonal line, because each word only connects to the prior word, and to the next one.
当然,在实践中,这通常不是如何编码文本和图像:这些图形表示是多余的,因为所有图像和所有文本都具有非常常规的结构。例如,图像在其邻接矩阵中具有带状结构,因为所有节点(像素)都连接在网格中。文本的邻接矩阵只是对角线,因为每个单词只连接到先前的单词,并连接到下一个单词。
常见的适合图表示的数据
分子结构/社交网络/引文神经网络/…
什么类型的问题要用到图结构的数据?
图上面一般可以有三种大致类型的预测问题:
- graph-level:预测整个图的单一性质
- 举例说明:比如预测一个分子结构的味道,或者预测是否会对一个疾病的受体有响应(大概就是这个意思)
- 非常类似于MNIST的图像分类问题,nlp的语句情绪预测
- node-level:预测节点的一些性质
- 举例说明:预测图形内每个节点的标识或角色,比如 Zach的空手道俱乐部 问题
- 类似于图像的语义分割,nlp的单词语音部分预测(预测动词/名词/…)
- edge-level:预测边的性质或存在性
- 举例说明:图像场景理解,预测一张图像里面的组成部分之间的关系
这样的三个问题可以使用一个单一GNN来解决
在机器学习中使用图的困难
图一般需要表示四类信息:
- nodes
- edges
- global-context
- connectivity
其中前三个都可以使用简单的使用一个matrix之类的东西表示,也是比较自觉的
但是connectivity不少那么好表示的,最直观的做法是使用邻接矩阵来表示,但是这样的表示有那个直观的问题:
- 问题一:图的节点非常的多的话,会生成一个非常非常巨大的邻接矩阵,存储和计算都非常复杂,哪怕可以使用稀疏矩阵表示,稀疏矩阵的计算也是非常费时间的
- 问题二:同一个图的邻接矩阵有很多异构的形式,这些形式在实质上是等价的,在计算预测的结构上也需要做到一致(也就是要做到置换不变(permutation invariant,)),但是在神经网络中则不一定能做到这样
一种直观的解决方法就是使用邻接列表
这里其实是讲话版本的表示,nodes和edges是使用标量表示的,实际上,一般是维度都要高一点的vectors
图和图神经网络(GNN模块)
A GNN is an optimizable transformation on all attributes of the graph (nodes, edges, global-context) that preserves graph symmetries (permutation invariances).
GNN是保留图表对称性的图形(节点,边缘,全局上下文)的所有属性的可优化的转换(置换Imeraryce)。
本文使用“message passing neural network” ,使用 the Graph Nets architecture schematics来实现GNN.GNN输入是图,输出也是图
- Neural Message Passing for Quantum Chemistry
J. Gilmer, S.S. Schoenholz, P.F. Riley, O. Vinyals, G.E. Dahl.
Proceedings of the 34th International Conference on Machine Learning, Vol 70, pp. 1263–1272. PMLR. 2017.- Relational inductive biases, deep learning, and graph networks
P.W. Battaglia, J.B. Hamrick, V. Bapst, A. Sanchez-Gonzalez, V. Zambaldi, M. Malinowski, A. Tacchetti, D. Raposo, A. Santoro, R. Faulkner, C. Gulcehre, F. Song, A. Ballard, J. Gilmer, G. Dahl, A. Vaswani, K. Allen, C. Nash, V. Langston, C. Dyer, N. Heess, D. Wierstra, P. Kohli, M. Botvinick, O. Vinyals, Y. Li, R. Pascanu.
2018.
GNNs adopt a “graph-in, graph-out” architecture meaning that these model types accept a graph as input, with information loaded into its nodes, edges and global-context, and progressively transform these embeddings, without changing the connectivity of the input graph.
这的 without changing the connectivity of the input graph.不明白是啥意思
这里加上一点新的定义,数据结构的定义:
- 图G
- 顶点V
- 边E
- 全局U
simplest GNN
对除了connectivity以外的U/V/E三个属性,每个属性单独设计一个mlp(或者其他可微的模型),然后拼接起来就可以组成一个GNN层了.
如果要组成一个GNN,可以像CNN一样对多个layer进行堆叠.
如果是一个二分类/多分类问题,比如需要V节点数据进行分类,就可以在最后一层输出层之后添加一个全连接层(linear classifier)
可以看到这里的图片里面,最后输出的是图中节点上颜色不一样,代表的就是不同的分类
复杂一点的情况是,我们要对node(V)进行预测多分类,但是可能node本身不带有信息(V没有embedding),这样的情况下可以使用边E和全局U的信息去做pooling操作
可以看到,图片里面是左上角的node的数据的pooling,获得了其中的四个相连边的数据和全局的数据,最后做一个相加的操作
其他的情况都可以做相似的操作:
只有边信息,但是对点做预测:
只有点信息,对边做预测:
只有带你信息,对全局做预测:
…
所以,不论缺少了哪一类的属性,都可以使用pooling操作得到最后的结果,对这个最简单的GNN的流程描述就可以变成这样:
如果有新的属性,我们也一样可以使用pooling操作去处理.而我们要做的,就是定义如何将信息从一个属性传递到另外一个属性.
*注意:*我们在这里每个node/edge/global信息中都是独立处理的,这有pooling的时候用到了connectivity信息.
基于[Neural Message Passing for Quantum Chemistry-PMLR-2017]的GNN
We could make more sophisticated predictions by using pooling within the GNN layer, in order to make our learned embeddings aware of graph connectivity. We can do this using *message passing, where neighboring nodes or edges exchange information and influence each other’s updated embeddings.
为了使我们学习到的embeddings可以使感知到图的connectivity,我们可以在GNN层内使用池进行更复杂的预测。
我们可以使用消息传递(就是这篇论文)来实这个此操作,其中邻居节点或边缘交换信息并影响对方更新的embeddings
我的理解:以一个node为例子,之前的操作是只使用这个node单独的信息来计算下一层的数据,**而message passing机制则使用node以及他的邻居node的信息,通过聚合(聚合的方法也可以是加法或者mlp或者其他的方法),再使用聚合的信息传递给下一层.**这种操作和卷积很相像,可以收集周围点的信息.
补充一个我对本文中的定义的理解:
聚合:是为了给预测时,收集到周围节点的信息
pooling:缺少部分信息时候的操作,一般都是放在最后一层全连接预测前的(就和CNN的池化一样)
Message passing的介绍:
消息传递有三个步骤:
- 对于图表中的每个节点,收集所有相邻节点的embeddings (或消息),这是上面描述的g函数。
- 通过聚合函数(如sum求和)聚合所有message。
- 所有pooled的message都传递通过一个更新函数,通常是学习的神经网络。
看图理解:
pooling的时候是使用邻接边信息来表征node信息,而聚合操作则是使用node本身的信息,加上邻居节点的信息,聚合后作为输入(图中的聚合是用sum,其实可以用其他方法的.)
这里展示的是左上角这个node,所以总共是1+4个node信息聚合,当然这里是一阶近邻
graph中的聚合的对象元素是node,图像中的则是pixel,最大的区别在于pixel的邻居元素数量确定,而node的邻居元素则是可变的.
当然这样的操作也是可以一层一层叠加的,比如低价了三个这样的message passing layer后,一个node就有了距离他三个步长的node的信息.
层叠加的结构示意图
Learning edge representations
接下来就会考虑到这样的一个问题:我们之前介绍过在node没有信息时,通过edge信息的预测,在最后的linear层之前加pooling层来实现node的预测;另外一方面,我们通过message passing机制来获取node周围node的信息,且可以在中间层使用,从而利用到graph connectivity信息.那么如何在预测node信息时,在GNN的中间层同时利用到edge信息呢?(反之亦然)
我们可以使用一样的方法把node的相邻边信息融入其中,但是新的问题在于,edge和node携带的信息维度是很可能不一样的,如何解决?
一种可行的方法是使用线性映射,从edge空间映射到node空间.那么这样的方法就会把结构更新成如下:
这里有一个另外的问题要思考,我们在GNN每一层预测(更新信息/提取特征)时,应该要更新哪个信息?是VEU全部更新/只更新V/只更新V/或者其他更新方式?同时也就产生另外一个问题,如果更新多个信息,我们应该按照什么顺序更新?
这是一个研究的开发方向,有各种不同的方法去更新.作者这里介绍了‘weave’ fashion方法:
- Molecular graph convolutions: moving beyond fingerprints
S. Kearnes, K. McCloskey, M. Berndl, V. Pande, P. Riley.
J. Comput. Aided Mol. Des., Vol 30(8), pp. 595–608. 2016.
在edge和node信息中融入四个更新的表征:
- node to node (linear)
- edge to edge (linear),
- node to edge (edge layer)
- edge to node (node layer)
图示如下:
Adding global representations
到现在为止,文章描述的GNN网络存在着一个缺陷:在图中,距离非常远(nodes之间的路径长度)的nodes之间的信息可能永远不会发生传递.即使我们使用了message passsing的方法.(k个层的message passing只能把距离为k的nodes之间的信息进行传递).
那么,如果有一个任务非常依赖于相距甚远的nodes,这个任务就非常不好处理.为了解决这个问题,我们可以考虑让所有的nodes之间都可以传递数据,但是对于巨大的grapg运算复杂度非常高(虽然virtual edges方法,这类方法在小的garph上已经进行了使用)
介绍一个方法:master node/context vector
使用global 表征,也称作master node/context vector,这个表征与所有的其他的点和边都相邻,以他为桥梁就可以给其他节点之间传递信息.
这个图,没有看明白.李沐老师说这一块作者是在解释工作的流程,然后认为和注意力机制很相像.
搭建一个GNN的playground
实验
这部分就不记录了,做的很厉害
相关的技术
也不展开记录了
李沐老师对GNN的评论
对于文章
从头到尾读下来非常流畅!先介绍什么是图,在图中我们对顶点、边、全局都用向量表示,以及现实中的数据如何表示为图,如何对图做预测,算法用到图上有什么挑战。然后开始介绍图神经网络,首先定义了GNN是对属性做变换而不改变其结构,从最简单的例子开始讲解,用三个MLP做属性向量的变换,用全连接层做输出从而实现预测。如果有缺失向量怎么办,那就做聚合操作,把边、节点、全局属性利用上,也可以完成我们的预测工作。最后介绍真正意义的GNN,每一层通过汇聚操作把信息传递过来,从每个顶点看到邻居节点的信息,在每一层能充分汇聚到图中的信息。然后是实验部分,作者搭建了playground供读者玩,跑出了不同的超参数对模型效果的影响,最后对GNN的相关技术进行了展开。
文章写得是非常精美的,文中存在大量的交互图,文字围绕图展开。这么多的交互图既是缺点也是优点,用JavaScript写如此多的交互图是非常耗时间的事情,作者尽可能用图来代替大量的公式和代码,更直观易懂。本文的缺点就是,文章的宽度的展开,很多地方让读者一知半解,了解不到其中细节,导致懂GNN的人能感受到GNN的强大,不懂GNN的人仍然不知道其核心在哪里。对于GNN
图是非常强大,几乎所有数据都能表示成图,但是图上做优化很难,涉及到CPU和GPU的训练也是一个挑战,同时图神经网络对超参数非常敏感。近些年图神经网络在学术界迅速发展,实际上工业落地的并不多,GNN的发展还需要时间的沉淀。
参考
- A Gentle Introduction to Graph Neural Networks (distill.pub)
- 【李沐精读GNN论文总结】A Gentle Introduction to Graph Neural Networks_Mr.zwX-优快云博客
- A gentle introduction to graph neural networks. - 知乎 (zhihu.com)
.pub)](https://distill.pub/2021/gnn-intro/) - 【李沐精读GNN论文总结】A Gentle Introduction to Graph Neural Networks_Mr.zwX-优快云博客
- A gentle introduction to graph neural networks. - 知乎 (zhihu.com)
- 零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili