一 前言

在图中,如果能把节点表示成合适的数值,能做很多任务,例如节点分类,关系预测,聚类等等。如何把节点表示成计算机能看懂的数值目前也有很多方法,本文主要为大家介绍基于DeepWalk的节点表示方法。

从某个节点的邻居中随机挑选一个节点作为下一跳节点的过程称为随机游走(Random Walk,下文简称游走),多次重复游走过程可产生游走序列。

随机游走负责对图进行采样,获得图中节点与节点的共现关系。产生的序列可以作为训练样本输送到模型(如word2vec)中进行训练,进而得到图上节点嵌入向量,即embedding。

Graph Embedding技术将图中的节点以低维稠密向量的形式进行表达,要求在原始图中相似(不同的方法对相似的定义不同)的节点其在低维表达空间也接近。得到的表达向量可以用来进行下游任务,如节点分类,链接预测,可视化或重构原始图等。

二 DeepWalk 算法原理

虽然DeepWalk是KDD 2014的工作,但却是我们了解Graph Embedding无法绕过的一个方法。

我们都知道在NLP任务中,word2vec是一种常用的word embedding方法,word2vec通过语料库中的句子序列来描述词与词的共现关系,进而学习到词语的向量表示。

DeepWalk的思想类似word2vec,使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系,DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样。

RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问起始节点,从其邻居中随机采样节点作为下一个访问节点,重复此过程,直到访问序列长度满足预设条件。

获取足够数量的节点访问序列后,使用skip-gram model 进行向量学习。

首先根据用户的行为构建出一个图网络;随后通过Random walk随机采样的方式构建出结点序列(例如:一开始在A结点,A->B,B又跳到了它的邻居结点E,最后到F,得到"A->B->E->F"序列);对于序列的问题就是NLP中的语言模型,因为我们的句子就是单词构成的序列。接下来我们的问题就变成Word2vec(词用向量表示)的问题,采用Skip-gram的模型来得到最终的结点向量。可以说这种想法确实是十分精妙,将图结构转化为序列问题确实是非常创新的出发点。在这里,结点走向其邻居结点的概率是均等的。当然,在有向图和无向图中,游走的方式也不一样。无向图中的游走方式为相连即可走;而有向图中则是只沿着“出边”的方向走。

上图出自阿里Embedding实践paper:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba

  1. 图a展示原始的用户行为序列
  2. 图b基于这些用户行为序列构建了物品相关图,可以看出,物品A,B之间的边产生的原因就是因为用户U1先后购买了物品A和物品B,所以产生了一条由A到B的有向边。如果后续产生了多条相同的有向边,则有向边的权重被加强。在将所有用户行为序列都转换成物品相关图中的边之后原始的deepwalk paper中是没有权重的,就是randomWalk),得到全局的物品相关图。
  3. 图c采用随机游走的方式随机选择起始点,对每个节点重新生成部分物品序列(采样)。得到局部相关联的训练数据,deepwalk将这组序列当成语言模型的一个短句,最大化给定短句某个中心词时,出现上下文单词的概率。
  4. 图d最终将这些物品序列输入word2vec模型,生成最终的物品Embedding向量。

DeepWalk算法

DeepWalk算法主要包括两个步骤:

第一步为随机游走采样节点序列,构建同构网络,从网络中的每个节点开始分别进行Random Walk 采样,得到局部相关联的训练数据;

第二步为使用skip-gram modelword2vec学习表达向量,对采样数据进行SkipGram训练,将离散的网络节点表示成向量化,最大化节点共现,使用Hierarchical Softmax来做超大规模分类的分类器

DeepWalk采用DFS即深度优先遍历,这里贴浅梦大佬的实现

def deepwalk_walk(self, walk_length, start_node):walk = [start_node]while len(walk) < walk_length:cur = walk[-1]cur_nbrs = list(self.G.neighbors(cur))if len(cur_nbrs) > 0:walk.append(random.choice(cur_nbrs))else:breakreturn walk

需要注意的是,DeepWalk中的DFS和数据结构与算法中的dfs思想类似,但是细节存在差异,在deepwalk中游走到死胡同直接break,而数据结构与算法中游走到死胡同返回初始点继续游走

