图神经网络是怎么炼成的:GNN基本原理简介40
发表时间:2022-07-13 08:44 十多年来,研究人员开发了一种称之为图神经网络(Graph Neural Networks,GNNs)的技术,旨在将如今在深度学习的诸多任务中摧枯拉朽的神经网络,应用到图结构之上,从而让神经网络捕捉到更错综复杂的交叉特征,以期待在一些任务上取得更佳的效果。鉴于操作图数据结构的复杂性,尽管已经发展了十几年,它在实际应用中却刚刚起步,即时是google也才开始研究将其被应用到药品研发、物理模拟、假新闻检测、交通预测和推荐系统等领域。 图是什么尽管GNN是一个新兴的研究领域,但图结构的数据其实在我们身边无处不在。那么什么是图呢? 这个理科生应该都清楚,图有点(Vertex)和边(Edge)两部分组成,一个图就代表了各个实体节点(node)之间的关系(edge): 每个节点或者边都可以包含它的一些属性信息,比如如果一个节点表示一个人,那么就可以包含这个人的姓名、性别、身高、体重之类的..我们研究需要的信息。 还有别忘了一点,边是可以有方向的,按此我们还能分为有向图或是无向图。边的方向代表了信息的传递方向,例如a是b的微信好友,那b也是a的微信好友,好友关系自然是没方向的,而比如a是b的爹,那显然b就不是a的爹,此时叫爹的关系就是有有方向的。 图结构的构建是非常灵活的,可以根据个人的设计构建出各种不一样的图。而作为开发者显然要结合实际解决的问题来构建合适的图。 图在哪里正如前面所提到的,图无处不在。你可能已经熟悉例如知识图谱、社交网络之类的图数据。当时显然,图是一种极其强大的通用数据表示,传统神经网络中用到的欧式空间的数据,同样可以用图来表示,例如可以将图像和文本建模为图结构数据。 图像表示为图比如,我们可以将一张图片的每个像素作为图的节点,再将相邻的像素用边连接起来,就构造了一个该图像的图。 如上图展示了一个5*5的图片的邻接矩阵表示和图表示。 文本表示为图我们将每个单词作为节点,并将每个节点连接到下一个节点,就得到了一个文本的图: 当然,在实践中我们并不会这样来编码文本和图像,因为所有的图和文本都是非常规则的结构,表示成图就多此一举了。 分子图表示为图分子是构成物质的基石,我们可以用节点来表示它的原子和电子,用边来表示共价键,这样便将一个分子表示成了一个图: 不同的图可以表示出不同的分子结构: 社交网络表示为图都说社会是一个大熔炉,身处其中的人和事物之间会发生极其复杂的关系。这种关系的表示用普通的表格数据是很难表示的,而图却能很好的展现。 下图是将莎士比亚歌剧《奥赛罗》中的任务关系表示成图: 怎么样,如果没看过歌剧能推测出那些是主角吗? 下面是将一个空手道竞标赛的对战关系构建为图: 类似的可以表示为图的数据还有很多很多,比如论文的引用之类统统都可以表示为图,下面是现实世界中不同规模的数据图表示的统计数据: 可见,各种各样规模的数据都可以轻松的用图来表示。 图解决什么问题在上面我们列举了这么多的图,那么我们该对这些图数据执行什么任务呢? 图上的预测任务一般分为三类:
下面我们通过具体的示例来说明GNN怎么来解决上述的三个级别的预测问题。 图级任务在图级别的任务中,我们的目标是预测整个图的属性。例如我们通过分子图,来预测该分子的气味或是者它是否是与某些疾病有关的受体。 输出是图的分类: 例如上图用于分类一个图是否有两个环.. 这种任务,有点像是图像分类和文本分类,预测整个图像或是文本是哪一类。 节点级任务节点级任务一般就是预测每个节点的类型。 边级任务边级任务其实就是预测每个边的属性. 用图表示就是这样的过程: 在机器学习中使用图的挑战那么我们要如何使用神经网络来处理上述各种类型的任务呢? 首先要考虑的是如何将图结构数据适配到神经网络. 不过,好在有一种更加优雅的方式来标识邻接关系,即邻接表. 如上图所示,我们还是用一个向量来标识nodes和edges和global,然后用一个adjacency list来记录连接关系,比如[1,0]标识节点1和节点2相连...这样就解决了上述邻接矩阵的各种问题了~ GNN是怎么炼成的现在,我们成功的将图结构成功表示成了置换不变的矩阵格式,终于可以使用图形神经网络(GNN)来做图形预测任务了。 最简单的GNN我们使用最开始提到的那个图来构建一个最简单的GNN,输入的图是相应节点,边,全局信息的向量,我们针对每个向量使用一个MLP层来作变换,于是得到一个新的图. 针对上述构建的最简单的GNN,我们如何在上面描述的任何任务中进行预测呢?这里我们仅仅考虑二进制分类的情况,但这个框架可以很容易地扩展到多类或回归的情况。 但是上面的预测过程有点过于简单了,完全没有用到图的结构信息,我们在此基础上增加一个pooling操作,以增加它的边缘信息: 具体操作是把待预测节点的邻居节点以及全局的信息进行聚合再做预测,即将这些embedding向量加到一起得到一个新的向量,再输入到最后的线性分类器. 同理,如果我们只有节点相应边的信息的话,也可以用类似的方式pooling,然后得到节点的向量表示再输入分类器: 反之,如果我们只有节点的信息,那么也可以用边所连接的两个节点来pooling出边的向量,然后将器输入到分类器预测边的类型: 当然,如果我们只有节点的信息而要预测全图的类型,我们同样可以将节点信息和全局信息全部聚合之后,再将聚合信息输入到分类器做预测: 显然,不管是哪种任务,整个GNN的推理过程都是一样的,可以表示为这样一个端到端的过程: 不过,显而易见的,这个简单的GNN在分类前只是对每个向量进行了一个变换,而没有用到图结构的任何信息,虽然在最后做预测的时候做了一些pooling的聚合,但也始终没有用到adjacency的信息,因此这个GNN的作用相当有限,但是它为我们提供了一个图结构层变换和堆叠的基本思路. 在图的各部分进行信息传递针对上面最简单GNN的不足,我们可以在其中根据连通性增加更加复杂的变换从而引入整个图结构的信息,我们将这个过程称之为信息传递.
这个过程有点类似于卷积操作,每个节点汇聚了其邻居的节点,经过多个层的变换,它将涵盖全图的信息. 然后,我们发现它并没用用上边的信息,于是可以把边信息也加上,变成这样: 另外,我们可以发现聚合顺序不同,结果就会不同: 那么按照哪个顺序呢?这并没有明确的答案,就靠开发者来决策了,或者使用一种交替聚合的策略,这样就跟顺序无关了: 既然把边的信息加上了,那怎么可以漏掉全局信息呢,于是完整的信息传递就可以表示成这样: 在这个视图中,所有图属性都学习了表示,因此我们可以在pooling过程中通过调节我们感兴趣的属性的信息相对于其余属性来利用它们。例如,对于一个节点,我们可以考虑来自相邻节点、连接边和全局信息的信息。为了在所有这些可能的信息源上调节新节点嵌入,我们可以简单地将它们连接起来。此外,我们还可以通过线性映射将它们映射到相同的空间并累加它们或应用特征调节层,这可以被认为是一种特征化注意力机制。 以上,我们梳理了最简单的GNNs是怎么完成的,你应该已经对GNN有了一个基本的了解,就像学会了传统神经网络中最简单的全连接网络类似,关于GNN还有更多不同种类的更复杂的图需要取了解和学习,但你只要掌握了以上的思想,学习起来也是十分容易的. 上一篇什么是算子
|