注意
上图的的传递方向是Layer3 -> Layer 0, 所以一个节点的信息是由上一层中与他相邻的(包括自己)节点一起贡献的信息;
图是表示实体之间关系的数据结构,点就是实体,边就是关系
用向量来表示图, 将图的顶点、图的边、整个图用向量来表示,举个例子
问题就在于如何表示,这样的表示能否反映真实情况…
在概率图模型中也见到过,就是将相邻的像素点连一条边,构造一个图,举个例子
如上图所示,第一行第二列的像素点与其8个方向的相邻像素点连接了一条边;中间的那个就是邻接矩阵了;
如上图所示,一个词与其下一个词连一条又向边, 一整句话构成一个有向无环图;
下图表示了生活中常见到的图的规模,包括社交网络图、分子图、论文引用图、维基百科的引用图;
下图则是用标量来表示点和边(当然可以换成向量), 用邻接表来存储边;
举了例子,比如要判断一个图中是否存在两个环
这类似于 MNIST 和 CIFAR 的图像分类问题,我们希望将标签与整个图像相关联。 对于文本,一个类似的问题是情绪分析,我们希望一次识别整个句子的情绪或情绪。
节点级任务与预测图中每个节点的身份或角色有关,举个例子,比如要判断一部剧Zach’s karate club,两个教练起了分歧,他们的学员站队的问题;
按照图像类比,节点级预测问题类似于图像分割,我们试图标记图像中每个像素的作用。 对于文本,类似的任务是预测句子中每个单词的词性(例如名词、动词、副词等)。
边表达的是节点之间的关系,对于图像来说,就是实体与实体之间的关系,举个例子
我们做完语义分割之后,想知道实体之间的关系,如上图中两个人就是对手关系,一个人正在踢另一个人,而还有一个人则是裁判,他们都站在擂台上,剩下后面的人都在注视着两个选手的比赛;
GNN的定义: GNN是对图的所有属性(节点、边、全局上下文)的可优化转换,它保留了图的对称性(排列不变性,对称信息指的是将顶点进行另外一种排序信息之后,整个结果不会发生改变)
GNN的假设: 保持了图的对称性
(这里补充一下CNN、RNN的假设, CNN的假设是空间变换的不变性, RNN假设的是时间的延续性)
GNN的信息在各层间的传递使用的是 message passing(信息传递神经网络,GNN也可以用别的神经网络来进行描述,这个地方用的是信息传递的框架)
GNN的输入是图,输出也是图,它会对顶点、边和全局的向量进行变换,但是不会改变图的连接性(顶点和边的连接信息在进入图神经网络之后是不会改变的)
如下图所示,对于顶点向量、边向量和全局向量分别构造MLP(多层感知机),MLP的输入大小和输出大小相同,取决于输入的向量
检验一下是否满足GNN的定义
和一般的神经网络没有太多区别,因为顶点已经表示成向量了,然后要对它做预测的话,比如前述的空手到俱乐部的问题,其实就是一个简单的二分类问题
每个顶点都有了对应的向量表示,接一层sigmoid就能得到二分类结果,如果是多类别的话,就接一层softmax…
如果我们没有某个点的向量表示、如果我们没有某条边的向量表示、如果我们没有全局的表示;我们可以采用一个pooling的技术来获得他们的表示;
对于某个顶点来说,需要将与其连接的那些边和全局的向量拿出来,加和(可以是求平均,可以是求最大),最后再经过update function, 得到下一层的该点的向量表示;如图所示
整体表示如图
同理可以利用顶点和全局对边做预测
也可以利用顶点对全局信息做预测
总结上面的内容,就能得到一个简单的GNN,如下图所示
当将信息从当前层向下一层传递的时候, 利用图的结构进行传递, 如图所示
这是一个最简单形式的信息传递, 这个跟标准的图片上的卷积有点类似,等价于在图片上做卷积,但是卷积核窗口里面每个窗口的权重是要相同的(因为在卷积里面其实是每一个顶点和它邻居顶点的向量会做加权和,权重来自于卷积窗口),这里没有加权和,只是加,所以权重应该是一样的,但是通道还是保留了(卷积中有多输入通道和多输出通道,对应信息传递过程中MLP还是保留了),所以和卷积操作有点类似,但是还是有区别;
GNN层也可以通过堆叠来完成整个图的长距离信息传递过程。
下图表示一个顶点,顶点之间通过距离为1的邻居(一近邻)将它的信息传递过来,表示从 v v v 到 v v v 的汇聚过程,这也是最简单的信息传递的过程
再复杂一点,之前考虑过,假设缺失某种属性,可以从别的属性汇聚过来,以弥补这个属性,同理,不需要等到最后一层在进行汇聚,可以在较早的时候在边和顶点之间汇聚信息, 下图展示了如何将顶点的信息传递给边,然后再把边的信息传递给顶点
这里是先把顶点的信息传递给边做更新,然后再把更新过信息的边的信息汇聚到顶点再做更新,如下图右图所示。如果反过来的话会得到不一样的结论如下图左图所示
之前有一个问题:因为每次只去看自己的邻居,假设图比较大而且连接没那么紧密的时候,会导致信息从一个点传递到一个很远的点需要走很长的步
解决方案:加入master node(或者叫context vector),这个点是虚拟的点,可以跟所有的顶点相连,也可以跟所有的边相连(这里在图上面不好说,因为一个顶点是没办法跟边相连的,在这里是一个抽象的概念),它其实就是U(全局信息),U跟所有的V里面的东西是相连的,跟E里面所有的东西也是相连的,所以如果想要把顶点的信息汇聚给边的时候,也会把U汇聚过来,因为U跟边是相连的(同理,汇聚顶点的时候,也会把U和它相连的E连过来),最后自己更新U的时候,会把所有的顶点信息和边的信息都拿过来,最后完成汇聚再做更新;
到此,这三类属性都学到了对应的向量,而且这些向量在早期就已经进行了大量的信息传递,最后在做预测的时候就可以只用本身的向量,也可以把相邻的那些边的向量也拿过来,甚至是把跟他相邻的那些顶点的向量也拿过来,以及全局向量,也就是说不仅使用本身的向量,还可以将别的跟本身相关的东西都拿过来一起做预测
对于来自于不同类别的属性,可以加在一起,合并在一起也可以。有一点像注意力机制(attention就是说将当前query的顶点和跟他相近的东西都拿过来,可以直接用图的信息将这些相近的向量拿过来,这样就完成了基于消息传递的图神经网络的工作)
GNN的实验做的是一个分子图结构的预测问题, 就是通过分子图结构来判断该分子是否刺鼻;分子的组成是碳、氮、氧、氟的原子与单、双、三键等;
总的来说,GNN对超参数还是比较敏感的,能调的超参数也很多
在图论中也介绍过,有多重图、超图、超节点、分层图,不同的图结构会对神经网络做信息汇聚的时候产生影响, 如下图所示, 左图是一个multi graph,顶点之间可以有多条边,比如左图中相邻顶点之间不同颜色的边表示不同种类的边(红色的表示无向边,绿色的表示有向边), 右图表示图是分层的,其中一些顶点是一个子图
假设有很多层的时候,最后一层的顶点就算只看它的一近邻,最后顶点由于有很多层消息传递,所以它实际上是能看到一个很大的图,在图连通性足够的情况下,最后这个顶点有可能会看到整个图的信息
在计算梯度的时候,需要把整个forward中所有的中间变量存下来,如果最后一层的顶点想要看整个图的话,意味着在算梯度的时候需要把整个图的中间结果都存下来,就导致计算量大到无法承受,因此就需要对图进行采样
从性能上考虑,不希望对每一个顶点逐步逐步更新,这样每一步的计算量太小,不利于并行,希望是像别的神经网络一样,将小样本做成小批量,这样来对大的矩阵或者tensor做运算
引用文章: