整理自
https://www.cnblogs.com/panchuangai/p/12567923.html
https://zhuanlan.zhihu.com/p/58105731
目录
白话理解1
deepwalk用于将graph向量化 以便后续的深度学习
在读paper时 我读了很多遍都未能领悟精髓 如果你现在与我当初疑惑相同 请看下文
此方法借鉴NLP里的思想
将图中所有vertex标记
random walk开始 随机取起始点 规定路径长度 随机漫游graph
如 从3开始 规定路径长度为3 得到一条random walk路径
开始借鉴NLP思想,这条路径上临近点与点之间必然联系密切 有共同特征。现在将3-2-4-5当作一个句子,各个顶点为句子中单词
在NLP中我们要将单词变成低维度向量,此处同理
假设图中有10000个顶点,我们如果用长度为10000的向量分别表示会有以下问题
- 当顶点更多时占用空间太大
- 向量之前没有什么联系
上图为用来向量化的神经网络
还是暂时先将10000个点用长度10000的向量表示(如顶点1表示为[1,0,0,...,0] 顶点4为[0,0,0,1,0,...,0]
输入为某个顶点
通过10000*h的W矩阵 变成了h长度的向量
再通过h*10000的矩阵变回10000长度的向量
要训练这个网络 我们需要设置目标
目的是输入一个顶点后 在1*10000的输出结果中 那些与输入点关系密切的位置得分(数值)较高
(回到之前的graph, 比如输入为2, 与2关系密切的点都在之前random walk所制造的“句子”中 即为3 4 5,于是我们训练网络目的是让输出向量第3 4 5维度的得分较大)
我们通过deepwalk得到了许多的“句子” 即为我们的训练集
当网络训练成熟后,形象理解,我们已经将每个vertex的特征刻画在了neural network里的参数中
观察上图标蓝处,input的第一个维度只和W1的第一行进行了线性计算
也就是W1的第一行便可以提取input的第一个维度的信息 也就是顶点1的信息
所以顶点1的低维度向量表示即为W1的第一行
最后需注意的是h的值要设置较小
在paper里 作者为了生动表达效果将h设置为2
结果如图
白话理解2
数据的图示
当你想到“网络”时,会想到什么?通常是诸如社交网络,互联网,已连接的IoT设备,铁路网络或电信网络之类的事物。在图论中,这些网络称为图。
网络是互连节点的集合。节点表示实体,它们之间的连接是某种关系。
例如,我们可以用图的形式表示一组社交媒体帐户:
节点是用户的数字档案,连接表示他们之间的关系,例如谁跟随谁或谁与谁是朋友。
图的用例不仅限于社交媒体!我们还可以使用图和网络表示其他类型的数据(并且在本文中我们将介绍一个独特的行业用例)。
为什么不仅仅使用典型的数据可视化技术来可视化数据?为什么要更复杂并学习新概念?下面我们会给出答案。
图数据集和数据库可帮助我们应对在处理结构化数据时面临的若干挑战。这就是为什么当今的主要科技公司,例如Google,Uber,Amazon和Facebook使用某种形式的图的原因。
让我们以一个例子来理解为什么图是数据的重要表示形式。看下图:
这是一小部分Facebook用户(a, B, C, D, E, F, G)的数据集。图像的左半边包含这个数据的表格形式。每一行代表一个用户和他/她的一个朋友。
右半部分包含代表同一组用户的图。该图的边缘告诉我们,连接的节点是Facebook上的朋友。现在,让我们解决一个简单的查询:
“找到用户A的朋友和用户A朋友的朋友。”
查看表格数据和上面的图。哪种数据形式更适合回答此类查询?
使用图来解决该问题要容易得多,因为我们只需要遍历从节点A长度为2的路径(ABC和ADF),即可找到朋友和朋友的朋友。
因此,图可以轻松捕获节点之间的关系,这在常规数据结构中是一项艰巨的任务。现在,让我们看看使用图可以解决什么样的问题。
基于图的特征的不同类型
为了解决上述问题,我们无法将图直接提供给机器学习模型。我们必须首先从中创建特征,然后模型将使用这些特征。
此过程类似于我们在自然语言处理(NLP)或计算机视觉中所做的过程。我们首先从文本或图像中提取数字特征,然后将这些特征作为输入提供给机器学习模型:
从图中提取的特征可以大致分为三类:
- 节点属性:我们知道图中的节点代表实体,并且这些实体具有自己的特征属性。我们可以将这些属性用作每个节点的特征。例如,在航空公司航线网络中,节点将代表机场。这些节点将具有飞机容量,航站楼数量,着陆区等特征。
- 局部结构特点:节点的度(相邻节点的数量),相邻节点的平均度,一个节点与其他节点形成的三角形数,等等。
- 节点嵌入:上面讨论的特征仅包含与节点有关的信息。它们不捕获有关节点上下文的信息。在上下文中,我指的是周围的节点。节点嵌入通过用固定长度向量表示每个节点,在一定程度上解决了这个问题。这些向量能够捕获有关周围节点的信息(上下文信息)
用于学习节点嵌入的两个重要的现代算法是DeepWalk和Node2Vec。在本文中,我们将介绍并实现DeepWalk算法。
DeepWalk简介
要了解DeepWalk,重要的是要正确理解词嵌入及其在NLP中的使用方式。我建议在下面的文章中仔细阅读Word2Vec的解释:
https://www.analyticsvidhya.com/blog/2019/07/how-to-build-recommendation-system-word2vec-python/?utm_source=blog&utm_medium=graph-feature-extraction-deepwalk
为了将事物置于上下文中,词嵌入是文本的向量表示形式,它们捕获上下文信息。让我们看看下面的句子:
- 我乘巴士孟买
- 我乘火车去孟买
粗体字(公共汽车和火车)的向量将非常相似,因为它们出现在相同的上下文中,即粗体文本之前和之后的词。该信息对于许多NLP任务非常有用,例如文本分类,命名实体识别,语言建模,机器翻译等等。
我们还可以在每个节点的图中捕获此类上下文信息。但是,为了学习NLP空间中的词嵌入,我们将句子提供给Skip-gram模型(浅层神经网络)。句子是按一定顺序排列的单词序列。
因此,要获得节点嵌入,我们首先需要安排图中的节点序列。我们如何从图中获得这些序列?有一项针对该任务的技术称为随机游走。
随机游走是一种从图中提取序列的技术。我们可以使用这些序列来训练一个skip-gram模型来学习节点嵌入。
让我说明一下随机游走的工作原理。让我们考虑下面的无向图:
我们将在该图上应用随机游走并从中提取节点序列。我们将从节点1开始,并覆盖任意方向的两条边:
从节点1,我们可以转到任何连接的节点(节点3或节点4)。我们随机选择了节点4。现在再次从节点4开始,我们不得不随机选择前进的方向。我们将转到节点5。现在我们有3个节点的序列:[节点1 –节点4 –节点5]。
让我们生成另一个序列,但是这次是从另一个节点生成的:
让我们选择节点15作为原始节点。从节点5和6,我们将随机选择节点6。然后从节点11和2,我们选择节点2。新序列为[节点15 –节点6 –节点2]。
我们将对图中的每个节点重复此过程。这就是随机游走技术的工作原理。
在生成节点序列之后,我们必须将它们提供给一个skip-gram模型以获得节点嵌入。整个过程被称为Deepwalk。