从图嵌入算法到图神经网络

一、引言

近几年来,伴随着计算机算力的急剧提升,神经网络从历史的尘埃中走出,横扫各大领域,完成一次次颠覆性的创新。依托高度弹性的参数结构,线性与非线性的矩阵变换,神经网络能适用于各式各样的数学场景,在各个类别的应用上我们都能看到神经网络的影子。其中著名的应用方向,包括自然语言处理、计算机视觉、机器学习、生物医疗、推荐系统、自动驾驶等等。图神经网络,广泛应用于社交关系、知识图谱、推荐系统、蛋白质分子建模,同样源自于对传统领域的创新,它的前身是图嵌入算法;而图嵌入算法又以图数据作为载体。这一关系,将贯穿本文始末,成为我们的展开线索。

二、图

在进入图嵌入算法前,本节将详细介绍该领域下的基础知识,包括各类图的概念以及路径相关算法。希望直入主题的读者可直接跳到下一节。

相关概念

(Graph) 是最基础的几种计算机 数据结构 之一,由若干个 节点 (Node, or Vertex) 构成;节点与节点相连,构成 (Edge),代表了两者之间的依赖关系。根据图中边的方向,概念上可将图分为两种:有向图 (Directed Graph, or Digraph) 和 无向图 (Undirected Graph, or Undigraph),如下所示,左侧为无向图,右侧为有向图:

在这里插入图片描述
当边被赋予权重,则图可称为 权重图 (Weighted Graph):

在这里插入图片描述
一个形象的例子是城市地图,每一个交叉路口是一个节点,道路是一条边,而权重指的则是道路的长度。但如果我们希望用权重大小代表拥挤程度,在地图上看到每条道路的拥堵情况,那么一条边显然不足以满足我们的要求。这时就引申出了 多重图 (Multigraph):
在这里插入图片描述

概念上,多重图必然是有向图和权重图;但需要注意的是,多重图中两个节点之间的边,既可以单向,也可以双向,i.e. 节点 A A A B B B 之间可以有两条或以上 A → B A\rightarrow B AB 的边;两条或两条以上的单向边成为 平行边 (Parallel Edges),而平行边的数量称为 重数 (Multiplicity)。

此外,还有一些其他类型图的定义,包括 混合图 (Mixed Graph),指的是既包含无向边也包含有向边的图;连通图 (Connected Graph),指的是任意两个节点都有路径 (一个或多个边相连) 相连的无向图;强连通图 (Strongly-connected Graph),指的是任意两个节点都有路径相连的有向图;循环图 (Cyclic Graph),指的是存在首尾相连的路径,可以串起所有节点的图;以及最后的 完全图 (Complete Graph),指的是所有节点之间都有边相连的无向图。

清楚这些图的概念,是我们理解算法、熟悉算法应用场景的前提。

路径相关算法

