Node2Vec笔记
node2vec: Scalable Feature Learning for Networks
Github整理代码链接,欢迎讨论和交流,觉得有用的可以Star一下。
1.主要思想
目的:是将图中的顶点映射到一个低维连续空间,并且能够保存图的空间结构。
论文的主要亮点,设计了与Deepwalk不同的随机游走方式,每次随机游走会选择是进行宽度游走Breadth-first Sampling (BFS)还是深度游走Depth-first Sampling (DFS) ,如图1所示 。
获得游走路径集合后,与Deepwalk类似使用Skip-Gram模型进行顶点的Embedding学习
2.流程
2.1 优化目标
设f(u)f(u)f(u)是将顶点uuu映射为Embedding向量的映射函数,Ns(u)N_{s}(u)Ns(u)为通过采样策略SSS采样出的顶点uuu的近邻顶点集合。
将现有的Skip-gram模型扩展到网络中来,优化以下目标函数
优化目标函数:给定一个顶点,令其近邻顶点出现的概率最大
maxf∑u∈VlogPr(Ns(u)∣f(u))\mathop {\max }\limits_{f}\sum_{u\in V}logPr(N_s(u)|f(u)) fmaxu∈V∑logPr(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))=ni∈Ns(u)∏Pr(ni∣f(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(ni∣f(u))=∑v∈Vexp(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=∑v∈Vexp(f(ni)⋅f(u))计算复杂度高,所以采用负采样近似优化
maxf∑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)] fmaxu∈V∑[−logZu+ni∈Ns(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)是ttt到xxx的游走策略生成的概率,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=x∣ci−1=v)={Zπvx0(v,x)∈V(v,x)∈/V
Node2vec引入两个超参数ppp和 qqq来控制随机游走的策略。如图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
- 返回参数ppp
仅作用于dtx=0d_{tx}=0dtx=0的情况,控制顶点vvv重复访问上一步顶点的概率,如果ppp较大,则下一步游走访问上一步顶点的概率越小,反之越大。 - 输入输出参数qqq
仅作用于dtx=2d_{tx}=2dtx=2的情况,控制顶点vvv随机游走下一步的游走策略类型,BFS和DFS
- Breadth-first Sampling (BFS)
如果qqq较大,则顶点vvv下一步游走倾向于访问顶点vvv上一步顶点近邻顶点,构成了宽度游走策略 - 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
数据集 | 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=20、Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10
- Line:词向量维度d=128d=128d=128、二阶相似度生成128维词向量、Epoch=150Epoch=150Epoch=150、lr=0.005lr=0.005lr=0.005、num_negative=5num\_negative=5num_negative=5。(目前Line模型存在一定问题,不能复现论文效果。)
- Cora数据集有向图实验,一阶相似度:节点分类f1=0.44f1=0.44f1=0.44,可视化能区分一部分节点,;二阶相似度节点分类f1=0.52f1=0.52f1=0.52,,可视化能区分一部分节点
- 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.25(p、q∈(0.25,0.5,1,2,4)p、q\in ({0.25,0.5,1,2,4})p、q∈(0.25,0.5,1,2,4)文中实验证明ppp和qqq越小越好)、每个顶点游走路径数γ=50\gamma=50γ=50、游走路径长度t=20t=20t=20、Epoch=5Epoch=5Epoch=5、SkipGram窗口大小w=10w=10w=10
Node2Vec通过带偏策略的游走得到路径集合,接着SkipGram模型学习顶点的Embedding,最后使用Embedding设计顶点分类任务。数据集划分80%的数据用于训练,20%用于评估,分类任务使用SVM分类,得到顶点的分类指标f1-score如表2所示。
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所示。
参考和引用
[1]. 论文源码
Node2Vec笔记相关推荐
- 【论文笔记】node2vec:可扩展的网络特征学习
node2vec: Scalable Feature Learning for Networks Arxiv 1607.00653 三.特征学习框架 我们将网络中的特征学习表示为最大似然优化问题. 设 ...
- 图网络笔记-知识补充与node2vec代码注解
主要引入基本的同构图.异构图知识以及基本概念:同时对deepWalk代码的注解以及node2vec.word2vec的说明总结:(以及作业代码注解) 一.图基础及分类 1.1 什么是图? 用一张图表示 ...
- Graph Embedding模型【Node2Vec】学习笔记
声明:本文写于2020-09-22,于2021-05-26修改.仅增加了一些模型细节和改了一些排版 概要 本文的内容主要是阅读Node2Vec论文<Node2Vec: Scalable Feat ...
- Node2Vec图神经网络论文阅读笔记
数据集 斯坦福图神经网络数据集snap是Jure等人不间断收集的网络数据集,极大地推动了社交网络领域的发展. 数据集可能存在一些指标或性质说明需要在使用之前先理解: Average clusterin ...
- 笔记︱基于网络节点的node2vec、论文、算法python实现
看到一个很有意思的算法,而且腾讯朋友圈lookalike一文中也有提及到,于是蹭一波热点,学习一下.论文是也发KDD2016 . . 一.主要论文:node2vec: Scalable Feature ...
- 近期知识图谱顶会论文推荐,另附超详笔记解读
精选 4 篇来自 WSDM 2019.NeurIPS 2018.WWW 2018 和 COLING 2018 的知识图谱相关工作,带你快速了解知识图谱领域最新研究进展. 本期内容选编自微信公众号「开放 ...
- 从word2vec到node2vec
word2vec 1. 什么是word2vec 在自然语言处理任务(NLP)中,最细粒度是词语,所以处理NLP问题,首先要处理好词语. 由于所有自然语言中的词语,都是人类的抽象总结,是符号形式的.而对 ...
- 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习
图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...
- Source-Code-Notebook(源码解析和逐行笔记)
Source-Code-Notebook 关于一些经典论文源码Source Code的中文笔记,尽量做到整体框架梳理和逐行源码注释. 不过太早期的代码一般都模块化了,所以主要更一些后期(2017-NO ...
- cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Graph as Matrix 2. PageRank / the Google Algor ...
最新文章
- Verilog学习----条件语句、循环语句、块语句与生成语句
- html 未来元素绑定事件,jquery on如何给未来元素绑定事件?
- Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
- tomcat中设置Java 客户端程序的http(https)访问代理
- 【Makefile由浅入深完全学习记录1】认识make和makefile
- css网页练习-3视觉
- 雷军凌晨2点下班、刘强东睡4小时,这碗鸡汤程序员你必须干了
- 华为大佬:做一个快乐的程序员,而不是码农
- CISA:很多受害者和 SolarWinds 之间并不直接相关
- Linux 系统文件及结构
- Kruskal/Prim/Dijkstra模板
- 嵌入式系统的概念,嵌入式系统的组成及特点,嵌入式系统的基本开发流程
- ios获得设备处理器cpu类型
- Android 应用桌面角标显示
- 服务器删除安装的系统教程,服务器安装系统教程
- MySQL(4.常见函数)
- 用Python实现斗地主游戏(终端版)
- 13个offer,8家SSP,谈谈秋招经验
- python入门实例
- 2010-2020管理类联考MBA/MEM英语大作文范文模版