GNN
参考:A Gentle Introduction to Graph Neural Networks (distill.pub)
零基础多图详解图神经网络(GNN/GCN) (youtube.com)
总结:首先是一个图的三要素是:点v,边e,整体U。然后边是有无向边和有向边,然后每个点和边和整体都能存储信息。
对于图片的存储可以将像素点和周围的像素点进行相连就是一个图,对于文本来说就是一个句子,然后连起来,这也是一个图。而且对于其他很多东西都可以看成图,比如一个化学分子,里面的一个分子旁边联系其他的分子,这也是图,在生活中,在歌剧中,不同人物同时出现也可以进行连接,也是一张图,有很多东西都可以抽象成图。
图的预测问题
图的预测问题需要的是三个问题:图,边,点。低于图就是要预测图的单一属性 ,对于节点级任务,我们要预测图中每个节点的某些属性。在边缘级任务中,我们要预测图中边缘的属性或存在。
图的任务:
举个例子就是说我在图这个级别,就比如我想要查找到有两个环的分子,我就要在图这个层面的来判断这个属性。我们希望将标签与整幅图像关联起来。对于文本,类似的问题是情感分析,我们希望一次性识别整个句子的情绪或情感。
节点的任务:
节点级预测问题的一个经典例子是扎克的空手道俱乐部。该数据集是一个单一的社交网络图,由在政治分歧后宣誓效忠于两个空手道俱乐部之一的个人组成。故事讲述的是,Hi 先生(教练)和 John H(管理员)之间的不和导致了空手道俱乐部的分裂。节点代表空手道练习者个人,边代表这些成员之间在空手道之外的互动。预测问题是对某个成员在不和之后是忠于 Hi 先生还是忠于 John H 进行分类。在这种情况下,节点与教练或管理员之间的距离与这一标签高度相关。根据图像类比,节点级预测问题类似于图像分割,我们试图标记图像中每个像素的角色。对于文本,类似的任务是预测句子中每个单词的语音部分(如名词、动词、副词等)。
边的任务:
边缘级推理的一个例子是图像场景理解。除了识别图像中的物体,深度学习模型还可用于预测它们之间的关系。我们可以将其表述为边缘级分类:给定代表图像中物体的节点,我们希望预测这些节点中哪些共享一条边缘,或者这条边缘的值是多少。如果我们希望发现实体之间的联系,我们可以考虑完全连接的图,并根据预测值修剪边,从而得到一个稀疏的图。
在机器学习中使用图的挑战
首先是图的连通性,因为数据量很大,所以我们用的邻接矩阵,由于数据比较稀疏,而且稀疏矩阵在深度学习中不好处理。
比如一个四个节点组成的邻接矩阵就已经有相当多的,就有24个,所以当节点很多,那么数据量很大。
我们可以用邻接表来解决问题,图中每个节点/边/全局使用的是标量值,但大多数实用的张量表示法都是每个图形属性使用向量。我们将处理的是大小为 [nnodes] 的节点张量,而不是 [nnodes] 的节点张量。我们将处理大小为 [nnodes,nodedim] 的节点张量。
什么是GNN
GNN 是对图的所有属性(节点、边、全局上下文)进行的可优化变换,它保留了图的对称性(包络不变性)。这个就是GNN的假设,保证了图的不变性,就是说,无论GNN怎么样,图都是不会变的。
最简单的GNN
为简单起见,前面的图使用标量来表示图属性;实际上,特征向量或嵌入要有用得多。这种 GNN 在图的每个分量上使用一个单独的多层感知器 (MLP)(或你最喜欢的可微分模型);我们称其为 GNN 层。对于每个节点向量,我们应用 MLP,并得到一个学习到的节点向量。我们对每条边进行同样的处理,学习每条边的嵌入,同时也对全局上下文向量进行处理,学习整个图的单一嵌入。
就是说我把u,e,v扔到一层mlp层就会输出新的u,e,v,但是这个最简单的就是三个数据都是独立的,就是不会对另外两个属性造成影响。
通过Pooling信息进行 GNN 预测
我们已经构建了一个简单的 GNN,但如何对上述任务进行预测呢?我们将考虑二元分类的情况,但这一框架很容易扩展到多类或回归情况。如果任务是对节点进行二元预测,而图中已经包含了节点信息,那么方法就很简单了–对每个节点嵌入应用一个线性分类器。就这个可以缩写成c。
图中的信息可能存储在边中,但节点中没有信息,但仍需要对节点进行预测。我们需要一种方法来收集边上的信息,就是把每一个点连接的边,并将其提供给节点进行预测。我们可以通过汇集来实现这一目的。汇集分两步进行:对于要汇集的每个项目,收集它们的每个嵌入信息,并将它们连接成一个矩阵。然后,通常通过求和操作对收集到的嵌入式数据进行汇总
因此,如果我们只有边缘级特征,并试图预测二进制节点信息,我们可以使用池化技术将信息路由(或传递)到需要的地方。模型看起来是这样的,此时我们只有边的特征就是通过池化层,然后在进行分类器分类就可以得到预测的v。同理其他请况也是这样。
在我们的例子中,分类模型 c可以很容易地被任何可微分模型所替代,或者使用广义线性模型来适应多类分类。
现在我们已经证明,我们可以建立一个简单的 GNN 模型,并通过在图的不同部分之间路由信息来进行二进制预测。这种汇集技术将成为构建更复杂 GNN 模型的基石。如果我们有了新的图属性,我们只需定义如何将信息从一个属性传递到另一个属性。请注意,在这个最简单的 GNN 模型中,我们在 GNN 层内完全没有使用图的连接性。每个节点、每条边以及全局上下文都是独立处理的。我们只在汇集信息进行预测时使用连接性。
这个流程是读入图,然后经过GNN层mlp,让后的得到新的图,然后进入分类器,最后预测。
在图的不同部分之间传递信息
三个步骤:
首先对于图中的每个节点,收集所有相邻节点的嵌入(或信息)。
通过聚合函数(如 sum)汇总所有信息。
所有汇集的信息将通过一个更新函数(通常是一个学习的神经网络)进行传递。
中间的transgorm information可以看出一个f
这一系列操作只需应用一次,就是最简单的信息传递 GNN 层。这不禁让人联想到标准卷积:从本质上讲,信息传递和卷积都是汇总和处理元素邻域信息以更新元素值的操作。在图中,元素是一个节点,而在图像中,元素是一个像素。然而,图中相邻节点的数量可以是可变的,而图像则不同,每个像素都有固定数量的相邻元素。通过将消息传递 GNN 层层堆叠在一起,一个节点最终可以包含来自整个图的信息:经过三层之后,一个节点就可以获得距离它三步远的节点的信息。我们可以更新架构图,将这一新的节点信息源纳入其中。
但是卷积的3×3的方块,每次都是不一样的,但是图确实一样的。
学习边缘表征
我们的数据集并不总是包含所有类型的信息(节点、边缘和全局上下文)。当我们想对节点进行预测,但我们的数据集只有边缘信息时,我们在上文展示了如何使用池化技术将信息从边缘传递到节点,但只在模型的最后预测步骤中使用。
我们可以在 GNN 层内使用消息传递在节点和边缘之间共享信息。我们可以采用与之前使用邻近节点信息相同的方式,将邻近边缘的信息纳入其中,方法是首先汇集边缘信息,使用更新函数对其进行转换,然后将其存储起来。然而,图中存储的节点信息和边信息的大小和形状不一定相同,因此如何将它们结合起来并不明确。一种方法是学习从边缘空间到节点空间的线性映射,反之亦然。另一种方法是在更新函数之前将它们串联起来。
就是说比如我们知道的是边的特征,然后想给点的特征进行更新,就将边组成的信息给到点,然后回到边的信息。
还有好几种情况:节点到节点(线性)、边缘到边缘(线性)、节点到边缘(边缘层)、边缘到节点(节点层)。
就拿节点然后到边缘举例,就是先将数据给点然后再给到边,和节点数据给到边然后再给回节点是有区别的。
添加全局表示
迄今为止,我们所描述的网络存在一个缺陷:图中相距较远的节点可能永远无法有效地相互传递信息,即使我们多次应用消息传递也是如此。对于一个节点,如果我们有 k 层,信息最多只能传播 k 步。如果预测任务依赖于相距甚远的节点或节点组,这就会成为一个问题。一种解决方案是让所有节点都能相互传递信息。遗憾的是,对于大型图而言,这种方法的计算成本很快就会变得很高(尽管这种被称为 “虚拟边 “的方法已被用于分子等小型图)。
解决这一问题的方法之一是使用图的全局表示法(U),有时也称为主节点 或上下文向量。这个全局上下文向量与网络中的所有其他节点和边相连,可以作为它们之间传递信息的桥梁,为整个图建立一个表征。这就为图形创建了比学习到的更丰富、更复杂的表示。
在这种观点中,所有图属性都有学习到的表征,因此我们可以在池化过程中,通过将我们感兴趣的属性的信息与其他属性的信息进行比对来利用这些表征。例如,对于一个节点,我们可以考虑来自邻近节点、连接边和全局信息的信息。为了将所有这些可能的信息源作为新节点嵌入的条件,我们可以简单地将它们连接起来。此外,我们还可以通过线性映射将它们映射到同一空间,然后添加它们或应用特征调制层这可以被视为一种按特征划分的关注机制。
就是说我想要对边的特征更加细致,那我可以用全局的特征和点的特征拿去处理,同理对其他的属性也是如此。
A Gentle Introduction to Graph Neural Networks (distill.pub)在gnn-intro一文中的playground我们可以看到有几个超属性,有深度,pooling池的聚合方式,点的数据集大小,边的数据集的大小,全局的数据集的大小。然后AUC就可以看出这个模型拟合程度,越高越好
GNN 中的采样图和批处理
训练神经网络的常用方法是通过随机恒定大小(批次大小)的训练数据子集(迷你批次)计算梯度来更新网络参数。由于相邻节点和边的数量存在变化,这意味着我们无法设定恒定的批次大小,因此这种做法对图形来说是一个挑战。对图形进行批处理的主要思路是创建子图,以保留较大图形的基本属性。这种图采样操作高度依赖于上下文,涉及从图中子选择节点和边。在某些情况下(引文网络),这些操作可能是合理的,而在其他情况下,这些操作可能过于强势(分子,一个子图仅仅代表一个新的、更小的分子)。如何对图进行采样是一个尚未解决的研究问题。如果我们关心的是在邻域级别保留结构,那么一种方法就是随机抽取一定数量的节点,即我们的节点集。然后添加与节点集相邻的距离为 k 的相邻节点,包括它们的边。每个邻域可视为一个单独的图,GNN 可在这些子图的批次上进行训练。由于所有相邻节点都有不完整的邻域,因此可以掩盖损失,只考虑节点集。更有效的策略可能是先随机抽样一个节点,将其邻域扩大到距离 k,然后在扩大的集合中挑选其他节点。一旦构建了一定数量的节点、边或子图,就可以终止这些操作。如果情况允许,我们可以通过选取一个初始节点集,然后对一定数量的节点进行子采样(例如随机采样,或通过随机漫步或 Metropolis 算法)来构建恒定大小的邻域。
就比如说我想采样一张图,我可以随机步长采取一定的图的属性,或者完全随机采样都可以。
归纳偏差
当建立一个模型来解决特定类型数据上的问题时,我们希望对模型进行专门化,以充分利用该数据的特性。如果能成功做到这一点,我们往往能看到更好的预测性能、更少的训练时间、更少的参数和更好的泛化效果。
例如,在对图像进行标注时,我们希望利用这样一个事实:无论狗是在图像的左上角还是右下角,它仍然是一只狗。因此,大多数图像模型都使用卷积,而卷积具有平移不变性。对于文本而言,标记的顺序非常重要,因此递归神经网络会按顺序处理数据。此外,一个标记的出现(如 “不是 “一词)会影响句子其余部分的意思,因此我们需要能够 “关注 “文本其他部分的组件,而 BERT 和 GPT-3 等转换器模型就能做到这一点。这些都是归纳偏差的一些例子,在这些例子中,我们正在识别数据中的对称性或规律性,并添加利用这些特性的建模组件。
就图而言,我们关心每个图组件(边、节点、全局)之间的关系,因此我们寻求具有关系归纳偏向的模型。
模型应保留实体间的明确关系(邻接矩阵)并保留图的对称性(排列不变性)。我们希望实体间的互动非常重要的问题能从图结构中受益。具体来说,这意味着在集合上设计转换:节点或边的操作顺序不重要,操作应适用于可变数量的输入。
GNN
https://ljw030710.github.io/2024/04/16/GNN/