Skip-gram介绍

skip-gram 和 CBOW 是两种 word2vec 算法,前者是通过中间的词预测两边的词,后者是通过周边的词预测中间的词。就实际效果而言,skip-gram 效果更好。skip-gram 的结构如下图所示。

直接用gensim里的Word2Vec

from gensim.models import Word2Vec
model = Word2Vec(walks, sg=1, size=100,  window=5,  min_count=5,  negative=3, sample=0.001, hs=1, workers=4)  

walks是训练所需语料(Node Embedding Sentences)

1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。

2.size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。

3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。

4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。

5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。

6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。

7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。

三 Node2Vec 算法原理

2016年出现的node2vec,node2vec的思想同DeepWalk一样,生成随机游走,对随机游走采样得到(节点,上下文)的组合,然后用处理词向量的方法对这样的组合建模得到网络节点的表示。不过在生成随机游走过程中做了一些创新,node2vec改进了DeepWalk中随机游走的生成方式(通过调整随机游走权重的方法使graph embedding的结果在网络的同质性(homophily)结构性(structural equivalence)中进行权衡),使得生成的随机游走可以反映深度优先和广度优先两种采样的特性,从而提高网络嵌入的效果。

node2vec提出在图网络中很多节点往往有一些类似的结构特征。一种结构特征是很多节点会聚集在一起,内部的连接远比外部的连接多,称之为社区。另一种结构特征是网络中两个可能相聚很远的点,在边的连接上有着类似的特征。

网络的“同质性”指的是距离相近节点的embedding应该尽量近似,如图,节点u与其相连的节点s1、s2、s3、s4的embedding表达应该是接近的,这就是“同质性“的体现。

网络的“结构性”指的是结构上相似的节点的embedding应该尽量接近,图中节点u和节点s6都是各自局域网络的中心节点,结构上相似,其embedding的表达也应该近似,这是“结构性”的体现。

node2vec论文中提出一个好的网络表示学习算法的目标必须满足这两点:

  1. 同一个社区内的节点表示相似。
  2. 拥有类似结构特征的节点表示相似。

node2vec算法

node2vec游走方式

node2vec的主要创新点通过改进游走方式

  1. 深度优先游走DFS
  2. 广度优先搜索BFS

就如上图的标注所示,深度优先游走策略将会限制游走序列中出现重复的结点,防止游走掉头,促进游走向更远的地方进行。而广度优先游走策略相反将会促进游走不断的回头,去访问上一步结点的其他邻居结点。这样一来,当使用广度优先策略时,游走将会在一个社区内长时间停留,使得一个社区内的结点互相成为context,这也就达到了第一条优化目标。相反,当使用深度优先的策略的时候,游走很难在同一个社区内停留,也就达到了第二条优化目标。

复杂网络处理的任务离不开两种特性:一种是同质性,就是上文所说的社区。一种就是结构相似性。广度优先搜索BFS倾向于在初始节点的周围游走,可以反映出一个节点的邻居的微观特性;而深度优先游走DFS一般会跑的离初始节点越来越远,可以反映出一个节点邻居的宏观特性。

node2vec区别于deepwalk,主要是通过节点间的跳转概率。跳转概率是三阶关系,即考虑当前跳转节点,以及前一个节点 到下一个节点的“距离”,通过返回参数p和进出(或叫远离)参数q控制游走的方向(返回还是继续向前)

对于节点v,其下一步要采样的节点x,通过下面的转移概率公式计算

其中d(t, x)代表t结点到下一步结点x的最短路,最多为2。

  • 如果t与x相等,那么采样x的概率为 1/p,当d(t, x)=0时,表示下一步游走是回到上一步的结点;
  • 如果t与x相连,那么采样x的概率1,当d(t, x)=1时,表示下一步游走跳向t的另外一个邻居结点;
  • 如果t与x不相连,那么采样x概率为 1/q,当d(t, x)=2时,表示下一步游走向更远的结点移动。

参数p、q的意义分别如下:

