分布式图嵌入的方法及装置
技术领域
本说明书一个或多个实施例涉及计算机信息处理领域,尤其涉及采用分布式架构进行图嵌入的方法和装置。
背景技术
关系网络图是对现实世界中实体之间的关系的描述,目前广泛地应用于各种计算机信息处理中。一般地,关系网络图包含一个节点集合和一个边集合,节点表示现实世界中的实体,边表示现实世界中实体之间的联系。例如,在社交网络中,人就是实体,人和人之间的关系或联系就是边。
在许多情况下,希望将关系网络图中的每个节点(实体)用多维空间中的向量来表示,也就是将各个节点映射到一个多维空间中,用多维空间中的点代表图中的节点。多维空间可以是2维、3维空间,也可以是更高维空间。用多维空间的坐标来表达图中的节点,可以应用于计算节点和节点之间的相似度,发现图中的社团结构,预测未来可能形成的边联系,以及对图进行可视化等。将图中的节点映射到多维空间的过程称为图嵌入。
图嵌入是一种非常重要的基础技术能力。目前,在许多关系网络图(例如用户社交网络)中,包含的节点数目达到上亿甚至几亿,此时的图嵌入计算将耗费巨大的计算资源。为此,提出了分布式***,其中包含多个处理设备(又称为worker)和管理器(master),各个处理设备承担一部分节点的计算量,而通过管理器实现各个处理设备之间的调配、异常检测、参数聚合等功能。然而,在关系网络图的图直径过小,节点搜索深度较大等许多情况下,各个处理设备依然存在计算量过大,显著超过负荷的情况,使得图嵌入的过程难以高效进行。
因此,希望能有改进的方案,更加快速有效地进行关系网络图的图嵌入过程。
发明内容
本说明书一个或多个实施例描述了一种分布式图嵌入方法,可以通过分布式架构高效地将关系网络图中的节点嵌入到多维空间中,以便于后续的信息处理。
根据第一方面,提供了一种通过分布式架构将关系网络图嵌入到多维空间的方法,所述关系网络图包括多个节点,所述分布式架构包括多个处理设备,各个处理设备分别被分配有所述多个节点中的一组节点,所述方法由所述多个处理设备中的某一处理设备执行,所述方法包括:
针对本处理设备所分配的第一节点组中的第一节点,根据所述关系网络图的邻接信息,确定所述第一节点的至少一个一阶邻居节点;
根据节点分配信息,确定所述至少一个一阶邻居节点所对应的至少一个处理设备,其中所述节点分配信息记录所述多个节点在所述多个处理设备中的分配状况;
确定所述第一节点的初始嵌入向量作为当前阶数嵌入向量;
更新所述第一节点的当前阶数嵌入向量,包括:从所述至少一个处理设备获取所述至少一个一阶邻居节点所分别对应的至少一个当前阶数嵌入向量;根据所述至少一个当前阶数嵌入向量,确定所述第一节点的下一阶数嵌入向量;用所述下一阶数嵌入向量更新所述第一节点的当前阶数嵌入向量;
判断当前阶数是否达到预设节点搜索深度,在没有达到的情况下,反复执行所述更新所述第一节点的当前阶段嵌入向量,直到所述当前阶数达到预设节点搜索深度;
将当前阶数达到预设节点搜索深度时第一节点的当前阶数嵌入向量,确定为所述第一节点的嵌入向量。
在一种实施方式中,邻接信息包括所述关系网络图的邻接矩阵;在这样的情况下,通过以下方式确定第一节点的至少一个一阶邻居:
获取所述邻接矩阵中与所述第一节点所在行对应的行元素或与所述第一节点所在列对应的列元素;
将所述行元素或列元素中非零元素对应的节点确定为所述第一节点的至少一个一阶邻居节点。
在一个实施例中,分布式架构还包括管理器,所述管理器用于存储所述邻接信息和/或所述节点分配信息。在这样的情况下,所述方法还包括:从所述管理器获取所述邻接信息和/或所述节点分配信息。
根据一个实施例,通过以下方式确定第一节点的初始嵌入向量:基于第一节点的节点特征,确定其初始嵌入向量,其中所述第一节点对应于用户,所述节点特征包括用户属性特征。
在一个实施例中,通过以下方式获取一阶邻居节点所分别对应的当前阶数嵌入向量:分别向所述至少一个处理设备发出请求,所述请求中包括所述至少一个一阶邻居节点的节点标识;从所述至少一个处理设备接收所述节点标识所对应节点的当前阶数嵌入向量。
根据一种实施方式,确定所述第一节点的下一阶数嵌入向量包括:
以所述至少一个一阶邻居节点与第一节点之间的连接强度为权重,对各个一阶邻居节点分别对应的各个当前阶数嵌入向量进行加权求和,确定第一节点的下一阶数嵌入向量。
根据一种实施例,所述预设节点搜索深度为N,所述第一节点的嵌入向量为N阶嵌入向量,所述N阶嵌入向量包括所述第一节点的N阶邻居节点的信息。
根据第二方面,提供一种在分布式架构中将关系网络图嵌入到多维空间的装置,所述关系网络图包括多个节点,所述分布式架构包括多个处理设备,各个处理设备分别被分配有所述多个节点中的一组节点,所述装置包含在所述多个处理设备中的某一处理设备中,所述装置包括:
邻居确定单元,配置为针对本处理设备所分配的第一节点组中的第一节点,根据所述关系网络图的邻接信息,确定所述第一节点的至少一个一阶邻居节点;
设备确定单元,配置为根据节点分配信息,确定所述至少一个一阶邻居节点所对应的至少一个处理设备,其中所述节点分配信息记录所述多个节点在所述多个处理设备中的分配状况;
初始向量确定单元,配置为确定所述第一节点的初始嵌入向量作为当前阶数嵌入向量;
向量更新单元,配置为更新所述第一节点的当前阶数嵌入向量,进一步包括:邻居向量获取模块,配置为从所述至少一个处理设备获取所述至少一个一阶邻居节点所分别对应的至少一个当前阶数嵌入向量;嵌入向量确定模块,配置为根据所述至少一个当前阶数嵌入向量,确定所述第一节点的下一阶数嵌入向量;嵌入向量更新模块,配置为用所述下一阶数嵌入向量更新所述第一节点的当前阶数嵌入向量;
判断单元,配置为判断当前阶数是否达到预设节点搜索深度,在没有达到的情况下,使得所述向量更新单元反复执行所述更新所述第一节点的当前阶段嵌入向量,直到所述当前阶数达到预设节点搜索深度;
嵌入向量确定单元,配置为将当前阶数达到预设节点搜索深度时第一节点的当前阶数嵌入向量,确定为所述第一节点的嵌入向量。
根据第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面的方法。
根据第四方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面的方法。
通过本说明书实施例提供的方法和装置,每个处理设备仅需存储自己被分配的一组节点的节点信息;在图嵌入过程中,每个处理设备反复获取自己负责节点的一阶邻居节点的当前阶嵌入向量,据此确定自己节点的下一阶嵌入向量,如此通过反复迭代,来实现更高阶的邻居节点信息的获取。因此,各个处理设备本地存储的节点数和计算量都不会受到图直径和搜索深度的影响,降低了处理设备的内存压力,更高效地实现图嵌入的并行计算。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本说明书披露的一个实施例的关系网络图的示意图;
图2示出一种分布式图嵌入的框架;
图3示出根据一个实施例的分布式图嵌入的方法;
图4示出根据一个实施例的图嵌入装置的示意性框图。
具体实施方式
下面结合附图,对本说明书提供的方案进行描述。
图1为本说明书披露的一个实施例的关系网络图的示意图。如图1所示,该关系网络图包括多个节点,在这些节点中,具有关联关系的节点之间用边进行连接。通过边进行连接的节点,称为邻居节点。在一个例子中,图1中的节点表示社交网络中的人或用户,两个节点之间通过边连接起来,即表示对应的两个用户存在社交上的关联,例如转账、留言、通讯等等。在一个实施例中,节点之间的关联关系还具有不同的关联强度。此时,可以利用边的属性或边的权值来表示该边所连接的两个用户之间的关联强度。
需要理解,在图1中的关系网络图中,为了示出各个节点以及节点间的连接关系,而示意性地示出各个节点,此时节点位置仅是出于示意,而不具有实际的意义和信息量。而通过图嵌入的算法,可以为各个节点赋予有意义的嵌入向量,从而将其映射到多维空间中。
已经存在一些图嵌入的算法,在已知关系网络图的拓扑结构的情况下,将其中的节点映射为多维空间的向量。在多数图嵌入算法中,为了得到每个节点的嵌入向量,都会在计算时考虑其关联关系,也就是考虑其邻居节点。许多图嵌入算法在考虑当前节点i的关联关系时,不仅考虑该节点i直接相连的邻居节点,也就是一阶邻居节点,还会考虑邻居节点的邻居节点,也就是当前节点i的二阶邻居节点,甚至更高阶邻居节点。
具体地,在进行图嵌入时,对于每个节点,首先确定其一阶邻居节点。在寻找和确定邻居节点时,目前多数图嵌入算法采用的是广度优先搜索,也就是沿着节点的宽度遍历邻居节点的搜索算法。在找到每个节点的一阶邻居节点后,算法通过诸如加权平均等方式,得到每个节点的第一层嵌入向量。然后,寻找各个节点的二阶邻居节点,也就是一阶邻居节点的邻居节点。在找到每个节点的二阶邻居节点后,再次通过同样的方法,得到每个节点第二层嵌入向量。在应用中,常常需要使用这样的算法计算大规模关系网络图的图嵌入。此时图的节点规模高达数亿。这时,需要考虑使用分布式的框架来对图嵌入算法进行并行化。
图2示出一种分布式图嵌入的框架。如图2所示,分布式架构包括多个用于计算的处理设备(又称为worker),每个worker负责计算一部分节点的嵌入向量。这样的分布式架构通常还需要一个管理器(master server),来记录、调配、整合多个worker的状态。因此,这样的分布式架构可以看做一种有中心化的分布式计算框架。
在各个worker计算它所负责节点的嵌入向量时,因为要保障图的连通性,每个worker至少需要储存其负责节点在指定搜索深度之内的全部邻居。例如,如果图嵌入算法要考虑各个节点的四阶邻居,那么搜索深度可以设定为四跳。于是,每个worker需要储存其负责的每个节点的四跳之内的所有邻居节点的信息,才能计算其负责节点的嵌入向量。
这在搜索深度较大,或者关系网络图的图直径较小的情况下非常不利。上述图直径是指,如果图中的任意节点,最多经过N个邻居就可以达到任一其他节点,那么N就称为图直径。例如,对于一些社交关系网,通常图直径为7,也就是,任一用户最多通过7跳,就能到达任一用户节点。对于这样的关系网络图,如果搜索深度也被设定为7,那就意味着,每个worker都需要把全图都保存在本地机器上,这就失去了分布式计算的意义。同时,在这样的情况下,worker的内存会显著超出负荷,难以达到期望的要求。
因此,在以上分布式架构的基础上,本说明书的一个或多个实施例提出了改进的图嵌入方式。在该改进的方案中,为每个worker分配关系网络中的一组节点,每个worker仅存储自己负责的一组节点的节点信息(而不存储邻居节点),但是可以知晓其他节点存储在哪个worker中。初始地,各个worker为自己负责的各个节点计算初始嵌入向量,作为0阶嵌入向量。然后,各个worker对于自己负责的每个节点i,确定其一阶邻居节点,从其他worker读取这些一阶邻居节点的0阶嵌入向量,利用一阶邻居节点的0阶嵌入向量,计算节点i的1阶嵌入向量。当确定出各个节点的1阶嵌入向量后,各个节点用1阶嵌入向量作为当前阶嵌入向量。然后继续这样的过程,也就是利用节点i的一阶邻居节点的当前阶嵌入向量,计算节点i的下一阶嵌入向量,直到达到预定搜索深度。
在以上过程中,每个处理设备(worker)仅存储自己负责的一组节点的节点信息,而不需要存储邻居节点的信息;在图嵌入过程中,每个worker仅需获取自己负责节点的一阶邻居节点信息,而不需要获取更高阶的邻居节点信息;图嵌入中的搜索深度,即高阶邻居信息,是通过每个worker的迭代次数来体现。这样的过程,各个处理设备要存储的节点数和计算量都不会受到图直径和搜索深度的制约,可以针对各种关系网络图和各种图嵌入算法实现高效的图嵌入并行计算。
下面描述以上过程的具体实现方式。
图3示出根据一个实施例的分布式图嵌入的方法,用于通过分布式架构将关系网络图嵌入到多维空间中。其中关系网络图包括多个节点,分布式架构包括多个处理设备,各个处理设备分别被分配有所述多个节点中的一组节点。各个处理设备可以由任何具有数据计算、处理能力的装置、设备、平台或设备集群来实现。图3的方法由分布式的多个处理设备中的某一处理设备执行,并且所述方法包括:步骤31,针对本处理设备所分配的第一节点组中的第一节点,根据所述关系网络图的邻接信息,确定所述第一节点的至少一个一阶邻居节点;步骤32,根据节点分配信息,确定所述至少一个一阶邻居节点所对应的至少一个处理设备,其中所述节点分配信息记录所述多个节点在所述多个处理设备中的分配状况;步骤33,确定第一节点的初始嵌入向量作为当前阶数嵌入向量;步骤34,更新所述第一节点的当前阶数嵌入向量,这包括:子步骤341,从所述至少一个处理设备获取所述至少一个一阶邻居节点所分别对应的至少一个当前阶数嵌入向量;子步骤342,根据所述至少一个当前阶数嵌入向量,确定所述第一节点的下一阶数嵌入向量;子步骤343,用所述下一阶数嵌入向量更新所述第一节点的当前阶数嵌入向量;并且,在步骤35,判断当前阶数是否达到预设节点搜索深度,如果没有,则反复执行所述更新所述第一节点的当前阶段嵌入向量的步骤34,直到所述当前阶数达到预设节点搜索深度;此时,在步骤36,将当前阶数达到预设节点搜索深度时第一节点的当前阶数特征向量,确定为所述第一节点的嵌入向量。下面描述以上各个步骤的具体执行。
如前所述,本说明书实施例的方法是通过分布式架构实现图嵌入,其中分布式架构包括多个处理设备。在初始化阶段,将关系网络图中的多个节点分别分配给各个处理设备,如此,每个处理设备分配有一组节点,并用于处理所分配的一组节点的嵌入向量计算。节点的分配可以由管理员手工设定,也可以通过机器算法自动执行。节点在各个处理设备中的分配状况可以记录为节点分配信息。在执行节点分配的初始化之后,各个处理设备均可以执行图3所示的方法流程,来实现本地负责节点的节点嵌入。
具体地,首先在步骤31,针对本处理设备所分配的第一节点组中的第一节点,根据关系网络图的邻接信息,确定第一节点的至少一个一阶邻居节点。
可以理解,通过初始化阶段,每个处理设备都被分配了一些节点。此处为了描述的简单和清楚,将执行图3方法的本处理设备所分配的节点称为第一节点组。此处的“第一”并不具有排序的含义,只是为了区分和标注。类似的,其中的第一节点是第一节点组中的任一节点,在下面的描述中,有时又称为任一节点i。由于处理设备对于自己分配的每个节点都执行类似的操作,因此下面就针对某一节点,即第一节点进行描述。
对于上述的第一节点,根据关系网络图的邻接信息,确定其至少一个一阶邻居节点。
在一个实施例中,在前述的初始化阶段,将关系网络图的邻接信息存储在各个处理设备中。如此,每个处理设备可以从其本地读取该邻接信息。在另一实施例中,分布式架构还包括管理器(master server),用于协调多个处理设备的工作。在这样的情况下,关系网络图的邻接信息可以存储在管理器中,各个处理设备通过与管理器的通信,从管理器获取该邻接信息。
关系网络图的邻接信息可以体现为各种形式。在一个实施例中,通过图表记录关系网络图中的连接信息和拓扑结构,这样的图表即可作用为邻接信息。例如,上述图表中可以记录,各个节点都与哪些节点连接。如此,通过这样的图表,可以确定第一节点的一阶邻居节点。
在另一实施例中,通过邻接矩阵记录关系网络中的连接信息,此时邻接信息可以包括上述邻接矩阵。更具体地,在一个例子中,假定矩阵A是关系网络图G的邻接矩阵,矩阵A可以表示为:
A=[amk]N*N,
其中,第m行第k列的元素amk对应于节点m与节点k之间的关联强度。
如果两个节点之间没有连接,不存在关联关系,那么它们之间的关联强度为0。
通过这样的邻接矩阵,可以简单地获取各个节点的邻居节点信息,还可以在必要的时候获取关联强度信息。具体地,对于节点i,可以获取邻接矩阵A中与节点i对应的第i行元素或第i列元素,即aij或aji;将第i行元素或第i列元素中非零元素对应的节点j确定为节点i的一阶邻居节点。
如此,通过各种方式确定出第一节点的至少一个一阶邻居节点。
在一个具体例子中,假定当前处理设备被分配的第一节点组包括编号为11-20的节点,在下面的描述中将节点11作为第一节点。通过步骤31,假定确定出,节点11的一阶邻居节点包括节点2,节点15,以及节点30。
接着,在步骤32,根据节点分配信息,确定所述至少一个一阶邻居节点所对应的至少一个处理设备,也就是确定,这些一阶邻居节点分别存储在哪些处理设备中。
如前所述,在初始化阶段完成了节点的分配,并且节点在各个处理设备中的分配状况可以记录为节点分配信息。在一个实施例中,将该节点分配信息存储在各个处理设备中。如此,每个处理设备可以从其本地读取节点分配信息,获知各个一阶邻居节点所对应的处理设备。在另一实施例中,分布式架构还包括管理器。在这样的情况下,节点分配信息可以存储在管理器中,各个处理设备通过与管理器的通信,从管理器获取该节点分配信息。
在前述具体例子中,节点11的一阶邻居节点包括节点2,节点15,以及节点30。假定通过步骤32确定出,一阶邻居节点2存储在处理设备1中,节点15存储在当前处理设备中,当前处理设备例如被编号为处理设备2;节点30存储在处理设备3中。
另一方面,在步骤33,确定第一节点的初始嵌入向量作为当前阶数嵌入向量。可以通过多种方式确定第一节点的初始嵌入向量。在一个实施例中,基于第一节点的节点特征,确定其初始嵌入向量。例如,在具体例子中,关系网络图中的节点对应于用户,此时节点特征可以包括,用户属性特征,例如注册时长、用户注册信息(例如年龄、职业、收入等)。可以基于这些用户属性特征,生成k维的特征向量作为初始嵌入向量,其中k为要映射的多维空间的维数。在这样的情况下,初始嵌入向量可以反映节点的属性特征。
在另一实施例中,还可以简单的基于第一节点本身的标识生成其初始嵌入向量,例如第一节点的节点编号11可以作为其标识,用于生成初始嵌入向量。在这样的情况下,初始嵌入向量主要用于标识不同节点。
如此,针对第一节点(例如节点11)确定出初始嵌入向量作为其当前阶数嵌入向量。可以理解,第一节点实际上可以是任意一个节点,因此,实际上,当前处理设备可以针对其分配到的第一节点组中的每个节点生成初始嵌入向量;并且,类似的,其他处理设备也可以针对其分配的节点组中的每个节点生成初始嵌入向量。
如此,分别存储在多个处理设备中的关系网络图的每个节点,都被赋予了初始嵌入向量作为其当前阶数嵌入向量。
接下来,对各个节点的当前阶数嵌入向量进行更新。仍然以当前处理设备中的第一节点为例描述该更新过程,也就图3的步骤34。
如前所述,在步骤32,已经确定出第一节点的一阶邻居节点所对应的各个处理设备。并且,通过步骤33,分别存储在多个处理设备中的关系网络图的每个节点,都被赋予了初始嵌入向量作为其当前阶数嵌入向量。在此基础上,在子步骤341,从第一节点的一阶邻居节点所对应的各个处理设备中,获取各个一阶邻居节点所分别对应的当前阶数嵌入向量。可以理解,由于已经获知各个一阶邻居节点对应的处理设备,而这些处理设备已经为其中的各个节点赋予了当前阶数嵌入向量,那么当前处理设备可以分别向各个一阶邻居节点所在的处理设备发出请求,在请求中携带要求读取的一阶邻居节点的节点标识。其他处理设备接收到这样的请求后,可以根据请求中的节点标识,读取节点标识对应节点的当前阶数嵌入向量,将其返回给当前处理设备。于是,当前处理设备可以分别从各个处理设备获取各个一阶邻居节点的当前阶数嵌入向量。如果某个一阶邻居节点也存储在当前处理设备中,那么可以直接从本地读取该邻居节点的当前阶数嵌入向量。
然后在子步骤342,根据各个一阶邻居节点分别对应的当前阶数嵌入向量,确定第一节点的下一阶数嵌入向量。
在一个实施例中,通过对各个一阶邻居节点分别对应的各个当前阶数嵌入向量进行加权求和,确定第一节点的下一阶数嵌入向量。以上加权求和的权重例如可以基于该一阶邻居节点与第一节点之间的连接强度而确定。
在其他实施例中,还可以通过其他嵌入算法来确定第一节点的下一阶数嵌入向量,例如采用Softmax函数确定下一阶数嵌入向量,或者简单地对各个一阶邻居节点的当前阶数嵌入向量求平均等等。
接着,在子步骤343,用下一阶数嵌入向量更新第一节点的当前阶数嵌入向量。不断重复以上过程,直到当前阶数达到预定节点搜索深度。
下面结合具体例子描述以上过程。
在前述例子中,通过步骤31和32,假定确定出,节点11的一阶邻居节点包括节点2,节点15,以及节点30,其中节点2存储在处理设备1中,节点15存储在当前处理设备2中,节点30存储在处理设备3中。在步骤33,为节点11生成初始嵌入向量作为其当前阶数嵌入向量。初始地,当前阶数为0,因此,节点11的0阶嵌入向量(也就是其初始嵌入向量)可以记为V0-11。相应地,每个节点都会被其负责的处理设备赋予初始嵌入向量作为当前阶数嵌入向量。节点2的0阶嵌入向量记为V0-2,节点15的0阶嵌入向量记为V0-15,节点30的0阶嵌入向量记为V0-30。
在步骤341,从节点11的一阶邻居节点所对应的各个处理设备中,获取各个一阶邻居节点所分别对应的当前阶数嵌入向量。
第一次执行该步骤341时,当前阶数为0阶。此时,从节点11的一阶邻居节点2对应的处理设备1中,获取节点2的当前阶数嵌入向量V0-2;从节点15对应的处理设备2,即本地处理设备中,获取节点15的当前阶数嵌入向量V0-15,从节点30对应的处理设备3中,获取节点30的当前阶数嵌入向量V0-30。
接着,在步骤342,根据各个一阶邻居节点分别对应的当前阶数嵌入向量,确定第一节点的下一阶数嵌入向量。也就是,根据以上的向量V0-2,V0-15,V0-30,确定节点11下一阶数,即1阶嵌入向量。假定确定下一阶数嵌入向量的算法为,对邻居节点的当前阶数嵌入向量求和,那么节点11的1阶嵌入向量V1-11为:
V1-11=V0-2+V0-15+V0-30
然后在步骤343,用下一阶数嵌入向量更新第一节点的当前阶数嵌入向量,也就是,将节点11的当前阶数嵌入向量更新为V1-11。可以看到,节点11的1阶嵌入向量中包含有其一阶邻居节点的信息。
需要理解的是,以上描述的针对节点11的处理过程实际上适用于各个处理设备中的各个节点。例如,节点11的一阶邻居节点2,保存在处理设备1中,那么处理设备1也会针对节点2进行同样的处理。假设节点2的一阶邻居节点包括节点11,节点35和节点42,那么经过同样的过程,节点2也会基于其邻居节点的0阶嵌入向量得到其1阶嵌入向量:
V1-2=V0-11+V0-35+V0-42
其他节点的过程不再赘述。
如此,得到各个节点的1阶嵌入向量。假定1阶并未达到预定搜索深度,那么再次执行步骤34。
再一次地,在步骤341,从节点11的一阶邻居节点所对应的各个处理设备中,获取各个一阶邻居节点所分别对应的当前阶数嵌入向量。
第二次执行该步骤341时,当前阶数为1阶。此时,从节点11的一阶邻居节点2对应的处理设备1中,获取节点2的当前阶数嵌入向量V1-2;从节点15对应的处理设备2获取节点15的当前阶数嵌入向量V1-15,从节点30对应的处理设备3中,获取节点30的当前阶数嵌入向量V1-30。
然后在步骤342,根据各个一阶邻居节点分别对应的当前阶数嵌入向量,确定第一节点的下一阶数嵌入向量。也就是,根据以上的向量V1-2,V1-15,V1-30,确定节点11的2阶嵌入向量。利用同样的算法,节点11的2阶嵌入向量V2-11为:
V2-11=V1-2+V1-15+V1-30
也就是说,节点11的2阶嵌入向量依赖于各个邻居节点的1阶嵌入向量。进一步需要理解的是,第一节点i的邻居节点j的1阶嵌入向量实际上依赖于该节点j的一阶邻居节点k的0阶嵌入向量,而该节点k对于第一节点i来说,即为邻居节点的邻居节点,即二阶邻居节点。因此,第一节点11的2阶嵌入向量反映了其二阶邻居的信息。
例如,在以上例子中,节点2是节点11的一阶邻居,如以上所描述,节点2的1阶嵌入向量为V1-2=V0-11+V0-35+V0-42
因此,节点11的2阶嵌入向量又可以写为:
V2-11=V1-2+V1-15+V1-30
=V0-11+V0-35+V0-42+V1-15+V1-30
其中仅展开了节点2的1阶嵌入向量V1-2作为示例,而没有展开节点15和节点30的1阶嵌入向量。但是已经可以看到,节点11的2阶嵌入向量V2-11中,包含节点2的邻居节点35和42的信息V0-35和V0-42,也就是节点11的二阶邻居的信息。
接着,在步骤343,用该下一阶数嵌入向量更新第一节点的当前阶数嵌入向量,也就是,将节点11的当前阶数嵌入向量更新为V2-11。
类似的,每个处理设备都同步地更新其负责节点的当前阶数嵌入向量,此时,各个处理设备均存储节点的2阶嵌入向量。并且,根据以上分析,每个节点的2阶嵌入向量包含有其二阶邻居节点的信息。
如果2阶仍未达到预定搜索深度,那么再次执行步骤34。
第三次执行步骤341时,当前阶数为2阶。此时,分别从处理设备1,2和3获取节点11的一阶邻居节点2,节点15和节点30的2阶嵌入向量V2-2;V2-15,以及V2-30。
然后在步骤342,根据各个一阶邻居节点分别对应的当前阶数嵌入向量,确定第一节点的下一阶数嵌入向量。也就是,根据以上的向量V2-2,V2-15,V2-30,确定节点11的3阶嵌入向量。利用同样的算法,节点11的3阶嵌入向量V3-11为:
V3-11=V2-2+V2-15+V2-30
因此,节点11的3阶嵌入向量依赖于各个邻居节点的2阶嵌入向量。而如前所述,每个节点的2阶嵌入向量包含有其二阶邻居节点的信息,因此,第一节点11的3阶嵌入向量反映了其三阶邻居的信息。
接着,在步骤343,用该下一阶数嵌入向量更新第一节点的当前阶数嵌入向量,也就是,将节点11的当前阶数嵌入向量更新为V3-11。
类似的,每个处理设备都同步地更新其负责节点的当前阶数嵌入向量,此时,各个处理设备均存储节点的3阶嵌入向量。并且,根据以上分析,每个节点的3阶嵌入向量包含有其三阶邻居节点的信息。
继续判断当前阶数是否达到预设节点搜索深度。如果没有达到,则继续重复执行步骤34,直到达到预定节点搜索深度。
通过以上过程可以看到,每执行一次步骤34,节点的嵌入向量阶数增加1,嵌入向量所基于的邻居节点的阶数也增加1。也就是说,执行N次步骤34后,可以得到各个节点的N阶嵌入向量,该N阶嵌入向量包含节点的N阶邻居节点的信息。
在当前阶数N达到预设节点搜索深度时,跳出循环,在步骤36,将此时第一节点的当前阶数嵌入向量,确定为该第一节点的嵌入向量。类似的,对于每个节点,都可以将其当前阶数嵌入向量作为其嵌入向量。于是,确定了关系网络图中每个节点的嵌入向量,也就是实现了将该关系网络图嵌入到多维空间的图嵌入过程。
在以上过程中,需要反复执行步骤34,在其中的子步骤341,从第一节点的一阶邻居节点所对应的各个处理设备中,获取各个一阶邻居节点所分别对应的当前阶数嵌入向量。这个过程涉及处理设备之间的通信。为了使得通信需求尽可能小、且较平均地分布在每个处理设备,在一个实施例中,预先将关系网络图划分为多个相对孤立的子图,并将每个子图包含的所有节点分配到一个处理设备上。可以理解,在关系网络图的常见表示中,用边将具有关联关系的节点进行连接,也就是,任一节点与其一阶邻居节点之间存在边连接。那么,在一个实施例中,可以按照被分割的边数量最小的原则,将关系网络图划分为多个相对孤立的子图。在这样的情况下,被分割的边在一定程度上与通讯量相对应。当按照如此划分的子图将各个节点分配到处理设备时,可以使得每个节点的一阶邻居节点尽可能地位于本地处理设备上,相应地,在步骤341,尽可能地从本地处理设备获取各个当前阶数嵌入向量,从而减小处理设备之间的通信量和通信负担。
回顾以上过程,每个处理设备仅需存储自己被分配的一组节点的节点信息,而不需要存储邻居节点的信息;在图嵌入过程中,每个处理设备反复获取自己负责节点的一阶邻居节点的当前阶嵌入向量,据此确定自己节点的下一阶嵌入向量,也就是,通过反复迭代的次数,来实现更高阶的邻居节点信息的获取。如此,各个处理设备本地只需存储少量的节点数,嵌入算法的计算量由于被多次迭代所分担也不会造成较大的内存压力。根据这样的分布式图嵌入方案,处理设备所需的存储量和计算量都不会受到图直径和搜索深度的不利影响,可以针对各种关系网络图和各种图嵌入算法实现高效的图嵌入并行计算。
根据另一方面的实施例,还提供一种分布式图嵌入装置。图4示出根据一个实施例的图嵌入装置的示意性框图。该图嵌入装置400用于在分布式架构中将关系网络图嵌入到多维空间,其中关系网络图包括多个节点,所述分布式架构包括多个处理设备,各个处理设备分别被分配有所述多个节点中的一组节点,所述装置400包含在所述多个处理设备中的某一处理设备中。如图4所示,所述装置400包括:
邻居确定单元41,配置为针对本处理设备所分配的第一节点组中的第一节点,根据所述关系网络图的邻接信息,确定所述第一节点的至少一个一阶邻居节点;
设备确定单元42,配置为根据节点分配信息,确定所述至少一个一阶邻居节点所对应的至少一个处理设备,其中所述节点分配信息记录所述多个节点在所述多个处理设备中的分配状况;
初始向量确定单元43,配置为确定所述第一节点的初始嵌入向量作为当前阶数嵌入向量;
向量更新单元44,配置为更新所述第一节点的当前阶数嵌入向量,进一步包括:邻居向量获取模块441,配置为从所述至少一个处理设备获取所述至少一个一阶邻居节点所分别对应的至少一个当前阶数嵌入向量;嵌入向量确定模块442,配置为根据所述至少一个当前阶数嵌入向量,确定所述第一节点的下一阶数嵌入向量;嵌入向量更新模块443,配置为用所述下一阶数嵌入向量更新所述第一节点的当前阶数嵌入向量;
判断单元45,配置为判断当前阶数是否达到预设节点搜索深度,在没有达到的情况下,使得所述向量更新单元44反复执行所述更新所述第一节点的当前阶段嵌入向量,直到所述当前阶数达到预设节点搜索深度;
嵌入向量确定单元46,配置为将当前阶数达到预设节点搜索深度时第一节点的当前阶数嵌入向量,确定为所述第一节点的嵌入向量。
在一个实施例中,所述邻接信息包括记录所述关系网络图的连接关系的图表。
在另一实施例中,所述邻接信息包括所述关系网络图的邻接矩阵;在这样的情况下,所述邻居确定单元41配置为:获取所述邻接矩阵中与所述第一节点所在行对应的行元素或与所述第一节点所在列对应的列元素;将所述行元素或列元素中非零元素对应的节点确定为所述第一节点的至少一个一阶邻居节点。
根据一种实施方式,所述邻接信息和/或所述节点分配信息存储在本地处理设备中。在这样的情况下,所述邻居确定单元41配置为,从本地读取所述邻接信息,以及/或者,所述设备确定单元42配置为,从本地读取所述节点分配信息。
根据另一种实施方式,所述分布式架构还包括管理器,所述管理器用于存储所述邻接信息和/或所述节点分配信息。在这样的情况下,所述装置400还包括(未示出)信息获取单元,配置为从所述管理器获取所述邻接信息和/或所述节点分配信息。
根据一个具体实施例,所述初始向量确定单元43配置为:基于第一节点的节点特征,确定其初始嵌入向量,其中所述第一节点对应于用户,所述节点特征包括用户属性特征。
在一个实施例中,所述邻居向量获取模块441配置为:分别向所述至少一个处理设备发出请求,所述请求中包括所述至少一个一阶邻居节点的节点标识;从所述至少一个处理设备接收所述节点标识所对应节点的当前阶数嵌入向量。
根据一种可能的实施方式,嵌入向量确定模块442配置为:以所述至少一个一阶邻居节点与第一节点之间的连接强度为权重,对各个一阶邻居节点分别对应的各个当前阶数嵌入向量进行加权求和,确定第一节点的下一阶数嵌入向量。
根据一种实施例,所述预设节点搜索深度为N,所述第一节点的嵌入向量为N阶嵌入向量,所述N阶嵌入向量包括所述第一节点的N阶邻居节点的信息。
通过以上的方法和装置,可以通过分布式架构快速有效地将复杂的关系网络图嵌入到任意维度的多维空间中,从而便于后续的节点信息处理。
根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图3所描述的方法。
根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图3所述的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。