本文来自OPPO互联网技术团队,如需要转载,请注明出处及作者。欢迎关注我们的公众号:OPPO_tech
图论是计算机科学中最重要、最有趣的分支之一,对于存在拓扑关系的业务场景,理解和使用图可以对业务有很多帮助。本文主要针对图理论在大数据量下的技术和应用场景做全貌性的介绍。
1. 图论的起源
在18世纪,一个叫做柯尼斯堡的城市,河流将该城市切成了四部分,割裂的土地之间通过七座桥连接起来了。
当时,有一个与柯尼斯堡的桥相关的问题:如何只通过每座桥一次而穿过整个城市。
为了分析并解决这个问题,人们把该问题做了进一步的抽象:将割裂的区域抽象成一个节点,连接两个区域的桥抽象成两个节点之间的一条边,进一步将该问题转换成了最早的有关图论的问题:柯尼斯堡七桥问题,也叫作一笔画问题。
到了19世纪50年代,又有了一个关于地图染色的问题将图论的影响和关注起到了一定的推进——四色猜想。主要是说能否只用四种颜色就能为所有地图染色?该问题也可以抽象成图的问题做进一步的分析。
后来随着计算机技术的发展,实际应用中业务场景的不断丰富,人们发现了更多的应用场景中的数据结构都可以使用图来表示。最典型的场景就是社交网络,关于图在社交网络中的应用,也有很多基础理论方面的研究,最有名的就是六度关系理论。
该问题说的是:我们构建一张全世界人口组织成的社交关系网络,其中每个人就是一个图中的节点,人和人之间的关系就是一条边,比如:朋友关系、同事关系、上下级关系等。
在这个社交网络中的任何两个人之间,最多需要通过六次关联,就可以将他们连接起来。比如你和比尔·盖茨之间,中间通过六次关系扩展,你们两个之间就可以建立起来连接。对于这种很神秘的连接,想想有没有很激动。
再后来,Facebook在自己的社交网络中做了研究分析,将之前的六度关系,逐步缩短到了2008年的五度关系,2011年的四度关系。
对于一个几十亿实体,百亿甚至千亿关系的图,它的直径却只有4,可想而知在它之上要做的各种分析工作的复杂性。
复杂问题先定义并做好分类,有助于我们开展工作。在此处,我们将图的分支分为四个部分:图的理论研究、图存储、图计算和图神经网络。
- 图的理论研究偏向本质的数据问题的分析研究,与实际应用还有一些差距,不是我们目前要考虑的问题点,就先归为一类,本文不做展开;
- 图存储及检索侧重点在于实时或准实时的在线分析为主,主要是做实体检索、关系检索、关系拓展、路径计算等;
- 图计算和图神经网络以离线计算为主,主要用于分析整个图的拓扑特性、社区特性等。
2. 图定义模型
在海量数据下,要构建、检索、分析一张大图,需要合理的数据结构来进行。当前已有的图定义的方式可以分为三种:超图-HyperGraph,属性图-PropertyGraph,三元组-RDF。
超图-HyperGraph
在超图中,实体之间是通过超边进行连接的。一条超边对应一类关系,如图所示,相同颜色区域中的实体之间都是该类边。
属性图-PropertyGraph
基于超图来理解属性图,不同点是属性图中的实体之间的边是独立存在的,没有共用。每个实体有自己的属性信息,比如公司的职员实体,具有属性:姓名、生日、工号等,职员和公司之间雇佣关系,雇佣关系也有自己的属性:入职日期等。
三元组-RDF
三元组是对RDF格式的一种形式化说法。因为RDF的每一条记录有三个部分的内容:资源信息、属性、属性值。因此而得名三元组。
RDF数据格式定义来源于W3C的标准,是最早用于表征语义网的一种数据规范。
知识图谱领域在90年代就已开始,最早的形式就是使用W3C标准的RDF表征语义网,后来随着不断的发展,国内外各个大厂也不断在提出自己的知识图谱产品。但底层用于存储语义关系的存储引擎却不局限在RDF模式下了,也有很多使用属性图的方式进行存储。
超图、属性图、RDF虽是定义图的拓扑关系的三种不同范式,但是都可以正确表征图的拓扑特征,而且三者之间是可以相互转换的。
不过随着现在图的应用早已不局限在知识图谱领域了,在社交、推荐、金融风控、运维等多个领域都有了丰富的应用场景,不同业务对于使用场景也有了更多的要求。
RDF这种schema-less的存储模式在实际应用中逐渐需要搭配其他DB来配合使用才能满足业务要求。所以属性图的存储模式反而更受欢迎,从市面上能看到的图数据库选择的图存储模式也能佐证这点。
3. 图数据库
从数据关系及检索场景来分,数据存储及检索可以大的方向上分为四类:
- K-V存储
- 列式存储
- 对象存储
- 图数据存储
KV存储类数据库:主要针对唯一性键值来查找检索对应的值,或是数值、字符串,或是列表、字典等。
列式存储类数据库,是结构性数据存储的普遍选择。可以进行按键值检索、按列聚合分析和多表关联分析等。对象存储主要应用在离线数据存储及日常服务数据冷备等场景中。
而图数据的检索需求与以上三个相同点,又不局限在相同点上。比如在查找具体一个实体时,类似于KV类按键值检索;在进行关系拓展分析时,类似于列式存储中多表join操作。
因此构建一个高效可用的图数据库也需要兼顾考虑到不同检索使用场景下的特点来进行全局分析。
回想下在大学期间学习数据结构时,对里面的图是如何定义和分析使用的。
以该有向图为例,我们使用邻接矩阵的形式来表示图中的节点和边,矩阵为|V| * |V|规模的方阵,矩阵中的值表示两个节点之间是否存在关系,如果有则置为1,没有则置为0。
对于这种小数据量的图数据,在实际的应用程序中进行处理的时候,为了便于扩展,通常使用链表来存储。
然而这些美好的、简单易用的处理逻辑也只能停留在课堂作业中而已,对于互联网业务场景中的海量数据,想构造一个百万乘百万、一亿乘一亿的邻接矩阵来进行运算,基本不具备可行性。
所以我们需要对海量图数据的存储及检索方式做相应的合理设计。不同的图数据库对于图数据存储的格式总有些异同,但是对于图中的关联关系肯定都是不变的,比如实体和自身属性的关联关系、实体和关系的对应关系等。
主流的图数据库中,对于图数据的存储主要有两种方式:
- 拓扑关系和属性数据集成
- 拓扑关系和属性数据分离
拓扑关系和属性数据集成的存储方式中,可以将属性数据和关系列表数据统一作为实体这个Key对应的Value。
这样可以通过查找到实体后,很方便的扩展到属性数据集关系数据。通常为了查询上的高效,会将关系数据存储两份,根据出节点和入节点各对应一组相同的边列表。
拓扑关系和属性数据分开存储的方式中,拓扑关系只存储边数据,属性数据可以使用KV存储引擎进行管理。
这样在进行检索的时候,按照不同查询场景进行区分操作:比如只查询单实体及其属性信息时,就可以只通过KV进行检索即可;而查找拓扑关系时,需要结合拓扑存储及属性存储两者交互进行。
这样的分类存储的方式在某些场景的效率较高。但是实际图数据库的检索应用场景中,大多数的请求都是需要结合拓扑和属性数据共同进行的,这就需要在两个存储引擎中进行交互来整合最终结果数据。
除此之外,拓扑关系和属性数据分开存储也有自己的进阶版设计。
就是在拓扑关系存储中,扩展存储少量常用的属性数据,而不是单单只有拓扑数据。这样对于某些常见的查询也可以只使用拓扑关系类数据即可得到检索结果。
在近年来,随着应用场景的逐渐丰富,图数据库市场逐步趋热的背景下,图数据库产品的发展也有了长足的进展。从DB-Engines的最新统计分析中也可以看到,图数据库的趋势一骑绝尘。
在图数据库市场中,实际的产品矩阵我们这里分成三个维度来看:
- 企业服务版
- 开源版
- 云服务商
图数据库的企业服务提供商中,典型的代表就是TigerGraph、DataStax、Neo4j等。
在开源的图数据库中,关注比较多且社区比较活跃的有JanusGraph、DGraph、Neo4j、S2Graph。(Apache孵化中的一个图数据库产品,目前功能还比较简单,而且感觉活跃度也比较低)
同时,在越来越多的公司上云的趋势下,国内外各大云服务商也将图数据库加到了自己的产品矩阵中。比如:AWS的Neptune、Azure的CosmosDB、阿里云的GraphDB、腾讯云的星图(TKGD)、华为云的GES等。
另一方面,不同的图数据库产品之间也有各种藕断丝连,分不清理还乱的关系。比如Neo4j,既有收费的企业版,也有开源的单机版。
不过Neo4j的单机版有些使用上的限制:
比如同时只能有一个打开的图,进程使用的核数也有限制;
比如企业版的DataStax公司的图数据库是收购了Titan而来的,Titan在被收购后,开源社区有fork出了新的分支:JanusGraph。百度的HugeGraph也是基于Titan、JanusGraph的基础之上开发而来的。
从图数据的存储范式上来看,使用属性图是绝大多数图数据库的选择,也有少部分使用的是RDF的存储方式,比如DGraph,Stardog等。
值得一提的是,在使用图数据库时,需要使用到图查询语言,而图查询语言也有多个不同形态的语言。典型的有:TinkerPop Gremlin、Neo4j的Cypher、TigerGraph的GSQL、用于RDF类图数据查询的SparQL等。
不过Gremlin的图遍历语言目前的使用面应该是最广的,在没有统一标准的图查询语言中,感觉也算是半个不成文的标准了。
在实际应用中,图数据库能够提供的主要检索功能有:
实体查找:即根据实体的ID或者某几个属性信息进行过滤查找具体的实体信息;
关系拓展:主要是实体的邻居查找,多跳关系查找,以及基于多跳关系查找基础之上的各种条件过滤查询;
路径分析:根据已知的两个实体,查找他们之间的最短路径,全路径等信息。
在拓扑关系的拓展检索场景中,与传统数据库对比,图数据库少了多次的交互及表间关联操作。
举个例子,对比下关系型数据库与图数据库在相同查询场景下的区别:
在这个例子中,我们现在要查找员工Alice所处的部门名称。
Q:假设Alice可以同时任职于多个部门
在关系型数据库中,可能存在三张表:员工信息表、员工与部门关系表、部门信息表,我们写SQL进行查找,需要进行两次JOIN操作才能获取Alice所处的部门名称。
而对于使用图数据库来存储及检索的话,可以将员工和部门都定义为实体,而他们之间的关系就是从属关系,这样可以使用图查询语言一句话查找得到结果。
对比可以看到,无论是操作的复杂度还是所需计算复杂度,都大大降低了。
得益于图数据库在拓扑关系类分析中的优势,实际落地在有图应用的场景里面也变的越来越多,举几个典型的例子:
知识图谱,是图数据库最早发挥价值的场景之一。
从知识存储沉淀到知识检索发现,通过知识内部的关联关系不断拓展,强化知识表达的内容丰富度。
现在的知识图谱会扩充了更广义的应用场景,将NLP技术的应用加入进来。
从原始的非结构化文本中进行实体的抽取、关系的抽取和预测、实体的不同说法之间的消歧等等。这些都对知识图谱的图数据构建及使用提供了极大的便利和业务场景的拓宽。
社交网络与图结构天然适配,通过图数据库将社交网络中的实体与关系数据存储起来后,可以用作好友推荐、兴趣群组推荐等,现在这种网络也可以扩展到将社交网络与内容推荐网络整合起来,给用户推荐商品、咨询等。
除此之外,还有金融风控、企业IT运维等也可以将图数据库应用起来并发挥价值,比如金融机构可以通过图来分析个人及公司的信贷风险,IT运维工程师可以通过图来分析服务器异常、交换机故障的影响范围并制定应对措施等。
4. 图计算
图计算:是图理论技术在实际应用中的另一个主要阵地,图计算的发展也经历了算力发展、场景丰富、技术研究对图计算的不断推进。
到现在为止,除了PageRank,LPA等常见的算法外,也有了与神经网络结合的图神经网络算法,可应用在对拓扑结构的嵌入向量表达及节点、关系预测中。
我们这里介绍几个常见的图算法:PageRank、Label Propagation、Random Walk。
PageRank
PageRank:是Google公司所使用的对其搜索引擎搜索结果中的网页进行排名的一种算法。
PageRank本质上是一种以网页之间的超链接个数和质量作为主要因素粗略地分析网页的重要性的算法。其基本假设是:更重要的页面往往更多地被其他页面引用。(或称其他页面中会更多地加入通向该页面的超链接)
其将从A页面到B页面的链接解释为“A页面给B页面投票”,并根据投票来源(甚至来源的来源,即链接到A页面的页面)和投票对象的等级来决定被投票页面的等级。简单的说,一个高等级的页面可以提升其他低等级的页面。
该算法以谷歌公司创始人之一的拉里·佩奇(Larry Page)的名字来命名。谷歌搜索引擎用它来分析网页的相关性和重要性,在搜索引擎优化中经常被用来作为评估网页优化的成效因素之一。
当前,佩奇排名算法不再是谷歌公司用来给网页进行排名的唯一算法,但它是最早的,也是最著名的算法。
Label Propagation
Label Propagation算法:是一种基于标签传播的局部社区划分算法。
对于网络中的每一个节点,在初始阶段,Label Propagation算法对每一个节点一个唯一的标签。在每一个迭代的过程中,每一个节点根据与其相连的节点所属的标签改变自己的标签。
更改的原则是选择与其相连的节点中所属标签最多的社区标签为自己的社区标签,这便是标签传播的含义。随着社区标签的不断传播,最终紧密连接的节点将有共同的标签。
Label Propagation算法最大的优点是其算法过程比较简单。
想比较于优化模块度的过程,算法速度非常快。Label Propagation算法利用网络的结构指导标签的传播过程,在这个过程中无需优化任何函数。在算法开始前我们不必要知道社区的个数,随着算法的迭代,在最终的过程中,算法将自己决定社区的个数。
Random Walk
Random Walk是一种数学统计模型,它是一连串的轨迹所组成,其中每一次都是随机的。
它能用来表示不规则的变动形式,如同一个人酒后乱步,所形成的随机过程记录。随机游走的探寻过程主要是基于过去的表现来选择下一步,无法预测将来的发展步骤和方向,类似于物理学中的布朗运动。
近几年深度学习的技术在CV和NLP领域取得了长足的发展,图在结合神经网络的基础上也发展出了图神经网络方面的相关算法。
主要有Graph Embedding、Graph Convolution Network、Graph Attention Network等;
其中Graph Embedding和GCN在实际的业务场景中的使用居多,我们这里主要对这两类方法做个简单介绍。
Graph Embedding
DeepWalk主要方式是与自然语言处理中重要的Word Embedding方法Word2Vec联系了起来,使得Network Embedding问题转化为了一个Word Embedding问题。
DeepWalk通过从每个结点出发n_walks次,每一步都采取均匀采样的方式选择当前结点的邻接结点作为下一步的结点随机游走。
当游走的路径长度达到walk_length后,停止一次游走。
这样就生成了一个个游走的序列,每个序列都称为一个walk。每个walk都被当成Word2Vec中的一个句子,而每个结点都是Word2Vec中的一个词。
有了具体的图中的“词”和“句子”后,之后的算法几乎和Word2Vec的SkipGram版本完全一样。使用一个大小为window_size的滑动窗口作为一条walk的context,使用一个context中的中心词去推测所有context中的其他词,使用的目标函数也与Word2Vec一致。
类比可知,这里的Embedding就是每个节点在整个图的拓扑结构中的嵌入表达。可以使用预训练得到的embedding向量做进一步的业务使用,如推荐等。
虽然DeepWalk通过随机游走的方式,将图结构数据转化为了自然语言处理的任务来完成。
但是,图结构中节点的关系往往比词上下文关系更加的复杂。通常部分的图结构数据中边具有权重,使用现有的Word2Vec方法无法很好的应对这个问题。
此外,在现实世界数据中,图的规模往往过于庞大,以至于存下所有的walk的开销将十分惊人。
LINE(Large-scale Information Network Embedding)不再采用随机游走的方法。相反,他在图上定义了两种相似度:一阶相似度与二阶相似度。
- 一阶相似度:一阶相似度就是要保证低维的嵌入中要保留两个结点之间的直接联系的紧密程度,换句话说就是保留结点之间的边权,若两个结点之间不存在边,那么他们之间的一阶相似度为0。例如下图中的6、7两个结点就拥有很高的一阶相似度;
- 二阶相似度:二阶相似度用一句俗话来概括就是“我朋友的朋友也可能是我的朋友”,他所比较的是两个结点邻居的相似程度。
若两个结点拥有相同的邻居,他们也更加的相似。如果将邻居看作context,那么两个二阶相似度高的结点之间拥有相似的context。这一点与DeepWalk的目标一致。例如下图中的5、6两点拥有很高的二阶相似度。
Node2Vec是一份基于DeepWalk的延伸工作,它改进了DeepWalk随机游走的策略。
Node2Vec认为,现有的方法无法很好的保留网络的结构信息。
例如图所示,有一些点之间的连接非常紧密(比如u, s1, s2, s3, s4),他们之间就组成了一个社区(community)。网络中可能存在着各种各样的社区,而有的结点在社区中可能又扮演着相似的角色(比如u与s6)。
Node2Vec的优化目标为以下两个:
- 让同一个社区内的结点表示能够相互接近;
- 在不同社区内扮演相似角色的结点表示也要相互接近。
为此,Node2Vec就要在DeepWalk现有的基础上,对随机游走的策略进行优化。Node2Vec提出了两种游走策略:
1.广度优先策略
2.深度优先策略
就如上图的标注所示,深度优先游走策略将会限制游走序列中出现重复的结点,防止游走掉头,促进游走向更远的地方进行。
而广度优先游走策略相反将会促进游走不断的回头,去访问上一步结点的其他邻居结点。
这样一来,当使用广度优先策略时,游走将会在一个社区内长时间停留,使得一个社区内的结点互相成为context,这也就达到了第一条优化目标。
相反,当使用深度优先的策略的时候,游走很难在同一个社区内停留,也就达到了第二条优化目标。
那么如何达到这样的两种随机游走策略呢,这里需要用到两个超参数p和q用来控制深度优先策略和广度优先策略的比重,通过p和q的调整,就可以是业务跟进自己的特点来选择对于BFS和DFS的偏重了。
GCN
深度学习的应用中最广的是CV领域的CNN和NLP领域的RNN。但是这两者一种适用于处理规范的网格数据,一种适用于处理序列化数据。
而对于图数据,拓扑关系属于非欧结构的,比如CNN在Non Euclidean Structure的数据上无法保持平移不变性。
简单理解就是在图中的每个节点的邻居节点数据是不同的,所以无法使用同样一个尺寸的卷积核来进行卷积运算。
但是人们又希望在这样的数据结构上有效的提取空间特征来进行机器学习,所以GCN就成了研究的重点。
GCN的本质目的就是用来提取拓扑图的空间特征。
简单来说就是使用拉普拉斯矩阵来计算并构造卷积核,输入图网络结构,中间传递过程保持住了图的拓扑关联性。GCN可以用于节点预测、关系预测及生成Embedding向量用作其他场景的应用。
GraphEmbedding和GCN目前应用场景最多的当属推荐了,这里给一个推荐中使用DeepWalk进行效果提升的主流方案。
区别于传统推荐的基于用户和商品之间之间关联和画像特征来进行整合,并设计推荐算法。图神经网络在该场景中,从两个方面提出了新的思路:
- 针对用户浏览商品的顺序,构建商品的序列关系;
- 根据用户浏览商品的关联关系,构建二部图。(用户和商品之间存在关系,用户之间和商品之间无关联)
针对这两类图均可以使用DeepWalk生成Embedding向量,并进一步用作推荐。
5. 总结
全文从三大部分进行图的技术及应用概述:
- 图的起源发展及定义方式;
- 图数据库的技术及应用;
- 图计算和图神经网络的介绍
图数据库和图计算,这两个分支都是有很多内容值得详细深挖研究的,这里只做了概述性的引入,后续逐步来通过专题进行学习和分享。