伴随着图一起诞生的,是与路径相关的算法,其中部分算法可以帮助我们从图中提取更多的特征信息融入到节点中,从而丰富图的架构,在图嵌入或图神经网络算法中达到更好的效果。

  • 拓扑排序 (Topological Sorting):
    在这里插入图片描述
    应用于有向非循环图,是对图中的所有节点 V i V_i Vi ( i = 1 , . . . , n ) (i=1,...,n) (i=1,...,n) 进行统一排序,使得对于任意边 ( V a → V b ) (V_a\rightarrow V_b) (VaVb),满足 a &lt; b a&lt;b a<b。经过拓扑排序的图,能加速目标检索的效率,同时能够快速获取两个节点间的上下游位置,应用场景包括学位课程之间的先修关系、面对对象程序类之间的继承,以及工程项目之间的调度等。需要注意的是,一个有向非循环图可能存在不止一种拓扑排序的结果。算法原理在于通过迭代,将无入度的节点从原图中抽出放入排序序列中,直至所有节点全部抽出。
  • 深度优先搜索 (DFS, abbr. Depth-First Searching):
    在这里插入图片描述
    通过遍历检测两个节点是否连通,或检测一个图是否为连通图。其过程类似于牵着绳子走入迷宫,每一个拐角是一个节点,当走到死角时,记录来过这里,沿着绳子的路线返回寻找下一个拐角;这将用到两个栈,分别记录走访过的节点,以及绳子沿路的拐角。实际应用中,全程只用一根绳子无疑是低效的,因此常常引入递归的思想,每到一个拐点切出多个绳头分头搜索。
  • 广度优先搜索 (BFS, abbr. Breadth-First Searching):
    在这里插入图片描述
    依据从源点出发,路径上的节点数量,将全图分为不同的层级,逐层向下检查。相对于深度优先搜索,广度优先搜索能够保证在边的数量上两个节点间检索到的路径最短。
  • Dijkstra 算法
    在这里插入图片描述
    算法思想在于从源点出发,构建一个逐步扩张的“云”,每次迭代将云外离源点最近的节点拉入到云内来,使云逐渐遍布全图,从而检索到两个节点间的最短路径。时间复杂度为 O ( n 2 ) O(n^2) O(n2),是贪心算法应用在路径问题上的绝佳案例。
  • Floyd-Warshall 算法
    在这里插入图片描述
    假如我们不希望每次检索两个节点是否连通,或计算最短路径时,都从头开始遍历,可以使用该算法生成 传递闭包 (Transitive Closure),以加速后续检索,一劳永逸。该算法的原理在于每次迭代时,将所有满足连通要求的 V k − 1 → V k → V k + 1 V_{k-1}\rightarrow V_k\rightarrow V_{k+1} Vk1VkVk+1 V k − 1 V_{k-1} Vk1 V k + 1 V_{k+1} Vk+1 单独建立联系,构建新的边 V k − 1 → V k + 1 V_{k-1}\rightarrow V_{k+1} Vk1Vk+1。如此一来,多次迭代过后,所有可连通的节点对 ( V a V_a Va, V b V_b Vb) 都将拥有直接关系。需要注意的是,该算法的时间复杂度为 O ( k n 3 ) O(kn^3) O(kn3) k k k 为迭代次数,为保证所有可达节点配对存在直接相连的边,算法的运算消耗最高可接近 O ( n 4 ) O(n^4) O(n4)。显而易见,当节点的数量 n n n 逐渐增加时,算法运行的时间消耗将呈灾难性地增加。
  • Prim-Jarnik 算法
    在这里插入图片描述
    归属于 最小生成树 (MST, abbr. Minimum-Spanning-Tree) 一类的算法,旨在求解连通所有节点的最短路径。由 Dijkstra 算法调整而来,以所有零入度节点作为云的初始状态,不断找寻离云内节点最近的邻点拉入到云内来,以此迭代,直至所有节点访问完毕。如果不存在零入度点,则随机挑选一个加入到云中。

三、图嵌入算法

在这里插入图片描述
abbr. Graph Embedding Algorithms,目的在于学习图的结构或节点之间的邻接关系,对节点进行编码 (或对固有特征进行降维),将所有节点映射为等维度的向量,使其能够方便地应用于下游的聚类、分类、关联分析或可视化任务。因此,在实际应用中,图嵌入属于预处理工作,绝大多数图嵌入算法皆为无监督学习算法。

常见概念

  • (Graph): G ( V , E ) G(V,E) G(V,E)
  • 节点 (Node, or Vertex): V = { v 1 , . . . , v n } V=\{v_1,...,v_n\} V={ v1,...,vn},包含全部节点
  • (Degree): D = { d e g 1 , . . . , d e g n } D=\{deg_1,...,deg_n\} D={ deg1,...,degn},包含每个节点的入度数量
  • (Edge): E = { e i j } i , j = 1 n E=\{e_{ij}\}_{i,j=1}^n E={ eij}i,j=1n,包含所有的边;如果边是双向的,则分别表达为两条,e.g. v i ↔ v j v_i\leftrightarrow v_j vivj 关系将对应 e i j e_{ij} eij e j i e_{ji} eji;如果边 v i → v j v_i\rightarrow v_j vivj 不存在,则不会出现在 E E E 里面
  • 邻点 (Neighbors): N ( v i ) \mathcal{N}(v_i) N(vi),包含节点 v i v_i vi 的所有邻点
  • 邻接矩阵 (Adjacency Matrix): A = { w i j ∣ w i j ≥ 0 } i , j = 1 n ∈ R n × n A=\{w_{ij}|w_{ij}\ge 0\}_{i,j=1}^n\in\mathbb{R}^{n\times n} A={ wijwij0}i,j=1nRn×n,记录图中边的权重信息;对于无向图, w i j = w j i w_{ij}=w_{ji} wij=wji;要求所有的边权重不得小于 0;对于不相邻的节点, w i j = w j i = 0 w_{ij}=w_{ji}=0 wij=wji=0
  • 一阶相似度 (First-order Proximity):边的权重 w i j w_{ij} wij,代表两个节点的直接依赖关系
  • 二阶相似度 (Second-order Proximity):对于节点 v i v_i vi v j v_j vj,从邻接矩阵分别获取相应的一阶相似性 w i = [ w i 1 , . . . , w i n ] \mathrm{w_i}=[w_{i1},...,w_{in}] wi=[wi1,...,
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值