node2vec: Scalable Feature Learning for Networks

Github整理代码链接,欢迎讨论和交流,觉得有用的可以Star一下。

1.主要思想

目的:是将图中的顶点映射到一个低维连续空间,并且能够保存图的空间结构。

论文的主要亮点,设计了与Deepwalk不同的随机游走方式,每次随机游走会选择是进行宽度游走Breadth-first Sampling (BFS)还是深度游走Depth-first Sampling (DFS) ,如图1所示 。
       获得游走路径集合后,与Deepwalk类似使用Skip-Gram模型进行顶点的Embedding学习

图1 两种游走策略

2.流程

2.1 优化目标

f(u)f(u)f(u)是将顶点uuu映射为Embedding向量的映射函数,Ns(u)N_{s}(u)Ns(u)为通过采样策略SSS采样出的顶点uuu的近邻顶点集合。

将现有的Skip-gram模型扩展到网络中来,优化以下目标函数

优化目标函数:给定一个顶点,令其近邻顶点出现的概率最大
max⁡f∑u∈VlogPr(Ns(u)∣f(u))\mathop {\max }\limits_{f}\sum_{u\in V}logPr(N_s(u)|f(u)) fmaxuVlogPr(Ns(u)f(u))
      为了使公式1能够得到很好的优化求解,提出了两个假设:

1.条件独立

给定一个顶点,其近邻顶点出现的概率与近邻集合中的其他顶点无关,得到公式2:
Pr(Ns(u)∣f(u))=∏ni∈Ns(u)Pr(ni∣f(u))Pr(N_s(u)|f(u))=\prod_{n_i\in N_s(u)}Pr(n_i|f(u)) Pr(Ns(u)f(u))=niNs(u)Pr(nif(u))
      2.特征空间中的对称性

源顶点和近邻顶点在特征空间中具有对称性,不管顶点是源顶点还是近邻点Embedding表达是一样的。(对比Line中的二阶相似度有所不同),得到公式3:
Pr(ni∣f(u))=exp(f(ni)⋅f(u))∑v∈Vexp(f(v)⋅f(u))Pr(n_i|f(u))=\frac{exp(f(n_i)\cdot f(u))}{\sum_{v\in V}exp(f(v)\cdot f(u))} Pr(nif(u))=vVexp(f(v)f(u))exp(f(ni)f(u))
      根据以上两个假设条件,最终的目标函数公式1简化为公式4,由于Zu=∑v∈Vexp(f(ni)⋅f(u))Z_u=\sum_{v\in V}exp(f(n_i)\cdot f(u))Zu=vVexp(f(ni)f(u))计算复杂度高,所以采用负采样近似优化
max⁡f∑u∈V[−logZu+∑ni∈Ns(u)f(ni)⋅f(u)]\mathop {\max }\limits_{f}\sum_{u\in V}[-logZ_u+\sum_{n_i\in N_s(u)}f(n_i)\cdot f(u)] fmaxuV[logZu+niNs(u)f(ni)f(u)]

2.2 采样策略

2.2.1 路径采样策略

Node2vec依然延续了Deepwalk采用随机游走的方式获取顶点的近邻序列,Node2vec不同的是采用的是一种有偏的随机游走。

