大家好,又见面了,我是你们的朋友全栈君。
基于图同构网络(GIN)的图表征网络的实现
基于图同构网络的图表征学习主要包含以下两个过程:
- 首先计算得到节点表征;
- 其次对图上各个节点的表征做图池化(Graph Pooling),或称为图读
出(Graph Readout),得到图的表征(Graph
Representation)。
在这里,我们将采用自顶向下的方式,来学习基于图同构模型(GIN)的图
表征学习方法。我们首先关注如何基于节点表征计算得到图的表征,而忽
略计算结点表征的方法。
基于图同构网络的图表征模块(GINGraphRepr
Module)
此模块首先采用GINNodeEmbedding 模块对图上每一个节点做节点嵌入
(Node Embedding),得到节点表征,然后对节点表征做图池化得到图
的表征,最后用一层线性变换得到图的表征(graph representation)。
可以看到可选的基于结点表征计算得到图表征的方法有:
3. “sum”:
对节点表征求和;
使用模块torch_geometric.nn.glob.global_add_pool。
4. “mean”:
对节点表征求平均;
使用模块torch_geometric.nn.glob.global_mean_pool 。
5. “max”:取节点表征的最大值。
对一个batch中所有节点计算节点表征各个维度的最大值;
使用模块torch_geometric.nn.glob.global_max_pool。
6. “attention”:
基于Attention对节点表征加权求和;
使用模块 torch_geometric.nn.glob.GlobalAttention;
来自论文 “Gated Graph Sequence Neural Networks” 。
7. “set2set”:
8. 另一种基于Attention对节点表征加权求和的方法;
9. 使用模块 torch_geometric.nn.glob.Set2Set;
10. 来自论文 “Order Matters: Sequence to sequence for sets”。
基于图同构网络的节点嵌入模块
(GINNodeEmbedding Module)
此模块基于多层GINConv实现结点嵌入的计算。此处我们先忽略GINConv
的实现。此模块得到的节点属性输入为类别型向量,我们首先用
AtomEncoder 对其做嵌入得到第0 层节点表征(稍后我们再对
AtomEncoder做分析)。然后我们逐层计算节点表征,从第1层开始到第
num_layers 层,每一层节点表征的计算都以上一层的节点表征
h_list[layer] 、边edge_index 和边的属性edge_attr 为输入。需要注
意的是,GINConv的层数越多,此模块的感受野(receptive field)越
大,结点i 的表征最远能捕获到结点i 的距离为num_layers 的邻接节点的
信息。
GINConv–图同构卷积层
图同构卷积层的数学定义如下:
PyG中已经实现了此模块,我们可以通过torch_geometric.nn.GINConv
来使用PyG定义好的图同构卷积层,然而该实现不支持存在边属性的图。在
这里我们自己自定义一个支持边属性的GINConv 模块。
由于输入的边属性为类别型,因此我们需要先将类别型边属性转换为边表
征。我们定义的GINConv模块遵循“消息传递、消息聚合、消息更新”这一
过程。
背景:Weisfeiler-Lehman Test (WL Test)
图同构性测试
两个图是同构的,意思是两个图拥有一样的拓扑结构,也就是说,我们可
以通过重新标记节点从一个图中得到另外一个图。Weisfeiler-Lehman 图
的同构性测试算法,简称WL Test,是一种用于测试两个图是否同构的算
法。
WL Test 的一维形式,类似于图神经网络中的邻接节点聚合。WL Test 1)
迭代地聚合节点及其邻接节点的标签,然后2)将聚合的标签散列成唯一的
新标签,该过程形式化为下方的公示。在迭代过程中,发现两个图之间的
节点的标签不同时,就可以确定这两个图是非同构的。需要注意的是节点
标签可能的取值只能是有限个数。在上方的公示中, 表示节点 的第 次迭代的标签,第 次迭代的标签为
节点原始标签。
WL测试不能保证对所有图都有效,特别是对于具有高度对称性的图,如链
式图、完全图、环图和星图,它会判断错误。
Weisfeiler-Lehman Graph Kernels 方法提出用WL子树核衡量图之间相
似性。该方法使用WL Test不同迭代中的节点标签计数作为图的表征向量,
它具有与WL Test相同的判别能力。直观地说,在WL Test的第 次迭代中,
一个节点的标签代表了以该节点为根的高度为 的子树结构。
Weisfeiler-Leman Test 算法举例说明:给定两个图 和 ,每个节点拥
有标签(实际中,一些图没有节点标签,我们可以以节点的度作为标
签)。
Weisfeiler-Leman Test 算法通过重复执行以下给节点打标签的过程来实
现图是否同构的判断:
- 聚合自身与邻接节点的标签得到一串字符串,自身标签与邻接节点的标
签中间用,分隔,邻接节点的标签按升序排序。排序的原因在于要保证
单射性,即保证获得的结果不因邻接节点的顺序改变而改变。2. 标签散列,即标签压缩,将较长的字符串映射到一个简短的标签。 - 给节点重新打上标签。每重复一次以上的过程,就完成一次节点自身标签与邻接节点标签的聚
合。
当出现两个图相同节点标签的出现次数不一致时,即可判断两个图不相
似。如果上述的步骤重复一定的次数后,没有发现有相同节点标签的出现
次数不一致的情况,那么我们无法判断两个图是否同构。
当两个节点的 层的标签一样时,表示分别以这两个节点为根节点的WL子
树是一致的。WL子树与普通子树不同,WL子树包含重复的节点。下图展
示了一棵以1节点为根节点高为2的WL子树。
图相似性评估
此方法来自于Weisfeiler-Lehman Graph Kernels。
WL Test 算法的一点局限性是,它只能判断两个图的相似性,无法衡量图之
间的相似性。要衡量两个图的相似性,我们用WL Subtree Kernel方法。
该方法的思想是用WL Test算法得到节点的多层的标签,然后我们可以分别
统计图中各类标签出现的次数,存于一个向量,这个向量可以作为图的表
征。两个图的这样的向量的内积,即可作为这两个图的相似性的估计。图同构网络模型的构建
能实现判断图同构性的图神经网络需要满足,只在两个节点自身标签一样
且它们的邻接节点一样时,图神经网络将这两个节点映射到相同的表征,
即映射是单射性的。可重复集合(Multisets)指的是元素可重复的集合,
元素在集合中没有顺序关系。 一个节点的所有邻接节点是一个可重复集
合,一个节点可以有重复的邻接节点,邻接节点没有顺序关系。因此GIN模
型中生成节点表征的方法遵循WL Test算法更新节点标签的过程。
在生成节点的表征后仍需要执行图池化(或称为图读出)操作得到图表
征,最简单的图读出操作是做求和。由于每一层的节点表征都可能是重要
的,因此在图同构网络中,不同层的节点表征在求和后被拼接,其数学定
义如下,
采用拼接而不是相加的原因在于不同层节点的表征属于不同的特征空间。
未做严格的证明,这样得到的图的表示与WL Subtree Kernel得到的图的表
征是等价的。
作业:
[6,[4,[1,5,6]]]
[3,[[4,[3,5,6]],[2,[1,3,5]]]]
[1,[[2,[1,3,5]],[5,[1,2,4]]]]
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127041.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...