图神经网络(GNN) 理解
一、什么是图
图(graph) 就是表示一些 实体(entity) 之间关系的一种数据结构,实体在图中用 节点(nodes) 表示,它们之间的关系用 边(edges) 表示。其中,节点用 V 来表示,边用 **E ** 来表示,全局图用 U 来表示
为了进一步描述图,我们在图中各个部分存储一些信息。每个节点用一个长度为n的向量来表示,每条边用长度为m的向量来表示,全局图用长度为t的向量表示,在Fig1中,(n,m,t)=(6,8,5)。
二、如何将数据(data)表示成图(graph)
- 我们将每一个像素(pixel)映射为图(graph)中的一个节点,相邻像素之间视为有连接关系,这种连接关系映射为图(graph)中的一条边。这种映射关系可通过一个邻接矩阵(adjacency matrix)来表示,如图中所示,横轴和纵轴均为像素的标号,两个像素之间存在连接关系时便标为蓝色。
-
有一句话,包含这几个单词:Graphs are all around us。可以用下面的方式表示成一个图。
每个单词表示一个顶点,相邻的两个单词之间会有一条边相连,因为是有向图,所以邻接矩阵不对称。
三、对数据表示成图可以定什么问题
1、图层面的任务
将图进行分类,比如哪个有一个环、哪个有两个环,这种任务编程转一圈就可以实现。
2、顶点层面的任务
空手道例子,有两个老师,其余都是学生,两个老师打架了,那么学生都是站在老师A这边,还是老师B这边。
3、边级层面的任务
语意分割将图片分割,然后去学习边之间的属性,并预测边的属性。
四、在机器学习中使用图(graph)的挑战
1、节点比较多,邻接矩阵很大,而且是个稀疏矩阵,用在GPU上计算一个是一个难题。
2、节点交换顺序,邻接矩阵形状变化,但是要保证神经网络输出的结果保持一致。
一种高效表示稀疏矩阵的方法是使用邻接列表(adjacency list)。如图所示,该图共有8个节点,为了方便,每个节点用一个标量值进行表示,每条边也用一个标量值表示。邻接列表的长度和边的个数相同,列表中每一个元素表示的是一条边的两个节点的标号。值得注意的是,邻接列表中元素的顺序,与edges中元素的顺序是一致的。(大概理解,不知道怎么运用)
五、图神经网络(Graph Neural Network, GNN)
3种数据经过3个MLP,只对属性变换,图的结构没有变换
有一种特殊情况是节点没有向量信息,但是边都具有向量信息,如果仍然要对节点做预测,就要采用一种称为**汇聚”(pooling)**的技术。
对于没有节点信息的二分类任务,其处理流程如下图所示。
GNN图:
缺点:这样3个MLP并没有输入图的结构信息,没有给网络哪个顶点和哪个边之间连接。
六、对GNN层进行优化
在每一层GNN层中加入Pooling,让相邻顶点、边、以及全局信息之间进行信息传递
将加入了消息传递 的GNN 层堆叠在一起,一个顶点最终可以整合来自整个图的信息:在三层之后,一个顶点拥有离它三步距离的顶点的信息。我们将优化后的GNN模型用图来表示
为了让GNN网络能更好的对图进行预测,提取出图中更加丰富的特征信息,我们不局限于在相邻顶点之间进行消息传递,顶点和边之间,边和边之间,顶点和全局信息之间,以及边和全局信息之间都可以进行消息传递。
交换传递
可以设想一个虚拟的点和所有顶点和边相连,汇聚也可以是拼接
为此提出master node(一个虚拟的顶点,它和图中所有的顶点和边虚拟地连接),这个顶点的embedding就是全局信息U。
在顶点信息传递给边的时候,也会把U一起传递,把边信息传递给顶点的时候,也会把U一起传递;然后更新边和顶点后,将边和顶点的信息一起汇聚给U,之后做MLP更新。
总的来说,GNN 就是做了这么一件事情:利用图的节点信息去生成节点(图)的 Embedding 表示。