我是蓝色
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yEi1eJgt-1642334328286)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116180512436.png)]
在最近若干年内,随着算力计算的提升,大数据技术的成熟,极大的推动了深度学习神经网络的发展,在各个领域大放异彩,并且也推动了学术界与工业界对于模式识别与数据挖掘的研究。故以前很多依赖人工提取特征的机器学习任务,如:
等都被各种端到端的深度学习范式,例如卷积神经网络(CNN)提取图像特征,Encoder-Decoder模式解决各种序列,长短期记忆LSTM平衡长期与短期关注等多支持,一时间仿佛所有的以前困扰着工业界的难题都得到了充分的解决。
不过纵观这些方法,有几个共同点:
但是对于有些复杂的数据模式,可能目前的手段还是不能够充分的解决,下面就和大家娓娓道来。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rr2ZWeKh-1642334328288)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116180723740.png)]
前面已经介绍过,从传统的深度学习神经网络算法来看,他们都有一个非常重要的共同的特点,那就是他们的数据都是规整的(结构化的,隶属于欧式空间),那么对于非结构化的数据,一种方法是把数据结构化,但是对于无法在欧式空间结构化描述的数据,传统的深度学习方法的表现是不太令人满意的。例如
对于类似上述的数据结构,传统的神经网络无法很好的表达与拟合。这是因为图结构是不规则的,同时图中的节点数量是大小可变,并且节点之间是无序的,同时每个节的相邻节点数量也是不同的。所以以往一些提取特征的利器(例如卷积)在图像(Image)上虽然很容易获得成功,但无法直接应用于图上。此外,现有深度学习算法的一个核心假设是数据样本之间彼此独立。然而,对于图来说图中的每个数据样本(节点)都会有边与其他数据样本(节点)有很强的相关性与依赖性。
那么对于这种不规则的、无序的、非结构的非欧式空间的数据,我们是不是就没有办法了呢?是不是就束手无策了呢?这个时候,聪明的学者们给我们提出了一个新的利器,图神经网络。
近年来,随着图形数据的挑战,人们对深度学习方法在如何在图上应用进行了广泛而深入的投入。最终研究人员借鉴了卷积网络、循环网络和深度自动编码器的思想,定义和设计了用于处理图数据的神经网络结构,由此一个新的研究热点——“图神经网络(Graph Neural Networks,GNN)”,下面我们就介绍下图神经网络。
在介绍图神经网络之前,我们先一起回顾下图的定义。
图(Graph / Network)数据类型可以自然地表达物体和物体之间的联系,在我们的日常生活与工作中无处不在。例如:微信和新浪微博等构成了人与人之间的社交网络;互联网上成千上万个页面构成了网页链接网络;国家城市间的运输交通构成了交通网络。
图最重要的两个概念:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w7Wo7i3O-1642334328288)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116191851265.png)]
网上有很多介绍图的文章,一般要么只介绍图神经网络算法,要么是只介绍图嵌入的,也有图嵌入与图神经网络一起介绍的,但是基本没有和图存储一起介绍的。
根据个人的理解,我不自量力的将图神经网络总共应该包含三个部分,理由如下:
图存储这边可以看下开源的程序的,开山之作就是阿里的欧拉,另外也有许多其他大公司的实现。其实基本都大同小异,本质都是对于节点和边的紧凑存储(非邻接矩阵模式)、充足的算法自由度(节点类型、节点特征、边权重与类型、边特征等自由定义)与超高的计算性能与扩展性的优秀实现,所以需要强大的工程能力。
图存储作为基石,对于图神经网络的构建起到至关重要的作用,不过八卦下,做算法框架的人吧,其实有时候挺悲催的,一锤子买卖,做完了,就没你的事儿了,剩下就是算法工程师的表现了。这可能也就是国内互联网的基建这么拉胯儿的原因吧。
图嵌入的方式比较多,大致有以下几种,下面简单介绍下,后续章节会进行详细描述。
Random Walk:基于随机游走的图嵌入通过使得图上一个短距的随机游走中共现的节点具有更相似的表示的方式来优化节点的嵌入。
DeepWalk:算法主要包含两个部分:一个随机游走序列生成器和一个更新过程,通过节点之间的关系生成图,在DeepWalk算法中,各个节点之间的权重默认为1,DeepWalk 涉及到的随机游走是一种可重复访问已访问节点的深度优先遍历(DFS)算法。给定起始节点,从该节点的邻居中随机选取访问节点,并将新的节点作为起始点继续探索,当该节点没有邻居或者达到序列长度时,退出循环。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TZTg0jm0-1642334328289)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116192158001.png)]
node2vec:通过改变随机游走序列生成的方式进一步扩展了 DeepWalk 算法。DeepWalk 选取随机游走序列中下一个节点的方式是均匀随机分布的,而 node2vec 通过引入两个参数 p 和 q,将宽度优先搜索和深度优先搜索引入了随机游走序列的生成过程。 宽度优先搜索注重邻近的节点并刻画了相对局部的一种网络表示, 宽度优先中的节点一般会出现很多次,从而降低刻画中心节点的邻居节点的方差, 深度优先搜索反映了更高层面上的节点之间的同质性。
图神经网络划分为五大类别,大家可以对照下传统的深度学习神经模型,其实很多都是都是新出了一个领域,把以前领域的经验Copy一遍,都是套路。
图神经网络把以往的传统神经网络道路基本又走了一遍,很多思想都是想通,所谓万法归一,道法自然吧,其实从来都没啥无中生有,有的只是发现而已。下面重点介绍下图卷积神经网络DCN吧,后续的待后面系列再介绍
GCN,图卷积神经网络,实际上跟CNN的作用一样,就是一个特征提取器,不同的是GCN的提取对象是不规则的图数据,并且可以像标准的CNN那样通过反向传播来训练特定任务的损失。
GCN精妙地设计了一种从图数据中提取特征的方法,从而让我们可以使用这些特征去对图数据进行节点分类(node classification)、图分类(graph classification)、边预测(link prediction),还可以顺便得到图的嵌入表征(graph embedding),可见用途广泛。
GCN的公式看起来还是很吓人的,我记得去年读这个论文的时候,经常需要去翻一下我的数学书,总算是大体看明白了。整个公式的推导过程比较复杂,对于大多数人而言不需要去看推导过程,我们只需要掌握核心的过程就好,比如卷积神经网络CNN我只需要了解卷积层和池化层都做了什么就好,对于GCN而言我们也按照这个套路来就好。
论文地址:https://openreview.net/pdf?id=SJU4ayYgl,对于GCN公式推导有兴趣的读者可以去看看。
首先,我来看下GCN的整体网络结构,以下图片摘自论文SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJlwOtR3-1642334328289)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116184916596.png)]
现在我们开始分析下图神经网络的结构,从这个图可以看到从输入层到输出层,节点的数量没有发生变化。
输入样本结构(图结构):假设基于某种图存储的图数据样本共有N个节点(node),每个节点都有自己的特征。
传播方式:GCN也是一个神经网络层,它的层与层之间的传播方式是,这个公式中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xOcPuGq-1642334328290)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116185909904.png)]
并且论文中提出了快速的实现,精确的方案的一种近似,和多层化。似乎改动不大,但是效果显著。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsplwrYT-1642334328290)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116195343956.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxyWEObW-1642334328291)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116195410068.png)]
GCN输入一个图,通过若干层GCN每个node的特征从X变成了Z,但是,无论中间有多少层,node之间的连接关系,即A,都是共享的,并且输入层的节点数量
假设我们构造一个两层的GCN,激活函数分别采用ReLU和Softmax,则整体的正向传播的公式为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Po0UV9m-1642334328291)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116185803395.png)]
当然,你也可以用这个方法去做graph classification、link prediction,只是把损失函数给变化一下即可。
例子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PVK8Wtwu-1642334328292)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116195618710.png)]
实验结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czOeD6Kl-1642334328293)(/Users/dubaokun/Desktop/1 work/1.历练成长/进步成长/图片/image-20220116195657677.png)]
代码实现
Pytorch实现:https://github.com/tkipf/pygcn
Tensorflow实现:https://github.com/tkipf/gcn