目录
一、什么数据可以表示成一张图
(1)什么是图?
(2)如何表示图的属性
(3)images as graphs(将图片表示为图)
(4)text as graphs(将文本表示为图)
(5)生活中的图
二、为什么要用图神经网络
(1)图可以用来解决什么问题
(2)将神经网络用到图上有什么挑战
三、GNN的各个模块
(1)什么是GNN
(2)the simplest GNN
MLP 更新
汇聚操作
(3)信息传递(passing message between parts of the graph)
四、实验
(1) GNN Playground
(2)一些GNN设计教训的经验
distill博客文章链接:A Gentle Introduction to Graph Neural Networks
https://distill.pub/2021/gnn-intro/博客中,很多图都是交互图,可以由读者自行操作演示。
李沐老师论文精度视频:
零基础多图详解图神经网络(GNN/GCN)【论文精读】_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1iT4y1d7zP/?from=search&seid=17425771631747736862&spm_id_from=333.337.0.0这是我第一次接触深度学习文章平台Distill Distill — Latest articles about machine learning
2017年3月20日,Google Brain的Chris Olah和Shan Carter发布了一份专注于机器学习研究的新期刊:Distill(蒸馏的意思)。不同于过去百余年间的论文,Distill摆脱以往学术论文只能在纸质版期刊发表的束缚,允许科研人员把可视化的模型和图表整合到论文里,方便读者的理解和交互。
一、什么数据可以表示成一张图
(1)什么是图?
首先建立一个图。图表示的是一系列实体(节点)之间的关系(边)。
图的顶点/边表示的信息叫做attribute
(2)如何表示图的属性
顶点:embedding (一条向量来表示)
边:长度为8的向量
全局信息:长度为5的向量
把节点信息、边信息和全局信息做embedding,通俗地说就是把这些信息存储为向量的形式。所以图神经的核心步骤就是,怎么样把我们想要的信息表示成向量,以及向量是否能通过数据学习到。
(3)images as graphs(将图片表示为图)
通常把图片表示为三维tensor,如224x224x3(学过CNN的同学就知道这里的三通道是指RGB三种颜色)。实际上我们可以把每个像素作为一个点,存在邻接关系则形成一条边。
中间的就是邻接矩阵,相邻则是1,不相邻则是0,【每个蓝色的点表示graph中的一条边,剩下白色的点表示没有边】,一般会是非常大的稀疏矩阵 ,将像素或像素块视为节点,并通过连接相邻节点构建图
(4)text as graphs(将文本表示为图)
文本==>一条序列
把每一个词表示成顶点,一个词和下一个词之间有一条有向边
(5)生活中的图
Molecules as graphs(将分子结构图表示为图)
Social networks as graphs(将社交网络表示为图):奥赛德剧中出现人物的社交网络情况,有边代表两个人同时出现过
Citation networks as graph(将引用网络表示为图):文章之间的引用,会生成一条边,但是往往都是有向边,因为是新文章引用旧文章,双向引用就不太现实了。
二、为什么要用图神经网络
(1)图可以用来解决什么问题
- 图层面上的任务
给定一张图,对该图进行分类;
如上图,预测出哪些分子是具有两个环的。这个例子比较简单,可以用图的遍历来完成,当图非常复杂的时候,图神经网络可以发挥巨大作用。
- 节点层面的任务
上图是空手道俱乐部数据集,可以将学员分类到两个老师的队伍中。蓝色的和老师A在一个阵营,红色的和老师B在一个阵营
- 边层面的任务
边的预测(链路预测)的例子是通过语义分割把人物、背景拿出来,然后分析实体间的关系(属性)。比如黄衣服的人在踢绿衣服的人,他们都站在地毯上。【边上的属性都是预测得来的】
(2)将神经网络用到图上有什么挑战
最核心的问题是怎么样表示图使得图和我的神经网络是兼容的;
图上有四种信息:节点的属性、边的属性、全局的一些信息、连接性【每条边到底连接的是哪两个点】
前面三个可以用向量来表示,那么连接性如何表示呢?
连接性是用邻接矩阵来存储,如果图非常大,比如Wikipedia,则存储不下来。由于是邻接矩阵很稀疏,所以用稀疏矩阵来存储会更好,而稀疏矩阵在GPU上训练一直是个技术难题。并且邻接矩阵任意交换行列,会导致邻接矩阵改变,但是他们其实节点关系不变
那么想要存储高效且不受排序的影响应该如何存储呢?如下:
上图中的节点、边和全局信息都可以用向量表示,而不一定只是标量。adjacency list能够用节点id把边的连接关系表示出来,长度==边数,第i项表示第i条边,连接的哪两个结点。 储存高效且对顺序无关。
那么给一个如上的输入方式,怎么用神经网络来处理呢?
三、GNN的各个模块
(1)什么是GNN
GNN是一个对图上所有的属性,包括顶点、边、全局的上下文进行的一个可以优化的变换,这个变换能够保持住图的对称性信息的【把顶点进行另外一个排序之后整个结果不会变】,GNNs是“graph-in, graph-out”(即进出模型都是graph的数据结构),他会对节点、边的信息进行变换,但是图连接性【每条边到底连接的是哪两个点】是不变的。【只改变属性不改变结构】
(2)the simplest GNN
首先,对节点向量、边向量、全局向量分别构建一个MLP(多层感知机),MLP的输入输出的大小相同。
MLP 更新
三个MLP组成GNN的一层,一个图经过MLP后仍然是一个图。对于顶点、边、全局向量分别找到对应的MLP,作为其更新函数(update function)。可以看到,输出后图的属性变化了,但是图的结构没有改变,符合我们的需求。MLP对每个向量独自作用,不会影响的连接性。堆叠了多层上述的模型后得到了GNN,现在来到最后一层,对节点进行预测。
每个MLP是对每个向量独自作用的,不会考虑所有的连接信息,所以不管对顶点做任何排序都不会改变结果。
总结:图神经网络(GNN)中的 MLP 更新机制
在图神经网络(GNN)中,多层感知机(MLP)被广泛用于更新图中的节点、边和全局信息。这种设计的核心思想是通过 MLP 对每个向量(节点特征、边特征或全局特征)进行独立的非线性变换,同时保持图的结构不变。这种机制不仅能够捕捉节点和边的特征,还能保持图的对称性,即对节点的重新排序不会影响最终结果。
最后一层的输出是如何得到我们要的预测值呢?
以节点分类为例子:在节点分类任务中,目标是对图中的每个节点进行分类。每个节点的最终特征会被传递到一个全连接层,然后通过softmax函数计算每个类别的概率。
汇聚操作
考虑另一种情况,如果说某个节点是没有自己的属性(向量)的,应该怎么做?
这里介绍到pooling的方法。做法就是把节点相连的边向量拿出来,全局向量拿出来,然后将这些向量相加求和,最后经过一个节点共享的全连接输出层得到节点预测结果。
假如没有边向量而只有节点的向量,但是想对每个边做预测
则可以汇聚相连的节点的向量到边上,如下图所示:
一条边连接两条顶点,这两个顶点向量我们可以把他加起来然后得到这个边的向量,然后进入边向量的输出层 。
那如果没有全局向量,只有节点向量呢?
就把全部的节点向量汇聚起来得到一个全局的向量,经过最后全局的输出层得到全局的输出。
不管缺乏哪一类的属性,都可以通过汇聚操作得到想要的属性的向量,最后得到预测值
将上面的两块总结起来就得到一个最简单的GNN:
一张图input----->进入一系列的GNN层【每一层都有三个MLP对应三种不同的属性】---->得到一个保持了整个图结构的输出,但是属性已经发生了变化------>根据你要对哪一个属性做预测添加合适的输出层【缺失信息的话加入合适的汇聚层】 ,即可完成我们要的一个预测
局限性:并没有用到图的结构,仅仅是点、边向量分别做MLP的过程。在GNN block这一块并没有对它使用图的结构信息,即对每个属性做变换时,就是每个属性进入自己的MLP,并么有看到这个顶点是跟哪些边/顶点相连的等连接信息,所以他其实并没有把整个图的信息合理的更新进去你的属性里面,所以最后的结果并不能够充分利用图的信息。
(3)信息传递(passing message between parts of the graph)
在更新某个节点的向量时,会将自己的向量和邻居节点的向量进行聚合操作,然后再传入MLP更新节点的向量。作者说这个过程和标准卷积相似,但其实不完全是。
消息传递分三个步骤进行:
- 对于图中每个节点,收集所有相邻的节点嵌入(或消息)
- 通过聚合函数聚合所有消息(如sum)
- 所有池化信息都通过更新函数(通常是学习的神经网络)传递
任务:对顶点向量进行更新
之前方法:将向量拿过来进入f(即MLP),直接得到顶点向量的更新
信息传递方法:将该顶点向量与其邻居向量都加在一起得到汇聚的向量,将汇聚的向量进入f进行后续操作,得到此顶点向量的更新
四、实验
(1) GNN Playground
1、Playground 展示了一个带有小分子图的图级预测任务。
- 使用 Leffingwell 气味数据集,该数据集由具有相关气味感知(标签)的分子组成。预测分子结构(图形)与其气味的关系是一个有100年历史的问题,横跨化学、物理学、神经科学和机器学习。
- 为了简化问题,只考虑每个分子的单个二元标记,对分子图是否闻起来“刺鼻”进行分类。
- 将每个分子表示为一个图,其中原子是包含其原子身份(碳、氮、氧、氟)的一热编码的节点,键是包含一热编码其键类型(单键、双键、三键或芳香族)的边缘。
- 使用连续的 GNN 层构建针对此问题的通用建模模板,然后使用具有 S 形激活的线性模型进行分类。
2、具体参数说明:
- 更新时每个属性的维度。更新函数是一个 1 层 MLP,具有 relu 激活函数和用于激活归一化的层范数。
- 池化中使用的聚合函数:最大值、平均值或总和。
- 更新的图形属性或消息传递的样式:节点、边和全局表示。通过布尔切换(打开或关闭)来控制它们。
- 基线模型是一个与图无关的 GNN(所有消息传递),将末尾的所有数据聚合到一个全局属性中。切换所有消息传递函数会产生 GraphNets 架构。
3、更好地理解 GNN 如何学习图的任务优化表示—研究了 GNN 的倒数第二层激活。
可以选图神经网络有多少层,汇聚的操作:平均值、加起来、max,顶点、边、全局的向量有多大,每改变一次超参数,则会对其重新做一次训练。真实值用边框表示,预测值用实心表示。若边框和实心都是红色/蓝色,则预测正确。
(2)一些GNN设计教训的经验
- 总的来说,图形属性的交流越多,平均模型的性能就越好。任务以全局表示为中心,因此显式学习此属性也往往会提高性能。节点表示似乎也比边表示更有用,这是有道理的,因为这些属性中加载了更多信息。
- 从这里可以有很多方向来获得更好的性能。希望两个突出两个大方向,一个与更复杂的图算法有关,另一个与图本身有关。
- 到目前为止, GNN 基于基于邻域的池化操作。有一些图形概念很难用这种方式表达,例如线性图形路径(连接的节点链)。设计可以在GNN中提取、执行和传播图信息的新机制是当前的一个研究领域。
- GNN研究的前沿之一不是制作新的模型和架构,而是“如何构建图”,更准确地说,是为图注入可以利用的额外结构或关系。正如粗略地看到的,传达的图形属性越多,就越倾向于拥有更好的模型。在这种特殊情况下,可以考虑通过在节点之间添加额外的空间关系、添加不是键的边缘或子图之间的显式可学习关系来使分子图的特征更加丰富。
ref:
【李沐精读GNN论文总结】A Gentle Introduction to Graph Neural Networks - 知乎
图神经网络简介---A gentle introduction to Graph Neural Networks-CSDN博客