图表征学习是指将整个图表示成低维、实值、稠密的向量形式,用来对整个图结构进行分析,包括图分类、图之间的相似性计算等。 相比之前的图节点,图的表征学习更加复杂,但构建的方法是建立在图节点表征的基础之上。为了高效地理解图表征学习的原理、掌握实现图表征的的工具和方法,本文先从最早的图表征方法开始介绍,然后介绍基于GNN的图表征学习方法及其Python实践。
1. 最早的图表征方法:Weisfeiler-Leman
1.1 图同构(Graph Isomorphism)
同构图是图论中的一个重要概念,一般认为如果两个图中对应节点的特征信息(attribute)和结构信息(structure)都相同,则称这两个图同构,如下图所示:
上图的映射关系为:A − 3; B − 1; C − 2; D − 5; E−4。 这个还算比较简单,但是如果节点和边的数量都增加了,可能就没法一眼看出,如下图所示。
在真实世界中,我们可能需要计算社会网络、蛋白质、基因网络等可能具有几百万节点,几千条万条边的图的相似性,这是无法依赖人工是识别和计算的。
1.2 图同构测试(Graph Isomorphism Test)
在计算机科学领域,图同构测试是一个NP问题,即给定两个图,返回他们的结构是否相同。 图同构问题是一个非常难的问题,目前为止还没有多项式算法能够解决它。为了能够同时考虑图节点的特征和结构信息,将节点的不同类型信息合并转换为一个数值向量是一个解决思路。最后,两个图的相似度问题可以转化为两个图的节点数值向量集合的相似度问题。 目前最有效的算法是 Weisfeiler-Lehman 算法,可以在准多项式时间内进行求解。
1.3 WL算法的步骤
给定两个图 G 和 G‘ ,每个节点拥有标签,图同构判断的过程如下:
-
聚合邻居节点:合并自身标签与邻接节点的标签,中间用 “,” 分隔。
-
合并标签排序:按升序排列邻居节点的标签(例如 4,3151 → 4,1135)
-
标签压缩映射:将较长的字符串映射到一个简短的标签。
-
更新节点标签:给节点打上新映射好的短标签。
迭代 N 轮后,可利用计数函数分别得到两张图的特征向量,然后计算图之间的相似性。如下图:
直观上来看,WL-test 第 k 次迭代时节点的标号表示的是结点高度为 k 的子树结构:
以节点 1 为例,右图是节点 1 迭代两次的子树。因此 WL-test 所考虑的图特征本质上是图中以不同节点为根的子树(整个子树是作为特征)的计数。 值得注意的是,与 WL 算法类似