DeepWalk:图网络与NLP的巧妙融合
作者 | kaiyuan
整理 | NewBeeNLP公众号
最近这段时间一直在做图网络相关,也差不多收尾了,有空整体复盘了下,大致以下几个主题,不过没整理完全哈哈(下次一定
)
顺手再安利几份资料吧
- 斯坦福的CS224W课程
- 清华大学唐杰老师的很多分享
- 清华大学 thunlp/GNNPapers
- 一些大佬们的新书:《Graph Representation Learning》、《Deep Learning on Graphs》
- 等等
ok,回到正题,今天要介绍的这篇是『Graph Embedding』系列第一篇,十分经典
- 论文:DeepWalk: Online Learning of Social Representations[1]
- 代码:https://github.com/phanein/deepwalk
enjoy~
TL;DR
DeepWalk是首次将深度学习技术(无监督学习)引入到网络分析(network analysis)中的工作,它的输入是一个图,最终目标就是获得网络图中每个结点的向量表示
。毕竟万物皆可向量,得到向量之后能做的事情就非常多了。如下所示是论文中给出的Karate network
例子。
先验知识
说到生成向量表示,最有名的莫过于Word2Vec
了,那么是不是可以将network embedding
的问题转化为熟悉的word embedding
形式呢?这样我们就可以借用word2vec的思想来解决了。
转化的方式就是Random Walk
,通过这种方式将图结构表示为一个个序列,然后我们就可以把这些序列当成一个个句子,每个序列中的结点就是句子中的单词。
简单的说,DeepWalk = RandomWalk + SikpGram
, 下面我们来具体介绍下两种技术。
Random Walk
随机游走,顾名思义,就是从输入图中的任意一个结点
开始,随机选取与其邻接的下一个结点,直至达到给定长度
, 生成的序列
。在论文中,对于每一个顶点
, 都会随机游走出
条序列。
采用随机游走有两个好处:
- 「利于并行化」:随机游走可以同时从不同的顶点开始采样,加快整个大图的处理速度;
- 「较强适应性」:可以适应网络局部的变化;
Skip Gram
word2vec的skip-gram相信大家都非常熟悉了,这里就不再赘述,放一张图。
DeepWalk
结合上面两点, deepwalk其实就是首先利用random walk来表示图结构,然后利用skip-gram模型来更新学习节点表示。算法流程如下所示:
算法有两层循环,第一层循环采样
条路径,第二层循环遍历图中的所有结点随机采样一条路径并利用skip-gram模型进行参数更新。
其中第2步构建二叉树的目的是为了方便后续 SkipGram模型的层次softmax算法。
参数更新的流程如下:
一个小结
deepwalk可以说给网络学习方向打开了一个新思路,有很多优点:
- 支持数据稀疏场景
- 支持大规模场景(并行化)
但是仍然存在许多不足:
- 游走是完全随机的,但其实是不符合真实的社交网络的;
- 未考虑有向图、带权图
本文参考资料
[1]
DeepWalk: Online Learning of Social Representations: https://arxiv.org/abs/1403.6652
- END -
- 通过Chocolatey软件包管理器安装.NET Core
- rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
- 近期一枚“大文娱”dawenyu.com域名以小六位价格易主
- 分布式监控系统Zabbix-3.0.3-完整安装记录(0)
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- 温故而知新:设计模式之工厂模式(Factory)
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- jquery.mobile手机网页简要
- 跟张志东深聊腾讯的“进化力”
- 详解微信小程序如何实现流程进度功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 说说Android的UI刷新机制的实现
- Android仿直播类app赠送礼物功能
- android自定义imageview实现圆角图片
- 基于android实现五子棋开发
- Android Fragment的静态注册和动态注册创建步骤
- Android从Fragment跳转到其他Activity的简单实例
- Android7.0以上Uri转路径的方法实现(已验证)
- Android studio实现简单计算器
- Android 自定义LayoutManager实现花式表格
- android studio编译jar包或者aar包的方法教程详解
- Android实现屏幕录制功能
- Android实现扫描二维码功能
- android实现录屏功能
- android自定义手表效果
- Android 测量文字宽度的实例方法