给定当前顶点vvv ,访问下一个顶点 xxx 的概率为公式5,其中πvx\pi_{vx}πvx为顶点vvv和顶点xxx为归一化的转移概率,ZZZ为一个常量,设πvx=αpq(t,x)⋅wvx\pi_{vx}=\alpha_{pq}(t,x)\cdot w_{vx}πvx=αpq(t,x)wvxαpq(t,x)\alpha_{pq}(t,x)αpq(t,x)tttxxx的游走策略生成的概率,wvxw_{vx}wvx是顶点vvv和顶点xxx之间的边权。
P(ci=x∣ci−1=v)={πvxZ(v,x)∈V0(v,x)∉VP(c_i=x|c_{i-1}=v)=\left\{\begin{matrix} \frac{\pi_{vx}}{Z} &(v,x)\in V \\ 0 & (v,x)\notin V \end{matrix}\right. P(ci=xci1=v)={Zπvx0(v,x)V(v,x)/V
      Node2vec引入两个超参数pppqqq来控制随机游走的策略。如图2所示,假设当前随机游走顶点ttt经过边 (t,v)(t,v)(t,v) 到达顶点vvv,顶点vvv的下一个访问顶点xxx的概率根据公式6计算得到,公式6中dtxd_{tx}dtx为下一个访问顶点xxx和当前顶点vvv的上一个顶点ttt之间的距离
αpq(t,x)={1pdtx=01dtx=11qdtx=2\alpha_{pq}(t,x)=\left\{\begin{matrix} \frac{1}{p}& d_{tx}=0 \\ 1&d_{tx}=1\\ \frac{1}{q}&d_{tx}=2 \end{matrix}\right. αpq(t,x)=p11q1dtx=0dtx=1dtx=2

图2 p和q参数示意
  • 返回参数ppp
          仅作用于dtx=0d_{tx}=0dtx=0的情况,控制顶点vvv重复访问上一步顶点的概率,如果ppp较大,则下一步游走访问上一步顶点的概率越小,反之越大。
  • 输入输出参数qqq
    仅作用于dtx=2d_{tx}=2dtx=2的情况,控制顶点vvv随机游走下一步的游走策略类型,BFS和DFS
  1. Breadth-first Sampling (BFS)
    如果qqq较大,则顶点vvv下一步游走倾向于访问顶点vvv上一步顶点近邻顶点,构成了宽度游走策略
  2. Depth-first Sampling (DFS)
    如果qqq较小,则顶点vvv下一步游走倾向于访问顶点vvv上一步顶点距离远的顶点,构成了深度游走策略

2.2.2 顶点采样策略

顶点采样策略区别于Deepwalk,不是随机采样顶点,使用Alias Sample方法进行采样。Alias Sample具体实现方式见Line论文整理3.3.4。本文中Alias Sample与Line中不同之处在于创建邻居顶点的Node Alias Sample Table,而Line中是创建的全局Node Alias Sample Table。

3.向量学习

通过带策略的随机游走获得路径集合,根据所获得的路径集合,与Deepwalk类似使用Skip-Gram模型进行顶点的Embedding学习。具体Skip-Gram模型见Deepwalk论文整理。

4.代码实现和实验

4.1 游走策略代码

Node2Vec中Edge Alias Sample根据公式6计算,给定一个顶点src,计算src的邻居顶点访问概率,为了在随机游走下一个顶点中使用;Node Alias Sample根据顶点的出度归一化生成概率计算得到

# _*_ coding: utf-8 _*_
"""
Time:     2020/9/9 17:50
Author:   Cheng Ding(Deeachain)
Version:  V 0.1
File:     node2vec.py
Describe: Write during the internship at Hikvison, Github link: https://github.com/Deeachain/GraphEmbeddings
"""
# Edge Alias Sample
def get_alias_edge(self, src, dst):'''Get the alias edge setup lists for a given edge.'''G = self.Gp = self.pq = self.qunnormalized_probs = []for dst_nbr in sorted(G.neighbors(dst)):if dst_nbr == src:  # dx=0unnormalized_probs.append(G[dst][dst_nbr]['weight'] / p)elif G.has_edge(dst_nbr, src):  # dx=1unnormalized_probs.append(G[dst][dst_nbr]['weight'])else:  # dx=2unnormalized_probs.append(G[dst][dst_nbr]['weight'] / q)norm_const = sum(unnormalized_probs)normalized_probs = [float(u_prob) / norm_const for u_prob in unnormalized_probs]return alias_setup(normalized_probs)'''
Node Alias Sample
'''
alias_nodes = {}
for node in G.nodes():unnormalized_probs = [G[node][nbr]['weight'] for nbr in sorted(G.neighbors(node))]norm_const = sum(unnormalized_probs)normalized_probs = [float(u_prob) / norm_const for u_prob in unnormalized_probs]alias_nodes[node] = alias_setup(normalized_probs)
  • 游走策略代码
# _*_ coding: utf-8 _*_
"""
Time:     2020/9/9 17:50
Author:   Cheng Ding(Deeachain)
Version:  V 0.1
File:     node2vec.py
Describe: Write during the internship at Hikvison, Github link: https://github.com/Deeachain/GraphEmbeddings
"""
def node2vec_walk(self, walk_length, start_node):G = self.Galias_nodes = self.alias_nodesalias_edges = self.alias_edgeswalk = [start_node]while len(walk) < walk_length:cur = walk[-1]cur_nbrs = list(G.neighbors(cur))if len(cur_nbrs) > 0:if len(walk) == 1:  # 路径中只有一个顶点时,从邻居顶点中根据边权生成概率,使用alias采样下一个顶点,不直接使用第二种情况采样的原因是为了构成采样策略walk.append(cur_nbrs[alias_sample(alias_nodes[cur][0], alias_nodes[cur][1])])else: # 路径中大于一个顶点时,根据邻居顶点p和q的采样策略生成概率,使用alias采样下一个顶点prev = walk[-2]edge = (prev, cur)next_node = cur_nbrs[alias_sample(alias_edges[edge][0],  alias_edges[edge][1])]walk.append(next_node)else:breakreturn walk

4.2 实验

Node2Vec源码[1]中仅使用karate.edges数据集,该数据集是关于跆拳道俱乐部成员之间关系的社交网络,节点没有标签,作者源码没有复现原文中的数据集。整理代码采用了另外的三个公开数据集,分别是:Cora数据集由机器学习论文组成,总共有2708篇论文,应用关系有5429个,论文总共七类(基于案例、遗传算法、神经网络、概率方法、强化学习、规则学习、理论);DBLP数据集也是引文网络组成的图,只选用了4类;BlogCatalog数据集是Blog用户之间关系构成的社交网络,相关详细参数见表1

表1 整理代码使用数据集
数据集 cora dblp BlogCatalog
V 2708 17725 10312
E 5429 105781 333983
Class 7 4 39

实验参数:

  • Deepwalk:词向量维度d=128d=128d=128、每个顶点游走路径数γ=50\gamma=50γ=50、游走路径长度t=20t=20t=20Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10
  • Line:词向量维度d=128d=128d=128、二阶相似度生成128维词向量、Epoch=150Epoch=150Epoch=150lr=0.005lr=0.005lr=0.005num_negative=5num\_negative=5num_negative=5。(目前Line模型存在一定问题,不能复现论文效果。)
    1. Cora数据集有向图实验,一阶相似度:节点分类f1=0.44f1=0.44f1=0.44,可视化能区分一部分节点,;二阶相似度节点分类f1=0.52f1=0.52f1=0.52,,可视化能区分一部分节点
    2. COra数据集无向图实验,一阶相似度:节点分类f1=0.48f1=0.48f1=0.48,可视化能区分一部分节点,;二阶相似度节点分类f1=0.62f1=0.62f1=0.62,,可视化能区分一部分节点
  • Node2vec:词向量维度d=128d=128d=128、返回参数p=0.25p=0.25p=0.25、输入输出参数q=0.25q=0.25q=0.25p、q∈(0.25,0.5,1,2,4)p、q\in ({0.25,0.5,1,2,4})pq(0.25,0.5,1,2,4)文中实验证明pppqqq越小越好)、每个顶点游走路径数γ=50\gamma=50γ=50、游走路径长度t=20t=20t=20Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10

Node2Vec通过带偏策略的游走得到路径集合,接着SkipGram模型学习顶点的Embedding,最后使用Embedding设计顶点分类任务。数据集划分80%的数据用于训练,20%用于评估,分类任务使用SVM分类,得到顶点的分类指标f1-score如表2所示。

表2 顶点分类f1-score指标
cora dblp
Deepwalk(f1-micro) 0.8542 0.8327
Line(f1-micro) 0.6218 0.6262
Node2vec(f1-micro) 0.8561 0.8386

节点Embedding表达在空间维度上,相同类别的节点距离会越靠近,最后将学习得到的Embedding进行可视化展示。可视化使用的是TSNE实现,将向量降维到二维平面上。可视化效果如图3所示。


图3 Embedding可视化

参考和引用

[1]. 论文源码

Node2Vec笔记相关推荐

  1. 【论文笔记】node2vec:可扩展的网络特征学习

    node2vec: Scalable Feature Learning for Networks Arxiv 1607.00653 三.特征学习框架 我们将网络中的特征学习表示为最大似然优化问题. 设 ...

  2. 图网络笔记-知识补充与node2vec代码注解

    主要引入基本的同构图.异构图知识以及基本概念:同时对deepWalk代码的注解以及node2vec.word2vec的说明总结:(以及作业代码注解) 一.图基础及分类 1.1 什么是图? 用一张图表示 ...

  3. Graph Embedding模型【Node2Vec】学习笔记

    声明:本文写于2020-09-22,于2021-05-26修改.仅增加了一些模型细节和改了一些排版 概要 本文的内容主要是阅读Node2Vec论文<Node2Vec: Scalable Feat ...

  4. Node2Vec图神经网络论文阅读笔记

    数据集 斯坦福图神经网络数据集snap是Jure等人不间断收集的网络数据集,极大地推动了社交网络领域的发展. 数据集可能存在一些指标或性质说明需要在使用之前先理解: Average clusterin ...

  5. 笔记︱基于网络节点的node2vec、论文、算法python实现

    看到一个很有意思的算法,而且腾讯朋友圈lookalike一文中也有提及到,于是蹭一波热点,学习一下.论文是也发KDD2016 . . 一.主要论文:node2vec: Scalable Feature ...

  6. 近期知识图谱顶会论文推荐,另附超详笔记解读

    精选 4 篇来自 WSDM 2019.NeurIPS 2018.WWW 2018 和 COLING 2018 的知识图谱相关工作,带你快速了解知识图谱领域最新研究进展. 本期内容选编自微信公众号「开放 ...

  7. 从word2vec到node2vec

    word2vec 1. 什么是word2vec 在自然语言处理任务(NLP)中,最细粒度是词语,所以处理NLP问题,首先要处理好词语. 由于所有自然语言中的词语,都是人类的抽象总结,是符号形式的.而对 ...

  8. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  9. Source-Code-Notebook(源码解析和逐行笔记)

    Source-Code-Notebook 关于一些经典论文源码Source Code的中文笔记,尽量做到整体框架梳理和逐行源码注释. 不过太早期的代码一般都模块化了,所以主要更一些后期(2017-NO ...

  10. cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)

    诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Graph as Matrix 2. PageRank / the Google Algor ...

最新文章

  1. Verilog学习----条件语句、循环语句、块语句与生成语句
  2. html 未来元素绑定事件,jquery on如何给未来元素绑定事件?
  3. Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
  4. tomcat中设置Java 客户端程序的http(https)访问代理
  5. 【Makefile由浅入深完全学习记录1】认识make和makefile
  6. css网页练习-3视觉
  7. 雷军凌晨2点下班、刘强东睡4小时,这碗鸡汤程序员你必须干了
  8. 华为大佬:做一个快乐的程序员,而不是码农
  9. CISA:很多受害者和 SolarWinds 之间并不直接相关
  10. Linux 系统文件及结构
  11. Kruskal/Prim/Dijkstra模板
  12. 嵌入式系统的概念,嵌入式系统的组成及特点,嵌入式系统的基本开发流程
  13. ios获得设备处理器cpu类型
  14. Android 应用桌面角标显示
  15. 服务器删除安装的系统教程,服务器安装系统教程
  16. MySQL(4.常见函数)
  17. 用Python实现斗地主游戏(终端版)
  18. 13个offer,8家SSP,谈谈秋招经验
  19. python入门实例
  20. 2010-2020管理类联考MBA/MEM英语大作文范文模版

热门文章

  1. VS2012下载和安装
  2. nu-book/zxing-cpp在windows7下的编译
  3. IDEA 方法自动添加注释
  4. adb命令刷机vivox20_求救VIVO X20的 ROOT可行的方法。
  5. 魔兽国服修改服务器地址,魔兽国服退役服务器上架暴雪官方商店
  6. Java学生管理系统项目
  7. [下载]Windows 10测试版的新版雅黑字体及切换工具
  8. pythoncookbook和流畅的python对比_流畅的python和cookbook学习笔记(五)
  9. MES系统源码 MES系统功能介绍
  10. 数组对象转json格式