目录
原文链接
原文有作者写的playground,并且网页上的图很多具有互动性,推荐大家去玩一下~~~
图的几个属性
图一共有三个部分:节点(node)、边(edge)、全局(global)
每个结点我们都用一个embedding来编码,具体如何实现的,暂时还不清楚,现在我们先假设已经对整个图进行了编码。
图信息的存储
图的几类信息需要表示:nodes V, edges E, global-context U and connectivity,其中V, E, U已经用embedding向量表示出来了,主要是图之间的关联性如何表示。
邻接表存储
- 邻接表存储的空间大小是 n n o d e ∗ n n o d e n_{node}*n_{node} nnode∗nnode,如果我们的节点数量过多,将会内存爆炸。
- 同时,邻接表存储对节点的顺序十分敏感,不同的顺序,会有完全不相同的邻接矩阵,但他们表示的是同一张图。下图是同一张图不同顺序所表示的邻接矩阵。
所以我们排除了邻接表存储,如何解决空间大小和顺序无关的问题是关键,下图是另一种构造方式,这种方式对节点顺序没要求,并且存储空间也不大:
图结构需要处理的任务
Graph-level task
全局图的任务,例如判断该图是否存在环
Node-level task
节点任务,例如判断某个节点属于哪个类别,下图是个二分类问题
Edge-level task
边的任务,判断图中某条边所代表的信息
GNN
The simplest GNN
下面我们构造一种最简单的GNN,就是将U, V, E这些向量,分别作为输入,中间经过一个f,这个f可以是mlp(多层感知机),也可以是其它你喜欢的神经网络,并且我们可以将U, V, E合并在一起作为输入更新,只要它们的维度相同。同时我们注意到,此处并没有用到图的属性间的相关性。根据任务不同,我们分别对U, V, E做预测。
Pooling Information
汇聚信息,我们试想一个任务,我们只知道你和我是好基友,让你预测你和我是男生还是女生。我们只有图的边的信息,并没有节点的信息,如果有的话我们也不需要预测了~~~所以我们需要将节点周围的边的信息汇聚到节点上面,从这里开始我们使用了图的相关性,做法分为两步:
- 先将与节点相关的信息收集到一个矩阵里面
- 然后将它们相加,或者取平均、最大值
上面总结说句人话就是,将节点周围的边的向量相加同时加上一个全局向量U,之后再将得到的向量丢到我们的预测模型里面做最后的预测即可。当然根据任务不同,我们所需要汇聚的信息也不同,例如有可能我们只有节点信息,但需要对边的信息做预测,或者对全局做预测。
Passing messages between parts of the graph
“邻居”之间传递信息,以便于让我们的模型学习到整个图的相关性。具体的传递做法分为三步,以下用节点举例:
- 将该节点周围的节点的embedding提取到一个矩阵当中。
- 再将该节点本身和提取到的节点做一个汇聚操作,例如相加、平均
- 再将操作过后的向量最为 f 的输入,用来更新该节点
还是说句人话,就是将周围的节点信息包括自己本身相加起来最为模型的输入,这样经过几步迭代之后,该节点就汇聚很大范围的信息了,这里是不是很像CNN。
Learning edge representations
学习边的信息,如果我们只有边的信息,没有节点的信息,我们不一定要在最后预测的时候做才汇聚边的信息,可以在每个节点更新的过程中就做汇聚,如果边和节点embedding的向量维度不同,中间可以通过一个线性映射投影到同一维度。
对于先将节点信息汇聚到边,也可以先将边的信息汇聚到节点,或者直接交叉汇聚。
Adding global representations
加上全局信息,之前介绍 pooling(汇聚)的时候,我们加上了global embedding(全局信息),现在解释一下原因。对于一个节点,如果它离其它节点很远的话,可能需要迭代很多层的 passing information 才可以获取它的信息,而全局节点里面包含了所有节点的信息,这使得其它节点可以更快速的获取全局信息,所以有时候也称 global representation of a graph (U) 为 master node,通过下面这张图我们来看看master node是如何参与更新的
小结
我们这里只是介绍了GNN是什么东西,并没有深入的讨论,如果感兴趣的话,可以参考这篇论文 The Graph Neural Network Model,虽然这篇论文我是没看懂了。还有就是,推荐大家去原文上看一看,这个文章的剩余部分可以在原文看到。如果觉得文字很无聊,推荐去看李沐老师的视频 零基础多图详解图神经网络(GNN/GCN)