返回概率p:

  • 如果 p > max(q,1) p>max(q,1) p>max(q,1) ,那么采样会尽量不往回走,对应上图的情况,就是下一个节点不太可能是上一个节点t。
  • 如果 p < max( q,1) p<max(q,1) p<max(q,1) ,那么采样会更倾向于返回上一个节点,这样就会一直在起始点周围某些节点来回转来转去。

出入参数q:

  • 如果 q > 1 q>1 q>1,那么游走会倾向于在起始点周围的节点之间跑,可以反映出一个节点的BFS特性。
  • 如果 q < 1 q<1 q<1 ,那么游走会倾向于往远处跑,反映出DFS特性。

当p=1,q=1时,游走方式就等同于DeepWalk中的随机游走

四 node2vec和deep walk 捕捉网络什么特性

BFS随机游走策略产生的embedding结果 DFS随机游走策略产生的embedding结果
   

颜色接近的节点代表其embedding的相似性更强

BFS的搜索策略非常类似于社区发现所得到的社区相似性,即更加接近一种直观容易解释的思路,偏向于一阶和二阶近邻这类的相似性,也就是距离接近,特别是直接连接的nodes之间的embedding结果接近,也就是“结构性”,可以理解为,BFS的搜索策略能够捕捉到“近邻相似性”;

DFS则看起来不那么直观了,但是其实从传统graph的一些评价指标可以进行分析和总结,例如pagerank,pagerank值计算的是节点的流行度,比如说中国的明星和美国的明星,二者的近邻相似度肯定是非常低的,但是它们都在“演艺圈”这个巨大的graph中扮演着相似的角色,这一点我们可以通过pagerank这类统计方法来得到,成龙和杰森斯坦森之间的pagerank值的差异相对于成龙或杰森斯坦森和其它18线小明星的pagerank值的差异明显要小得多,而我们的dfs捕捉的相似性指的就是这种相似性,即 节点在更大的范围内(可能横跨多个社区而形成的大子图,具体根据random walk的步数来决定)中扮演的角色(同质性,同样性质的相似性),例如我们看第二幅图,连接不同nodes的“枢纽节点”其embedding的相似度往往比较高,从社交网络的角度来说,这些枢纽节点都是“交际花”,虽然她们彼此之间的直接相连的近邻相似度可能非常低,但是它们“交际”的性质是非常相似的,即在局部的子图中扮演着相似的角色;

p和q均为1的时候,node2vec退化为deepwalk,因此实际上我们可以知道,deepwalk本身并不是基于什么dfs之类的做游走的,就是一个纯粹的随机乱走,它即可以捕捉到部分结构性也可以捕捉到部分同质性,具体deepwalk能够捕捉到什么样的性质,就看天意了,所以我们不能说deepwalk就是基于dfs的游走策略游走主要捕捉同质性,而应该说deepwalk同时捕捉两种特性然而两种特性都捕捉的不是非常到位,而node2vec更像是基于deepwalk上的一个灵活的框架,因为我们可以通过指定超参数来改变我们想要进行embedding的目的,如果我们面临的实际问题,定义相似性为同质性,

因此,只能说deepwalk能够捕捉节点之间的共现性,这个共现性可能包含了同质性也可能包含了结构性,而node2vec可以让使用者灵活的定义我们要捕捉更多的结构性还是更多的同质性,置于基于整个graph的同质性,比如上面所说的远距离局部社区相同或者相似角色的embedding问题,我们就需要考虑使用别的embedding算法来解决了,比如计算复杂度非常高基本没法在大规模graph上运行的struc2vec。

https://zhuanlan.zhihu.com/p/56380812

https://cloud.tencent.com/developer/article/1547385

https://zhuanlan.zhihu.com/p/231753603

