我是听李沐的讲解记得笔记。
原始论文(其实是博客):A Gentle Introduction to Graph Neural Networks (distill.pub)
讲解课程:零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili
背景介绍
图神经网络是个比较新的领域,刚刚开始应用在药物发现,物理模拟,虚假新闻的检测,交通检测,推荐系统等等(可以再查查。应用落地是机遇)
哪些数据可以用图存储?
一些比较常见,例如用有向图存储社会关系网络,用有向图存储文章之间的引用关系,用无向图各个地点和他们之间的距离等等。
但是一些比较特殊:比如文章和图像和分子也可以看成图。
图片表示成无向图
图的节点:用一个三维的向量存储RGB的信息。每个节点有8个节点与之相连。
图的边:表示两个像素有没有相邻。
图的存储:用邻接矩阵来存储。这个矩阵比较稀疏。
(左:原始图片 右:图的直观画法 中:存储图的邻接矩阵)
文本表示成无向图
图的节点:每个单词。每个节点和他左右两个词相连。
图的边:表示两个单词有没有相邻
图的存储:邻接矩阵。
分子表示成无向图
图的节点:每一个原子。
图的边:相邻原子间的距离(如单键,双键)
图的存储:邻接矩阵。
哪些任务可以用图解决?
图层面的问题
例如根据分子的图,预测他可能的化学性质(有没有香味,有没有对某种疾病的治疗效果)。
又比如,根据整个句子的图,判断他的情感倾向。
节点层面的问题
例如一个公司的社交网络,用于预测:给定一个员工,他可能会隶属于哪个老板。
例如图像的物品分割。(本质上是给定一个像素,判断他应该和哪些像素在一起)
又例如文本的词性标注。
边层面的问题
场景理解。例如给一张图片,把里面背景去掉,只留下人物,判断人物之间的关系。
运用图神经网络会遇到什么挑战?
首先是如何让神经网络与图这种数据结构相容(compatible)。
传统的神经网络中流动的数据主要是向量或矩阵。而要让图在神经网络中流动,就得想办法表示图。
图主要有四种数据:节点,边,整个图的范围U,以及节点之间的连接性。前三种好办。博客中给出了解决办法:
但是节点的连接性不好存。我们首先想到的是用稀疏矩阵来存。但是这样会导致一些问题:
一是这个稀疏矩阵可能很大,会导致空间浪费
二是节点是不定的,变化的,稀疏矩阵存储不好调整
三是一个表达同一个连接可能有许多邻接矩阵。这种不同的原因是:置换节点的顺序,会导致表示的矩阵不同。也就是说,他们没有置换不变性(they are not permutation invariant)。而矩阵不同会导致在神经网络中的表现不同,做出来的结果不一样。
原文中关于置换可变的说明。(可以去原博客中玩玩,他可视化做得很好)
原博客:A Gentle Introduction to Graph Neural Networks (distill.pub)
所以文章提了另外一种储存方式:邻接列表!
这样就既做到了存储高效,又保证了置换不变性。
接下来,就是如何利用神经网络处理邻接列表了
做一个GNN模型
什么是GNN
GNN是对图中所有元素(包括顶点,边,全局U)的一个变换,并且保持住图的对称信息(置换不变性)从而使不同的表示方法,做出来的结果一样。
最简单的GNN
对顶点向量,边向量和全局向量分别做三个MLP(multilayer perceptron)。
其中这些MLP只对节点,边和全局的属性做了改变,而不对位置顺序改变(不做置换)。
用GNN做分类任务
就拿我们之前提到的一个节点层面的分类任务来说:一个公司的社交网络,用于预测:给定一个员工,他可能会隶属于哪个老板。
这个任务是个多分类问题。和以前的神经网络没有什么区别,就做个输出为N的全连接层,最后来个softmax可以了。注意,在这里,所有顶点共享一个全连接层的参数。
这个是比较简单的。复杂一点的:如果我们没有这个顶点的向量,却还想对他做预测,怎么办呢?
这时候要用到pooling技术(池化,或者叫汇聚)。
具体是这样做的:把与这个节点链接的节点拿出来,再把全局的向量拿出来。把这些信息汇集起来(通常是加起来),就得到了这个点的向量。之后像之前一样处理就好了。
同理,要是缺边的信息,也可以通过汇聚来实现。
在节点之间传递信息
为什么要在节点之间传递信息?
为了让神经网络学习到整个图的连接性,我们要把每个节点和他相邻的节点一起考虑进去训练。这个步骤是利用图的连接性的一个关键步骤。
所以首先,我们要对每个节点和与他相邻的节点做一个pooling,然后把这个汇聚的信息通过MLP。
这样就做好了一个信息传递层。
这和传统的卷积有点像。信息传递和传统卷积本质上来说,都是聚合节点周边的信息来更新节点的值。
这样不断聚合后,就完成了一个长距离的信息传递。最后,我们就可以得到整个图的连接信息了。
在节点和边之间传递信息
和节点之间信息传递类似,节点和边之间的信息传递有两种方法:
1.把一条边连接的两个顶点向量加到这条边的向量上
2.把一个顶点连接的边的向量加到这个顶点上
(如果两者维度不一样的话,需要做一个投影)。
这两种方法都可以,但是结果会不一样。目前也没有固定的结论,说是哪种更好。所以我们一般两种方法交替使用。
将全局信息纳入考虑
由于在节点之间传递信息时,只涉及到相邻的节点。所以K层只能传K步那么远。
所以如果图很大,那很远的节点就无法进行信息传递。
解决方法是:加入一个master node,或者叫context vector。这是一个虚拟的点,和所有的点和边相连。这就是U。
到此为止,节点,边和全局的信息交流就都有了。这样子在某个节点做预测的时候,就可以把它相连的节点,边,还有全局的信息一起拿过来做预测。这有点像attention机制。
一个GNN playground
博客里面加了一个自己可以调超参数的训练模型。里面的超参数包括模型的层数,信息传递的方法(是求和,求最大,还是求平均),在哪些部分之间传递信息,每个属性的embedding(嵌入)有多大等。然后会显示最终的AUC。
我自己调的 效果最好的是0.82
此外,他们下面也附上了他们做的实验以及实验结果。
总体而言的结论就是:
pooling的方式没有太大影响
层数越大,效果上限越高。但是只是上限高,能否达到上限还需要调参数。
GNN对参数还算是比较敏感的
技术
特殊的图
像左边的,就是一种图中有多条边相连。(比如想社会关系,两个人之间可能既是亲人,也是朋友)
像右边的,就是用超节点链接多个节点(有点像之前的全局向量)
对图进行采样和batch
之前我们做神经网络,总是随机选几个batch训练。而现在在图这边,随机选几个图的时候,各个图的节点和数量不一样。这就导致不是很好做batch。
所以我们要选一些能够代表整个图特征的子图来训练。这个选取的过程就是采样。
文章中介绍了四种采样方法。
此外,采样还有一个好处:减少内存。
归纳偏置(Inductive biases)
大意是说:每个模型都有基于一些假设,如果没有这种假设,就什么都学不出来。这个假设就是Inductive biases
例如,卷积神经网络是Inductive biases是空间不变性,RNN的Inductive biases是时序性。
而图神经网络的Inductive biases是置换不变性。
此外它还提了各种技术
但是都没有讲的很细。。。以后要是有深入了解再来补充吧。
感觉这方面只有宽度,没有深度。没有深入研究这个领域的话,看了就忘了,,,
杂谈
distill博客上的特点:使用图片比较多,比较直观。
这篇文章的图片还可以交互,很好玩。