共计 15259 个字符,预计需要花费 39 分钟才能阅读完成。
PGL 图学习之图游走类 metapath2vec 模型[系列五]
本我的项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5009827?contributionType=1
有疑难查看原我的项目
相干我的项目参考:
对于图计算 & 图学习的基础知识概览:前置知识点学习(PGL)[系列一] https://aistudio.baidu.com/ai…
图机器学习 (GML)& 图神经网络(GNN) 原理和代码实现(前置学习系列二):https://aistudio.baidu.com/ai…
图学习【参考资料 2】- 常识补充与 node2vec 代码注解:https://aistudio.baidu.com/ai…
图学习【参考资料 1】词向量 word2vec:[https://aistudio.baidu.com/ai…](https://aistudio.baidu.com/ai…
1. 异质图
在图构造中有一个重要概念,同构图和异构图:
同构图:节点类型仅有一种的图
异构图:节点类型有多种的图,举例如下:
异质图介绍
在真实世界中,很多的图蕴含了多种类别节点和边,这类图咱们称之为异质图。显然,同构图是异质图中的一个特例,边和节点的品种都是一。异质图比同构图的解决上更为简单。
为了可能解决理论世界中的这大部分异质图,PGL 进一步开发了图框架来对异质图模型的反对图神经网络的计算,新增了 MetaPath 采样反对异质图示意学习。
本节:
- 举例异质图数据
- 了解 PGL 是如何反对异质图的计算
- 应用 PGL 来实现一个简略的异质图神经网络模型,来对异质图中特定类型节点分类。
PGL 中引入了异质图的反对,新增 MetaPath 采样反对异质图示意学习,新增异质图 Message Passing 机制反对基于消息传递的异质图算法,利用新增的异质图接口,能轻松搭建前沿的异质图学习算法。
真实世界中的大部分图都存在着多种类型的边和节点。其中,电子交易网络就是十分常见的异质图。这种类型的图通常蕴含两种以上类型的节点(商品和用户等),和两以上的边(购买和点击等)。
接下来就用图例介绍,图中有多种用户点击或者购买商品。这个图中有两种节点,别离是“用户”和“商品”。同时蕴含了两种类型的边,“购买”和“点击”。
以及学术论文
1.1 应用 PGL 创立一个异质图
在异质图中,存在着多种边,咱们须要对它们进行辨别。应用 PGL 能够用一下模式来示意边:
'click': [(0, 4), (0, 7), (1, 6), (2, 5), (3, 6)],
'buy': [(0, 5), (1, 4), (1, 6), (2, 7), (3, 5)],
}
clicked = [(j, i) for i, j in edges['click']]
bought = [(j, i) for i, j in edges['buy']]
edges['clicked'] = clicked
edges['bought'] = bought
# 在异质图中,节点也有不同的类型。因而你须要对每一个节点的类别进行标记,节点的示意格局如下:node_types = [(0, 'user'), (1, 'user'), (2, 'user'), (3, 'user'), (4, 'item'),
(5, 'item'),(6, 'item'), (7, 'item')]
# 因为边的类型不同,边的特色要依据不同类别来辨别。import numpy as np
import paddle
import paddle.nn as nn
import pgl
from pgl import graph # 导入 PGL 中的图模块
import paddle.fluid as fluid # 导入飞桨框架
seed = 0
np.random.seed(0)
paddle.seed(0)
num_nodes = len(node_types)
node_features = {'features': np.random.randn(num_nodes, 8).astype("float32")}
labels = np.array([0, 1, 0, 1, 0, 1, 1, 0])
# 在筹备好节点和边后,能够利用 PGL 来构建异质图。g = pgl.HeterGraph(edges=edges,
node_types=node_types,
node_feat=node_features)
#如果遇到报错显示没有 pgl.HeterGraph,重启我的项目即可
# 在构建了异质图后,咱们能够利用 PGL 很轻松的实现信息传递范式。在这个例子中,咱们有两种类型的边,所以咱们定义如下的信息传递函数:class HeterMessagePassingLayer(nn.Layer):
def __init__(self, in_dim, out_dim, etypes):
super(HeterMessagePassingLayer, self).__init__()
self.in_dim = in_dim
self.out_dim = out_dim
self.etypes = etypes
self.weight = []
for i in range(len(self.etypes)):
self.weight.append(self.create_parameter(shape=[self.in_dim, self.out_dim]))
def forward(self, graph, feat):
def send_func(src_feat, dst_feat, edge_feat):
return src_feat
def recv_func(msg):
return msg.reduce_mean(msg["h"])
feat_list = []
for idx, etype in enumerate(self.etypes):
h = paddle.matmul(feat, self.weight[idx])
msg = graph[etype].send(send_func, src_feat={"h": h})
h = graph[etype].recv(recv_func, msg)
feat_list.append(h)
h = paddle.stack(feat_list, axis=0)
h = paddle.sum(h, axis=0)
return h
# 通过重叠两个 HeterMessagePassingLayer 创立一个简略的 GNN。class HeterGNN(nn.Layer):
def __init__(self, in_dim, hidden_size, etypes, num_class):
super(HeterGNN, self).__init__()
self.in_dim = in_dim
self.hidden_size = hidden_size
self.etypes = etypes
self.num_class = num_class
self.layers = nn.LayerList()
self.layers.append(HeterMessagePassingLayer(self.in_dim, self.hidden_size, self.etypes))
self.layers.append(HeterMessagePassingLayer(self.hidden_size, self.hidden_size, self.etypes))
self.linear = nn.Linear(self.hidden_size, self.num_class)
def forward(self, graph, feat):
h = feat
for i in range(len(self.layers)):
h = self.layers[i](graph, h)
logits = self.linear(h)
return logits
#训练
model = HeterGNN(8, 8, g.edge_types, 2)
criterion = paddle.nn.loss.CrossEntropyLoss()
optim = paddle.optimizer.Adam(learning_rate=0.05,
parameters=model.parameters())
g.tensor()
labels = paddle.to_tensor(labels)
for epoch in range(10):
#print(g.node_feat["features"])
logits = model(g, g.node_feat["features"])
loss = criterion(logits, labels)
loss.backward()
optim.step()
optim.clear_grad()
print("epoch: %s | loss: %.4f" % (epoch, loss.numpy()[0]))
epoch: 1 | loss: 1.1593
epoch: 2 | loss: 0.9971
epoch: 3 | loss: 0.8670
epoch: 4 | loss: 0.7591
epoch: 5 | loss: 0.6629
epoch: 6 | loss: 0.5773
epoch: 7 | loss: 0.5130
epoch: 8 | loss: 0.4782
epoch: 9 | loss: 0.4551
2. methpath2vec 及其变种(原理)
上篇我的项目讲的 deepwalk、node2vec 两种办法都是在同构图中进行游走,如果在异构图中游走,会产生上面的问题:
- 偏差于呈现频率高的节点类型
- 偏差于绝对集中的节点(度数高的节点)
因而在异构图中采纳 methpath2vec 算法。
metapath2vec: Scalable Representation Learning for Heterogeneous Networks
论文网址
我的项目主页
发表工夫: KDD 2017
论文作者: Yuxiao Dong, Nitesh V. Chawla, Ananthram Swami
作者单位: Microsoft Research
Metapath2vec 是 Yuxiao Dong 等于 2017 年提出的一种用于异构信息网络(Heterogeneous Information Network, HIN)的顶点嵌入办法。metapath2vec 应用基于 meta-path 的 random walks 来构建每个顶点的异构邻域,而后用 Skip-Gram 模型来实现顶点的嵌入。在 metapath2vec 的根底上,作者还提出了 metapath2vec++ 来同时实现异构网络中的构造和语义关联的建模。
methpath2vec 中有元门路(meta path)的概念,含意就是在图中选取的节点类型形成的组合门路,这个门路是有实际意义的,例如以下面的异构图为例,A-P- A 代表同一篇论文的两个作者,A-P-C-P- A 代表两个作者别离在同一个会议上发表了两篇论文。
2.1 前置重要概念:
2.1.1 网络嵌入; 异构图 / 同构图
1)网络嵌入 Network Embedding
针对网络嵌入的相干工作次要有两大部分形成,一部分是图嵌入,一部分是图神经网络。图嵌入方面的相干代表有 Deepwalk、LINE、Node2vec 以及 NetMF,Deepwalk 源于 NLP(自然语言解决)方面的 Word2vec,将 Word2vec 利用到社交网络体现出了良好的成果,LINE 次要是针对大规模网络,Node2vec 是在 Deepwalk 的随机游走上进行了改良,使得游走不再变得那么随机,使得其概率可控,具体就不做过多赘述。对于图神经网络,GCN 通过卷积神经网络联合了街坊节点的特色示意融入到节点的示意中,GraphSAGE 它就是一个典型的生成式模型,且它联合了节点的构造信息,而且,它不是间接为每个节点生成嵌入,而是生成一个能够示意节点嵌入的函数示意模式,这样的模型,也就是这种生成式模型,有助于它在训练期间对未察看到的节点进行演绎和判断。
2)同构 Homogeneous 与异构 Heterogeneous
Heterogeneity:示意节点 / 边的单类还是多类
Heterogeneous/Heterogeneous: 示意节点是单类还是多类
为了辨别,论文增加了
- Multiplex:示意边是单类还是多类
- Attribute:是否是属性图,图的节点是否具备属性信息
依据图构造 (同构 / 异构) 以及是否蕴含节点特色,作者将图分为如下六类(缩写):
- 同构图:HOmogeneous Network (or HON),
- 属性同构图 Attributed HOmogeneous Network (or AHON),
- 点异构图 HEterogeneous Network (orHEN),
- 属性点异构图 Attributed HEterogeneous Network (or AHEN),
- 边异构图 Multiplex HEterogeneous Network (or MHEN),
- 带节点属性的异构图 Attributed Multiplex HEterogeneous Network (or AMHEN)
论文演绎了以及每一种网络类型对应的经典的钻研办法,如下表:
3)节点属性的异构图 AMHEN
论文给出一个带节点属性的异构图的例子。在左侧原始的图中,用户蕴含了性别、年龄等属性,商品蕴含了价格、类目等属性。用户与商品之间蕴含了 4 种类型的边,别离对应点击、珍藏、退出购物车以及购买行为。
传统的 graph embedding 算法比方 DeepWalk 的做法会疏忽图中边的类型以及节点的特色,而后转换成一个 HON。
如果将边的类型思考进去,那么就失去一个 MHEN,可能获得非常明显的成果。
此外,如果将节点的属性也同时思考进去,那么就利用了原图的所有信息,能够失去最好的成果。
4)AMHEN 嵌入难点
除了异构性和多样性外,解决 AMHEN 也面临着多重挑战:
- 多路复用的边(Multiplex Edges):每个节点对可能含有多种不同的类型边,如何将不同的关系边进行对立嵌入;
- 部分交互(Partial Observations):存在大量的长尾客户(可能只与某些产品进行很少的交互);
- 演绎学习(Inductive):如何解决冷启动问题;
- 可扩展性(Scalability),如何拓展到大规模网络中。
2.1.2 信息网络(Information Network)
信息网络 (Information Network) 是指一个有向图 G=(V,E),同时还有一个 object 类型映射函数 $\phi : V \to \mathcal{A}$,边类型映射函数 $\psi : E \to \mathcal{R}$。每一个 object $v \in V$, 都有一个特定的 object 类型 $\phi (v) \in \mathcal{A}$;每一条边 $e \in E$ 都有一个特定的 relation $\psi(e) \in \mathcal{R}$。
异质网络 (Heterogeneous Network) 指的是 object 的类型 $|\mathcal{A}|>1$ 或者 relation 的类型 $|\mathcal{R}>1|$。
2.1.3 网络模式(Network schema)
网络模式 (Network schema),定义为:$T_G=(\mathcal{A,R})$,是信息网络 G=(V, E) 的一种 meta 模板,这个信息网络有一个 object 类型映射函数 $\phi : V \to \mathcal{A}$ 和 link 类型映射函数 $\psi: E \to \mathcal{R}$。信息网络 G 是一个定义在 object 类型 $\mathcal{A}$ 上的有向图,并且边是 $\mathcal{R}$ 中的 relation。
2.1.4 元门路(Meta Path)
Meta Path 是 2011 年 Yizhou Sun etc. 在 Mining Heterogeneous Information Networks: Principles and Methodologies 提出的, 针对异质网络中的相似性搜寻。Meta Path 是一条蕴含 relation 序列的门路,而这些 relation 定义在不同类型 object 之间。
元门路 P 是定义在网络模式 TG = (A, R)上的,如 $A_1→^RA_2→^RA_3…→^RA_{l+1}$ 示意了从 $A_1$ 到 $A_{l+1}$ 的简单的关系,$R = R_1 ∘ R_2 ∘ R_3 ∘R_l。$ 元门路 P 的长度即为关系 R 的个数.
确定元门路的意义在于咱们会依据确定的元门路进行随机游走,如果元门路没有意义,会导致后续的训练过程中无奈充分体现节点的意义,元门路通常须要人工进行筛选。
在基于元门路的游走过程中,只有首尾节点类型雷同,就能够持续游走,直到达到最大游走长度或者找不到指定要求的节点。通常来说,元门路是对称的。
目前大部分的工作都集中在同构网络中,但实在场景下异构网络才是最常见的。针对同构网络设计的模型很多都没法利用于异构网络,比如说,对于一个学术网络而言:
- 如何高效依据上下文信息表征不同类型的节点?
- 是否用 Deepwalk 或者 Node2Vec 来学习网络中的节点?
- 是否间接将利用于同构网络的 Embedding 模型间接利用于异构网络?
解决诸如此类的挑战,有利于更好的在异构网络中利用多种网络开掘工作:
- 传统的办法都是基于结构特征(如元门路 meta-path)来求相似性,相似的办法有 PathSim、PathSelClus、RankClass 等:
- 但这种形式开掘进去的元门路(如“APCPA”)常常会呈现类似度为 0 的状况。如果咱们可能将 Embedding 的思维利用于异构网络,则不会再呈现这种状况。
-
基于这种察看,作者提出了两个能够利用于异构网络的 Graph Embedding 的算法模型——metapath2vec 以及 metapath2vec++。
问题定义 Problem Definition
Definition 1: 异质网络(Heterogeneous Network):
$G = (V,E,T)$,其中每个节点和边别离对应一个映射 $\phi(v) : V \rightarrow T_{V}$ 和 $\psi(e) : E \rightarrow T_{E}$。其中 $T_V$ 和 $T_E$ 别离示意节点的类型汇合以及关系的类型汇合。且 $\left|T_{V}\right|+\left|T_{E}\right|>2$。
Definition 2: 异质网络示意学习(Heterogeneous Network Representation Learning):
给定一个异构网络,学习一个维的潜在表征能够表征网络中顶点之间的构造信息和语义场景关系。异构网络表征学习的输入是一个低维的矩阵,其中行是一个维的向量,示意顶点的表征。这里须要留神的是,尽管顶点的类型不同,然而不同类型的顶点的表征向量映射到同一个维度空间。因为网络异构性的存在,传统的基于同构网络的顶点嵌入表征办法很难无效地间接利用在异构网络上。异质网络中的节点学习一个 $d$ 维的示意 $\mathrm{X} \in \mathbb{R}^{|V| \times d}$,$d \ll|V|$。节点的向量示意能够捕捉节点间构造和语义关系。
2.2 Metapath2vec 框架
在正式介绍 metapath2vec 办法之前,作者首先介绍了同构网络上的基于 random walk 的 graph embedding 算法的根本思维,如:Deepwalk 和 node2vec 等。该类办法采纳了相似 word2vec 的思维,即:应用 skip-gram 模型对每个顶点的部分畛域顶点信息进行预测,进而学习到每个顶点的特色示意。通常,对于一个同构网络 $G = (V,E)$,指标是从每个顶点的部分畛域上最大化网络似然:
$$
\arg \max _{\theta} \prod_{v \in V} \prod_{c \in N(v)} p(c \mid v ; \theta)
$$
其中 $N(v)$ 示意顶点 $v$ 的畛域, 如 1 -hop 以内的邻接页点, 2 -hop 以内的邻接顶点。$p(c \mid v ; \theta)$ 表 示给定顶点 $v$ 后, 顶点 $c$ 的条件概率。上面正式给出基于异构网络的 metapath2vec 嵌入算法。
metapath2vec 分为两个局部,别离是 Meta-Path-Based Random Walks 和 Heterogeneous Skip-Gram
2.2.1 Heterogeneous Skip-Gram
在 metapath2vec 中,作者应用 Skip-Gram 模型通过在顶点 $v$ 的畛域 $N_{t}(v), t \in T_{V}$ 上最大化 条件概率来学习异构网络 $G=(V, E, T)$ 上的顶点表征。
$$
\arg \max _{\theta} \sum_{v \in V} \sum_{t \in T_{V}} \sum_{c_{t} \in N_{t}(v)} \log p\left(c_{t} \mid v ; \theta\right)
$$
其中 $N_{t}(v)$ 示意顶点 $v$ 的类型为 $t$ 的畛域顶点汇合。$p\left(c_{t} \mid v ; \theta\right)$ 通常定义为一个 softmax 函数,
即:
$$
p\left(c_{t} \mid v ; \theta\right)=\frac{e^{X_{c_{t}} \cdot X_{v}}}{\sum_{u \in V} e^{X_{u} \cdot X_{v}}}
$$
其中 $X_{v}$ 是矩阵 $X$ 的第 $v$ 行矩阵, 示意页点 $v$ 的嵌入向量。为了晋升参数更新效率 metapath2vec 采纳了 Negative Sampling 进行参数迭代更新, 给定一个 Negative Sampling 的大 小 $M,$ 参数更新过程如下:
$$
\log \sigma\left(X_{c_{t}} \cdot X_{v}\right)+\sum_{m=1}^{M} \mathbb{E}_{u^{m} \sim P(u)}\left[\log \sigma\left(-X_{u^{m}} \cdot X_{v}\right)\right]
$$
其中 $\sigma(x)=\frac{1} {1+e^{-x}}$, $P(u)是一个 negative node $u^m$ 在 M 次采样中的预约义散布。
metapath2vec 通过不思考顶点的类型进行节点抽取来确定以后顶点的频率。
2.2.2Meta-Pathe-Based Random Walks
在同构网络中,DeepWalk 和 node2vec 等算法通过随机游走的形式来构建 Skip-Gram 模型的上下文语料库,受此启发,作者提出了一种异构网络上的随机游走形式。在不思考顶点类型和边类型的状况下,$p(v^{i+1}|v^i)$ 示意从顶点 $v^i$ 向其街坊顶点 $v^{i+1}$ 的转移概率。然而 Sun 等已证实异构网络上的随机游走会偏差于某些高度可见的类型的顶点,这些顶点的门路在网络中具备肯定的统治位置,而这些有肯定比例的门路指向一小部分节点的汇合。鉴于此,作者提出了一种基于 meta-path 的随机游走形式来生成 Skip-Gram 模型的邻域上下文。该随机游走形式能够同时捕捉不同类型顶点之间语义关系和构造关系,促成了异构网络结构向 metapath2vec 的 Skip-Gram 模型的转换。
一个 meta-path 的 scheme 能够定义成如下模式:
$$
V_{1} \stackrel{R_{1}}{\longrightarrow} V_{2} \stackrel{R_{2}}{\longrightarrow} \ldots V_{t} \stackrel{R_{t}}{\longrightarrow} V_{t+1} \ldots V_{l-1} \stackrel{R_{l-1}}{\longrightarrow} V_{l}
$$
其中
$$
R=R_{1} \circ R_{2} \circ \cdots \circ R_{l-1}
$$
示意顶点 $V_{1}$ 和顶点 $V_{l}$ 之间的门路组合。例如下图中, “APA” 示意一种固定语义的 metapath, “APVPA” 示意另外一种固定语义的 meta-path。并且很多之前的研究成果都表明, meta-path 在很多异构网络数据挖掘中很很大作用。因而,在本文中,作者给出了基于 meta-path 的随机游走形式。给定一个异构网络 $G=(V, E, T)$ 和一个 meta-path 的 scheme $\mathcal{P}$ :
$$
V_{1} \stackrel{R_{1}}{\longrightarrow} V_{2} \stackrel{R_{2}}{\longrightarrow} \ldots V_{t} \stackrel{R_{t}}{\longrightarrow} V_{t \pm 1} \ldots V_{l-1} \stackrel{R_{l-1}}{\longrightarrow} V_{l}
$$
那么在第 $i$ 步的转移概率定义如下:
$$
p\left(v^{i+1} \mid v_{t}^{i}, \mathcal{P}\right)=\left\{\begin{array}{ll}
\frac{1}{\left|N_{t+1}\left(v_{t}^{i}\right)\right|} & \left(v^{i+1}, v^{i}\right) \in E, \phi\left(v^{i+1}\right)=t+1 \\
0 & \left(v^{i+1}, v^{i}\right) \in E, \phi\left(v^{i+1}\right) \neq t+1 \\
0 & \left(v^{i+1}, v^{i}\right) \notin E
\end{array}\right.
$$
其中 $v_{t}^{i} \in V_{t}, \quad N_{t+1}\left(v_{t}^{i}\right)$ 示意页点 $v_{t}^{i}$ 的 $V_{t+1}$ 类型的畛域顶点汇合。换言之, $v^{i+1} \in V_{t+1},$ 也 就是说随机游走是在预约义的 meta-path scheme $\mathcal{P}$ 条件下的有偏游走。首次之外, meta-path 通常是以一种对称的形式来应用, 也就是说在上述门路组合中,顶点 $V_{1}$ 的类型和 $V_{l}$ 的类型雷同。即:
$$
p\left(v^{i+1} \mid v_{t}^{i}\right)=p\left(v^{i+1} \mid v_{l}^{i}\right), \text {if} \mathbf{t}=1
$$
基于 meta-path 的随机游走保障不同类型顶点之间的语义关系能够适当的融入 Skip-Gram 模型中。
2.3 Metapath2vec++ 框架
methpath2vec 的变种:
- methpath2vec++:在负采样时思考节点类型
- multi-methpath2vec++:针对多条元门路进行游走
- side info+multi-methpath2vec++:在获取元门路的根底上思考了节点的特色
metapath2vec 在为每个顶点构建畛域时,通过 meta-path 来领导随机游走过程向指定类型的顶点进行有偏游走。然而在 softmax 环节中,并没有顶点的类型,而是将 所有的顶点认为是同一种类型的顶点。换言之,metapath2vec 在 Negative Sampling 环节采样的 negative 样本并没有思考顶点的类型,也就是说 metapath2vec 反对任意类型顶点的 Negative Sampling。于是作者在 metapath2vec 的根底上又提出了改良计划 metapath2vec++。
2.3.1Heterogeneous Negative Sampling
在 metapath2vec++ 中, softmax 函数依据不同类型的顶点的上下文 $c_{t}$ 进行归一化。也就是说 $p\left(c_{t} \mid v ; \theta\right)$ 依据固定类型的页点进行调整。即:
$$
p\left(c_{t} \mid v ; \theta\right)=\frac{e^{X_{c_{t}} \cdot X_{v}}}{\sum_{u_{t} \in V_{t}} e^{X_{u_{t}} \cdot X_{v}}}
$$
其中 $V_{t}$ 是网络中 $t$ 类型顶点汇合。在这种状况下,metapath2vec++ 为 Skip-Gram 模型的输入层中的每种类型的畛域指定了一个多项式散布的汇合。而在 metapath2vec, DeepWalk 和 node2vec 中,Skip-Gram 输入多项式散布的维度等于蜂个网络中顶点的数目,然而对于 metapath2vec++ 的 Skip-Gram, 其针对特定类型的输入多项式的维度取决于网络中以后类型顶点的数目。如下图示。
最终咱们能够失去如下的指标函数:
$$
O(X)=\log \sigma\left(X_{c_{t}} \cdot X_{v}\right)+\sum_{m=1}^{M} \mathbb{E}_{u_{t}^{m} \sim P_{t}\left(u_{t}\right)}\left[\log \sigma\left(-X_{u_{t}^{m}} \cdot X_{v}\right)\right]
$$
能够得出其梯度如下:
$$
\begin{array}{c}
\frac{\partial O(X)}{\partial X_{u_{t}^{m}}}=\left(\sigma\left(X_{u_{t}^{m}} \cdot X_{v}-\mathbb{I}_{c_{t}}\left[u_{t}^{m}\right]\right)\right) X_{v} \\
\frac{\partial O(X)}{\partial X_{v}}=\sum_{m=0}^{M}\left(\sigma\left(X_{u_{i}^{* n}} \cdot X_{v}-\mathbb{I}_{c_{i}}\left[u_{t}^{m}\right]\right)\right) X_{v_{t}^{m}}
\end{array}
$$
其中 $\mathbb{I}_{c_{t}}\left[u_{t}^{m}\right]$ 是一个批示函数, 用来批示 $u_{t}^{m}$ 在 $m=0, u_{t}^{0}=c_{t}$ 时是否是顶点 $c_{t}$ 的上下文。该 算法应用随机梯度降落进行参数优化。整个 metapath2vec++ 算法如下。
3. 分布式图引擎(疾速入门)
因为会存在许多无奈在一台机器上加载的微小图,例如社交网络和引文网络。为了解决这样的图,PGL 开发了一个分布式图引擎框架来反对大规模图网络上的图采样,以进行分布式 GNN 训练。
上面将介绍执行分布式图引擎以进行图采样的步骤。
如何启动分布式图引擎服务的示例:
- 假如咱们有一个下图,它有两种类型的节点(u 和 t)。
- 首先,咱们应该创立一个配置文件并指定每台机器的 ip 地址。这里咱们应用两个端口来模仿两台机器。
- 创立配置文件和 ip 地址文件后,咱们当初能够启动两个图形服务器。
- 而后咱们能够应用客户端从图服务器中采样街坊或采样节点。
4 methpath2vec(实际)
4.1 数据集介绍
链接:https://ericdongyx.github.io/metapath2vec/m2v.html
将所有数据和代码下载到一个 zip 文件中 —metapath2vec.zip 6.7 GB,包含以下 B、C、D、E 和 F 局部(DropBox | 百度云)。
Bibtex:
@inproceedings{dong2017metapath2vec,
title={metapath2vec: 异构网络的可扩大示意学习},
author={Dong, Yuxiao and Chawla, Nitesh V and Swami, Ananthram},
booktitle={KDD '17},
pages={135- -144},年份 ={2017},组织 ={ACM}
}
援用:
Yuxiao Dong、Nitesh V. Chawla 和 Ananthram Swami。2017. metapath2vec:异构网络的可扩大示意学习。在 KDD’17 中。135–144。
原始网络数据
- AMiner 计算机科学 (CS) 数据:CS 数据集由 1,693,531 名计算机科学家和 3,194,405 篇论文组成,来自 3,883 个计算机科学场合——包含会议和期刊——截至 2016 年。咱们构建了一个异构合作网络,其中有是三种类型的节点:作者、论文和地点。
Citation: Jie Tang, Jing Zhang, Limin Yao, Juanzi Li, Li Zhang, and Zhong Su. 2008. ArnetMiner: Extraction and Mining of Academic Social Networks. In KDD’08. 990–998.
- 数据库和信息系统(DBIS)数据:DBIS 数据集由 Sun 等人构建和应用。它涵盖了 464 个场合、其前 5000 位作者以及相应的 72,902 篇出版物。咱们还从 DBIS 构建了异构合作网络,其中一个链接能够连贯两位作者,一位作者和一篇论文,以及一篇论文和一个地点。
Citation: Yizhou Sun, Jiawei Han, Xifeng Yan, Philip S. Yu, and Tianyi Wu. 2011. Pathsim: Meta path-based top-k similarity search in heterogeneous information networks. In VLDB’11. 992–1003.
4.2 PGL 实现 metapath2vec 算法
利用 PGL 来复现 metapath2vec 模型。和后面 xxx2vec 的办法相似,先做网络嵌入系数矩阵的训练,而后应用训练好的矩阵在做预测。
Dataset.py 蕴含了对图数据进行深度游走生成 walks 等接口
model.py 蕴含用于训练 metapath2vec 的 skipgram 模型定义
utils.py 蕴含了对配置文件 config.yaml 的读取接口
超参数
所有超参数都保留在 config.yaml 文件中, 所以在训练之前,你能够关上 config.yaml 来批改你喜爱的超参数。
PGL 图形引擎启动
当初咱们反对应用 PGL Graph Engine 分布式加载图数据。咱们还开发了一个简略的教程来展现如何启动图形引擎
要启动分布式图服务,请依照以下步骤操作。
1)IP 地址设置
第一步是为每个图形服务器设置 IP 列表。每个带有端口的 IP 地址代表一个服务器。在 ip_list.txt 文件中,咱们为演示设置了 4 个 IP 地址如下:
127.0.0.1:8553
127.0.0.1:8554
127.0.0.1:8555
127.0.0.1:8556
2)通过 OpenMPI 启动图形引擎
在启动图形引擎之前,您应该在中设置以下超参数 config.yaml:
etype2files: "p2a:./graph_data/paper2author_edges.txt,p2c:./graph_data/paper2conf_edges.txt"
ntype2files: "p:./graph_data/node_types.txt,a:./graph_data/node_types.txt,c:./graph_data/node_types.txt"
symmetry: True
shard_num: 100
而后,咱们能够在 OpenMPI 的帮忙下启动图形引擎。
mpirun -np 4 python -m pgl.distributed.launch --ip_config ./ip_list.txt --conf ./config.yaml --mode mpi --shard_num 100
手动启动图形引擎
如果您没有装置 OpenMPI,您能够手动启动图形引擎。
Fox 示例,如果咱们要应用 4 个服务器,咱们应该在 4 个终端上别离运行以下命令。
# terminal 3
python -m pgl.distributed.launch --ip_config ./ip_list.txt --conf ./config.yaml --shard_num 100 --server_id 3
# terminal 2
python -m pgl.distributed.launch --ip_config ./ip_list.txt --conf ./config.yaml --shard_num 100 --server_id 2
# terminal 1
python -m pgl.distributed.launch --ip_config ./ip_list.txt --conf ./config.yaml --shard_num 100 --server_id 1
# terminal 0
python -m pgl.distributed.launch --ip_config ./ip_list.txt --conf ./config.yaml --shard_num 100 --server_id 0
6. 总结
介绍了异质图,利用 pgl 对 metapath2vec、metapath2vec 进行了实现,并给出了多个框架版本的 demo 满足个性化需要
metapath2vec 是一种用于异构网络中示意学习的算法框架,其中蕴含多种类型的节点和链接。给定异构图,metapath2vec 算法首先生成基于元门路的随机游走,而后应用 skipgram 模型训练语言模型。基于 PGL 重现了 metapath2vec 算法,用于可扩大的示意学习。
参考资料
- Meta Path 定义
- metapath2vec 异构网络示意学习
- 【图网络论文(一)】异构图网络:metapath2vec
- #16 常识分享:Metapath2vec 的前世今生
- Graph Embedding 之 metapath2vec
- 【Graph Embedding】: metapath2vec 算法