[图神经网络] 图节点Node表示(DeepWalk与Node2Vec)相关推荐

  1. 干货!Labeling Trick: 一个图神经网络多节点表示学习理论

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! GNN 旨在学习单节点表示.当我们想要学习一个涉及多个节点的节点集表示(如链路表示)时,以往工作中的一个常见做法是将 GNN 学习到的多 ...

  2. 图神经网络基础--基于图神经网络的节点表征学习

    图神经网络基础–基于图神经网络的节点表征学习 引言 在图节点预测或边预测任务中,首先需要生成节点表征(Node Representation).我们使用图神经网络来生成节点表征,并通过基于监督学习的对 ...

  3. 基于图神经网络的节点表征

    我们使用图神经网络来生成节点表征,并通过基于监督学习的对图神经网络的训练,使得图神经网络学会产生高质量的节点表征.高质量的节点表征能够用于衡量节点的相似性,同时高质量的节点表征也是准确分类节点的前提. ...

  4. [图神经网络] 图神经网络GNN基础入门

    最近,深度学习领域关于图神经网络(Graph Neural Networks,GNN)的研究热情日益高涨,图神经网络已经成为各大深度学习顶会的研究热点,包括社交网络,知识图,推荐系统,甚至生命科学.G ...

  5. 图神经网络-图与图学习笔记-1

    图神经网络-图与图学习 笔记-1 目录 一. 图是什么? 图的基本表示方法 计算图的每个节点的度 计算边的数量 可视化 二. 如何存储图? 存储为边列表 使用邻接矩阵 使用邻接列表 三. 图的类型和性 ...

  6. 图神经网络--图神经网络

    图神经网络 图神经网络 图神经网络 一.PageRank简介 1.1互联网的图表示 1.2PageRank算法概述 1.3求解PageRank 二.代码实战 2.1引入库 2.2加载数据,并构建图 2 ...

  7. [图神经网络] 图节点Node表示---GraphSAGE与PinSAGE

    一 前言 在大规模图上学习节点embedding,在很多任务中非常有效,如学习节点拓扑结构的 DeepWalk 以及同时学习邻居特征和拓扑结构的semi-GCN. 但是现在大多数方法都是直推式学习, ...

  8. [图神经网络] 图节点Node表示---GCN

    一. 概括 图神经网络已经成为深度学习领域最炽手可热的方向之一.GCN具体思想的核心是通过拉普拉斯矩阵可以对图信息进行特征分解的特点把该公式定义为图卷积操作,同时图卷积的出现也填补了神经网络获取拓扑图 ...

  9. [图神经网络] 图节点Node表示---GAT

    一. 概括 图神经网络已经成为深度学习领域最炽手可热的方向之一.本文提出Graph Attention Networks(GATs),将注意力机制应用到图神经网络中,每一层学习节点每个邻居对其生成新特 ...

最新文章

  1. binaryreader java,C# 二进制文件的读写 | 菜鸟教程
  2. LeetCode 2020 力扣杯全国秋季编程大赛(656/3244,前20.2%)
  3. HDU2016 数据的交换输出【入门】
  4. P3371 单源最短路径【模板】 洛谷
  5. idea 2017 常用图标
  6. 浪潮ERP-PS异速联远程接入解决方案
  7. Windows放大镜黑屏问题以及快捷键
  8. 【Scratch算法讲解】01-Scratch选择排序 少儿编程Scratch常见排序算法案例分析讲解
  9. 靶向目标基因检测技术
  10. VSCode之容器开发环境搭建 (Remote-Containers)
  11. 时序分析 19 VAR(Vector Autoregression) 向量自回归
  12. Spark入门实战系列--1.Spark及其生态圈简介
  13. U盘安装kali linux
  14. 闲谈IPv6-IPv6地址聚类分配原则于源地址选择的关系
  15. zabbix安装(详细)本文没有截图看我网盘文档有图
  16. easypoi导出模板excel
  17. TOGAF学习札记(二)
  18. KMP算法解决病毒检测问题
  19. 如何将PDF制作成电子书
  20. Be Agile VS Do Agile 之 2 企业引入Agile方式之探讨

热门文章

  1. pg日期转周_postgresql 存储过程函数:时间戳与日期字符串相互转换
  2. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题
  3. IE兼容问题 动态生成的节点IE浏览器无法触发
  4. Selenium 控制浏览器
  5. script与scriptreplay用法
  6. 浅谈物联网时代智能停车发展趋势
  7. Android QQ登录 程序奔溃的问题
  8. 1084. Broken Keyboard (20)
  9. 高级特性(6)- 高级Swing
  10. nginx location配置详解