《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。
前一篇从个人角度介绍S&P21的离地攻击(Living-Off-The-Land)系统分析,这是一篇非常经典的论文。这篇文章将带来清华唐杰老师的分享“图神经网络及认知推理总结和普及”或“Graph Neural Networks and Applications—A Review”。唐老师也是学术界大牛,真心值得我们学习。同时文章融合了自己十年NLP的理解及相关资料补充,只希望帮助更多初学者,且看且珍惜,写得不好的地方请海涵。这些大佬是真的值得我们去学习,献上小弟的膝盖~fighting!
在此感谢B站的“感谢吕同学”老师的视频,同时文章中插入了很多原文链接,感谢哪些大牛和老师们。
前文赏析:
主要分享我们在图神经网络相关的研究以及分享一些思考和发展。
从整个相关的研究往前看上20年,会发现整个大的背景是由许多网络化的数据组成,比如阿里巴巴、facebook、微博、头条、微信等都会产生海量的网络数据。现在数据隐私保护越来越好,但这些公司会有大量的比赛,提供数据供我们做科学研究。
这里面有大量的工作可以做,除了社交媒体数据,我们放大看,还会看到各种各样的网络数据,比如:经济方面的数据、生命科学和医学方面的数据,即研究不同药物成分和基因间的关系,有时候这些与人类生活息息相关的数据反而影响更大;还有底层的Internet,我们现在的互联网太关注上层,但事实上整个互联网发展,如可信验证或其他底层机理也非常重要;当然还有神经本身的网络,很多人可能觉得我们已经将DNN、CNN研究透了,会觉得直接这么使用就好了,但我们不应该单纯研究DNN,是不是还应该研究生物神经网络,从中学习新的知识。
大家知道生物神经网络和人工神经网络的区别吗?
生物神经网络和人工神经网络差别非常大,我们这种可计算的神经网络是生物神经网络的简化,神经网络里面有很多神经元、突触,其机理非常复杂,并且突触数量远大于神经元,那里面甚至产生化学物质和刺激。那里面的机理我们也不清楚,我们更多是通过输入构建模型,然后判断输出好。生物神经网络能从另一个角度理解人的机理, 神经网络是在模拟人的计算,现在虽然效果好,但是如果未来想继续提高一个数量级,怎么做呢?因此,很多人在研究(生物)神经网络本身形成网络的机理。
生物神经网络(Biological Neural Network):一般指生物的大脑神经元、细胞、触点等组成的网络,用于产生生物意识,帮助生物进行思考和行动。每个神经元可以看做一个小的处理单元,这些处理单元按照某种方式相互连接起来,构成了大脑内部的生物神经元网络,这些神经元之间连接的强弱,按照外部的激励信号作自适应变化,而每个神经元又随着接收到的多个激励信号的综合大小,呈现兴奋或抑制状态。本质上,人工神经网络是一个能让计算机处理和优化的数学模型,而生物神经网络是通过刺激,产生新的联结,让信号能够通过新的联结传递而形成反馈。
机器学习中的网络分类如下:
Machine Learning with Networks
Node classification(节点分类或排序)
Link prediction(节点之间的关系预测)
Community detection(社区检测)
Network similarity(网络相似度)
所以,网络化的学习做了大量的研究。图神经网络的发展历程如下图所示:
(1) Hinton早期(1986年)
图神经网络最早也不是这样的,从最早期 Hinton 做了相关的思路,并给出了很多的ideas,他说“一个样本可以分类成不同的representation,换句话,一个样本我们不应该去关注它的分类结果是什么,而更应该关注它的representation,并且它有很多不同的representation,每个表达的意思可能不同” ,distributed representation
后接着产生了很多相关的研究。
(2) 扩展(Bengio到Word2Vec)
Andrew Ng 将它扩展到网络结构上(结构化数据),另一个图灵奖获得者Yoshua Bengio将它拓展到了自然语言处理上,即NLP领域如何做distributed representation,起初你可能是对一个样本representation,但对自然语言处理来讲,它是sequence,需要表示sequence,并且单词之间的依赖关系如何表示,因此2003年Bengio提出了 Nerual Probabilistic Language Model
,这也是他获得图灵奖的一个重要工作。其思路是:每个单词都有一个或多个表示,我就把sequence两个单词之间的关联关系也考虑进去。
但是,当时做出来后由于其计算复杂度比较高,很多人无法fellow。直到谷歌2013年提出 Word2Vec
,基本上做出来一个场景化算法,之后就爆发了,包括将其扩展到paragraph、文档(Doc2Vec)。补充一句,Word2Vec是非常经典的工作或应用,包括我们安全领域也有相关扩展,比如二进制、审计日志、恶意代码分析的Asm2Vec、Log2Vec、Token2Vec等等。
(3) 网络化数据时期(Deepwalk)
此后,有人将其扩展到网络化的数据上,2014年Bryan做了 Deepwalk
工作。其原理非常建立,即:原来大家都在自然语言处理或抽象的机器学习样本空间上做,那能不能针对网络化的数据,将网络化数据转换成一个类似于自然语言处理的sequence,因为网络非常复杂,网络也能表示成一个邻接矩阵,但严格意义上没有上下左右概念,只有我们俩的距离是多少,而且周围的点可多可少。如果这时候在网络上直接做很难,那怎么办呢?
通过 随机游走 从一个节点随机到另一个节点,此时就变成了了一个序列Sequence,并且和NLP问题很像,接下来就能处理了。
随后又有了LINE(2015)、Node2Vec(2016)、NetMF(2018)、NetSMF(2019)等工作,它们扩展到社交网络领域。我们的工作也给了证明,这些网络本质上是一个Model。
(4) 图卷积神经网络(GCN)时期
2005年,Marco Gori 实现了 Graph Neural Networks
。2014年,Yann Lecun 提出了图卷积神经网络 Graph Convolutional Networks
。2017年,Max Welling将图卷积神经网络和图数据结合在一起,完成了 GCN for semi-supervised classification
,这篇文章引起了很大关注。还有很多不做卷积工作,因此有很多Graph Neural Networks和Neural Message Passing(一个节点的分布传播过去)的工作。Jure针对节点和Transductive Learning又完成了 Node2vec
和 grahpSAGE
两个经典工作。我们最近也做了一些工作,包括 Graph Attention Network
。
GraphSAGE 是 2017 年提出的一种图神经网络算法,解决了 GCN 网络的局限性: GCN 训练时需要用到整个图的邻接矩阵,依赖于具体的图结构,一般只能用在直推式学习 Transductive Learning。GraphSAGE 使用多层聚合函数,每一层聚合函数会将节点及其邻居的信息聚合在一起得到下一层的特征向量,GraphSAGE 采用了节点的邻域信息,不依赖于全局的图结构。
Data Mining over Networks
第一部分花费大量时间介绍了研究背景,接下来我们讲讲为什么网络化数据或社交网络中要做这样的工作呢?
Let us start with an example — Social influence and prediction
原来在机器学习中也可以做,比如社交网络中信息的传播以及热点事件的情感预测。
因此,需要做很多相关的研究。节点之间可能会相互影响,也可能节点邻居都做Negative,也许我也会做Negative,这就是Conformity(一致性),它也是社交网络或现实社会中的现象。还有就是Structural influence,很多时候不是简单地重做,有时候有逆反心理。
以《王者荣耀》为例,v1和v2周围都有6个节点,这6个节点都在玩王者荣耀,这两个图的区别是什么?主要是边不同,对v1和v2虽然都有6个用户在玩,但v1形成了三个小的子图(C、AD、BEF)。
假设现在v1和v2都不玩了,现在要发条信息给v1和v2,告诉他们还有6个朋友在玩?大家觉得v1回来的概率高,还是v2?
其结果显示:在社交网络中,人被影响的恰恰是你的潜意识。v2的潜意识是这些人都不相关,我的不同的朋友都还在玩,觉得大家都在玩,就跟着玩;v1觉得他们都认识,比如就高中朋友在玩。
回到本质,你在机器学习中要把它转换成features,你需要去定义,但过程很麻烦。刚才只是几个节点,尤其是需要泛化到更多节点时,就非常麻烦。
原来的机器学习方法会通过以下工作实现。
但是,特征定义是非常乏味和低效的。
所以,最近可以通过表示学习、Embedding、图神经实现,它们都在做一件事,即:
所以接下来唐老师将给大家介绍表示学习进展和GNN的知识,包括一些应用。
(1) 首先,我们看看网络中的表示学习,我们应该做什么事情。
本质上,给定一个网络,我们需要学习一个表示,这个表示在d维空间(如二维)找到两个节点之间的距离,如果两个节点label一样,则距离越近,反之越远。
(2) 为什么这个问题很难呢?
如果是sequence,还是比较简单,NLP可以直接处理。但如果是网络,它很难用数学模型描述,并且不同网络会有不同的属性,比如社交网络的社交属性,如三角关系,朋友的朋友是朋友,但这用一般的模型就描述不了,而这个属性又非常强。如果描述好了,社交网络的效果会大大提高。这个属性在公用网络中又不适用,它适用中心节点的属性。所以比较难。
(3) 大家可能看的第一篇引起关注的就是Word2Vec,早期主要应用在自然语言处理中。
补充:其实我是2014年接触这个工作的,自己阅读量最高的博客还是C语言实现Word2Vec,后面随着深入了解,有了更多的用法,但仍然有很多疑惑,希望未来能更深入地理解和运用。
Word2Vec:给定一个单词,提取其上下文单词,然后组成一个向量。基于这样的向量做一个表示学习,学习的本质和原来的NLP思路一样。如下图所示,如果两个单词一样或很相似,则组成的向量也很相似(上下文相似),如“stars”。
(4) 然而,向量模型必须要用严格的单词组成,缺乏语义信息,比如有个单词和某个植物单词很相似,但是无法描述。那怎么办呢?
我们需要将其映射到隐空间上,我们将每个单词映射到d维的空间上,如果两个单词很相似,其距离很近,反之距离越远。
(5) 那么,如果给定一个图,又该如何表示呢?
我们同样可以做类似的事情,图中每个节点都有context(上下文),它周围的节点就是context,我们可以用一个单词周围的节点来组成一个向量。如果两个节点很相似的话,它邻居节点也很相似。
此时遇到一个新的问题:网络跟上下文不一样,因为网络很难说有2度、3度纳入图,如果设置成6会将全世界都纳入进来。Facebook之前发过Nature,世界是由3点多度组成,所以很难直接引用这种思路。
为了解决这个问题,随机游走的思路被提出并被大量引用。
2014年,Bryan做了DeepWalk工作。既然直接计算节点的邻居无法做,那能不能通过游走实现。DeepWalk和graphSAGE的思路都是随机,之后再网络化数据中有大量的使用。此外,网络化数据中有大量的冗余,只要捕获其中一个信息,也许就能影响到其它信息。
DeepWalk怎么做的呢?
从任意节点跑一个Random walk,形成一个path,这个path与文本上那个一样。有了该结果后,剩下的事就很简单。假设每个节点学到d维的表示刚开始是随机的,通过随机结果和SkipGram来判断v3、v5能不能出现,最后的学习就用这个结果来预测单词是否存在,可以通过Softmax提升结果。
(1) Random walk
Random Walk生成如下图所示的结果:
(2) Representation Mapping
随机路径生成:
向量表征过程如下:
(3) SkipGram with Hierarchical softmax
(4) 参数学习
包括随机初始化权重,使用SGD(随机梯度下降)来更新分类器的权重和节点表示
实验结果如下图所示,比如给BlogCatalog数据打标签,一定程度提高聚类效果。
同时也在YouTube数据集进行测试。
贡献:这篇文章给了一个初始的案例,通过随机游走的方式对网络化数据先做一个表示学习,用表示学习的结果再去做预测,更多是提供新的思路。
后续的用法越来越多,同时研究DeepWalk存在什么问题。
对应的优化工作如下:
接下来我们将详细介绍。
Node2vec定义了两种Random walk不一样,从程序角度变成了BFS和DFS两种遍历方式。
local view
global view
A. Grover and J. Leskovec. 2016. node2vec: Scalable feature learning for networks. KDD, 855–864.
具体定义如下所示:
Biased Random Walk计算如下:
具体示例如下:
LINE实现过程如下:
(1) Line: First-order Proximity
首先定义一个一阶相似度,有关系存在。
(2) LINE: Second-order Proximity
然后定义一个二阶相似度,通过共同邻居实现。
表征如下:
接下来将两个函数combine。
(3) Combining first-order and second-order proximities
模型优化如下:
LINE采用C++实现,其速度很快,很多人fellow,而且效果比DeepWalk更好。
后来我们的研究中,考虑了两个问题。即:
What are the fundamentals underlying the different models?
这些方法存在哪些本质的区别?
Can we unify the different network embedding approaches?
我们能统一不同的网络嵌入方法吗?
我们就做了一些很有意思的工作,通过一些数据分析发现这些不同的方法在做什么。
(1) DeepWalk
DeepWalk从原始网络进行随机游走,再做Skip-gram,输出节点Embedding。整个思路比较简单。
实现算法如下,每个节点Random Walk后,中间节点构建它的context。
Skip-gram with Negative Sampling如下:两个节点有无边的Objective function不同。
在我们的场景下,从a到e的Random Walk问题更复杂。因为它里面有方向性,比如c节点有左边的context和右边的context,并且windows是1或2的结果不一样。
扩展后的函数如下,简写为: P = D − 1 A P=D^{-1}A P=D−1A
进一步扩展后得到如下两个式子。
最终得到如下的矩阵式子。
(2) LINE
同样的方法我们推到LINE方法,LINE是DeepWalk的特例。
(3) PTE
PTE是将LINE扩展到异构文本网络上。
PTE是三个不同的邻接矩阵,本质是LINE的特例。
(4) Node2vec
Node2vec本质上是二阶的,原来是2度从这个节点随机游走到任何邻居节点;而Node2vec是从任意节点游走时,要考虑三个节点,w考虑w+1和w-1,它其实是原来随机游走的特例。
贡献:最终我们得到一个结论,所有这些方法都是DeepWalk矩阵分解的特例。
同时,它给我们另一个启示,既然这些方法都是在做矩阵分解,那么我们能不能就用矩阵分解来做。
NetMF: explicitly factorizing the DW matrix
我们干脆将原来的Random Walk用矩阵分解来做,因此产生了NetMF,并引起了广泛的关注。
具体工作如下:
A unified algorithm NetMF to explicitly factorizes the derived matrix
构造矩阵分解,过程中使用了 Arnoldi算法,其做矩阵分解速度较快。它会将一些低质的节点消除,从而提升实验结果。
代码地址:
实验结果如下:
接下来是Sparsify S。
NetSMF增加了Sparse(稀疏),提出了大规模网络嵌入算法作为稀疏矩阵分解(NetSMF)。NetSMF利用spectral sparsification理论有效地稀疏密集矩阵,从而提高嵌入学习的效率。
具体过程如下图所示:
代码下载地址如下:
然而,多项式随机游走重构稀疏矩阵也非常花时间,内存开销很大,只是解决了问题。因此我们有了后续的工作。
ProNE:给定一个网络,首先构建一个超级稀疏的矩阵,然后进行矩阵分析(tSVD),再增加一个Spectral Propagation操作。相当于每个节点分解完后,应该有对应的向量,然后在图上或分解结果上增加一个Propagation,类似于卷积网络中的卷积操作,线性算法的向量相加,从而防止高阶信息丢失(如边)。
因此,ProNE通过在频谱调制空间(spectrally modulated space)中传播嵌入增强了Embedding,它是一个快速、可伸缩和有效的模型。
NE as Sparse Matrix Factorization如下:
Propagation原理解释:Higher-order Cheeger’s inequality
贡献:原来的SVD稀疏矩阵分解是一个线性算法,增加Spectral Propagation也是线性算法,所以整个算法非常快。
实验结果如下,我们只用单线程,其它算法用20个线程,我们的效果比其它最快的也快一个数量级。
上亿的图速度也非常快,性能也好。
Spectral Propagation在其他算法上均有提高,包括ProDeepWalk、ProLINE、ProNode2vec、ProGraRap和ProHOPE。
NetMF vs. ProNE
贡献&总结:我们的工作可以用下图显示,包括NetMF S=f(A)、NetSMF Sparsify S和ProNE Fast RLN。其输入是邻接矩阵,输出是向量。
刚才介绍的很多模型其实还是Shallow Model,Shallow层面做表示和矩阵分解。
但在神经网络中会更深的模型,尤其是图神经网络。例如,encoder是一个依赖图结构的复杂函数。
那么,我们怎么把它变成一个更深层呢?
GCN的基本思路:给定一个网络,这个网络中有很多属性,可以构造一个矩阵(如相似矩阵或邻接矩阵),再进行卷积操作,并做全连接和label分类。
下图展示了GCN的相关研究,包括GCN、GraphSAGE、GAT、FastGCN和GraphSGAN等,后续我们将详细介绍。
图卷积网络的架构如下图所示:
GCN核心是:每个节点都有一个隐向量,这里有个卷积函数,使得所有的隐向量就映射到中间节点v上,再对v学习一个新的向量。
卷积操作如下图所示,可以参考作者之前CNN博客。
GNN的基本思路是把邻居节点的相关信息都接入(Neighborhood Aggregation)到当前节点。
其计算公式如下所示:
它既可以捕获当前节点的信息,也可以捕获邻居节点的信息,因此公式展开如下。
同时可以增加两个权重。
有趣的是,邻接矩阵也可以写成一个矩阵分解式。
注意,Shallow是一个矩阵分解,现在的卷积还是一个矩阵分解,就可以将公式写在一起。
GCN模型架构的推导过程如下:
性能比较如下:
下面是一些传统GCN的扩展,第一个扩展是GraphSage。
GraphSage又是Jure Leskovec他们提出来的。
GraphSAGE 是 2017 年提出的一种图神经网络算法,解决了 GCN 网络的局限性: GCN 训练时需要用到整个图的邻接矩阵,依赖于具体的图结构,一般只能用在直推式学习 Transductive Learning。
GraphSAGE 使用多层聚合(aggregate)函数,每一层聚合函数会将节点及其邻居的信息聚合在一起得到下一层的特征向量,GraphSAGE 采用了节点的邻域信息,不依赖于全局的图结构。
其计算过程如下,比如将当前节点v的邻居节点的信息聚合在一起。
其性能如下图所示:
然而,事实上邻居节点会有不同的影响或重要性不一样。那怎么办解决呢?
GAN被提出,它是在刚才模型的基础上,每两个节点之间增加一个权重,编程了Attention Model。
此时的性能又会有提升。
此外,不同模型背后的基本原理是什么呢?
每一层都是一个矩阵分解,GCN可以看作是多层图卷积网络,其propagation规则如下:
那么,我们能不能在矩阵操作的基础上做一些事情呢?
我们直接在矩阵上对A进行操作,左乘一个矩阵,右乘一个矩阵,将网络中每个节点的重要性和边的影响补充进来。
通过这种方式(简单的矩阵相乘),我们就可以将很多不一样的Attention机制增加进来。
贡献:整个模型变成了如下图所示的样子,将不同的Attention机制增加到式子中,实现了一个统一(unify)。
第二个工作是图形结构化数据中的结构依赖性和信息冗余性分析,通过采样(Sampling)来帮助探索网络信息。
给定一个矩阵,我们实现砍掉一半的信息再做Predict。我们发现学出来的结果与先前的结果比较接近,因此我们思考,如何优美地将信息利用起来,说不定结果还更好。
因此,我们构造了这个模型,利用Sampling思想,我们将图看成两个图,各学各的,然后将它们加到一起;继续二分,就可以构造多个图,即NSGCN(dp)。
第二种,我们想能不能互相让两部分相互学习,并且让两部分的loss更小,就构造了NSGCN(dm),即Disagreement Minimization。
整个模型如下所示:
实验结果如下图所示,效果更好。
同时支持inductive的实验。
最近,大家可能非常关心GNN的实际应用。我们也探讨了一些应用。
我们探讨了《王者荣耀》的信息探测。
J. Qiu, J. Tang, H. Ma, Y. Dong, K. Wang, and J. Tang. DeepInf: Social Influence Prediction with Deep Learning. KDD’18.
我们构建了 End-2-End Behavior Prediction Framework,通过该模型预测节点本身的信息。原来只通过拓扑结构学习一个表示,但是它在真实场景是很难用的,因为真实场景往往会添加很多属性,比如性别、职位、位置等。所以,我们的模型中允许它添加很多属性,最终来预测它的行为。
实验结果如下图所示:
接着我们做了推荐系统:用户和商品的关系。
分析结果如下图所示:
数据分析和代码如下:
分析的结果如下图所示:
同时在真实场景做了A/B测试,推荐系统上提高了点击率。
这次分享主要从背景知识、表示学习、图神经网络和真实场景应用四个方面介绍,下图是经典工作的总结和我们的相关工作。本来还想讲一些推理的事情,即ACL19的Cognitive Graph,根据兴趣来推理转换为决策过程,并且可以回溯和可解释;但看到另一位老师也在,他后续会补充。
同时,推荐大家关注唐老师和B站的UP老师。
个人感受简单总结下:
这篇文章就写到这里,希望对您有所帮助。由于作者英语实在太差,论文的水平也很低,写得不好的地方还请海涵和批评。同时,也欢迎大家讨论,继续加油!感恩遇见,且看且珍惜。
(By:Eastmount 2022-05-28 周六夜于武汉 http://blog.csdn.net/eastmount/ )