PGL图学习之图游走类metapath2vec模型[系列五]
Posted 汀、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PGL图学习之图游走类metapath2vec模型[系列五]相关的知识,希望对你有一定的参考价值。
PGL图学习之图游走类metapath2vec模型[系列五]
本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5009827?contributionType=1
有疑问查看原项目
相关项目参考:
关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] https://aistudio.baidu.com/aistudio/projectdetail/4982973?contributionType=1
图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二):https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1
图学习【参考资料2】-知识补充与node2vec代码注解: https://aistudio.baidu.com/aistudio/projectdetail/5012408?forkThirdPart=1
图学习【参考资料1】词向量word2vec: [https://aistudio.baidu.com/aistudio/projectdetail/5009409?contributionType=1](https://aistudio.baidu.com/aistudio/projectdetail/5009409?contributionType=1
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类型映射函数
ϕ
:
V
→
A
\\phi : V \\to \\mathcalA
ϕ:V→A,边类型映射函数
ψ
:
E
→
R
\\psi : E \\to \\mathcalR
ψ:E→R。每一个object
v
∈
V
v \\in V
v∈V, 都有一个特定的object 类型
ϕ
(
v
)
∈
A
\\phi (v) \\in \\mathcalA
ϕ(v)∈A;每一条边
e
∈
E
e \\in E
e∈E 都有一个特定的relation
ψ
(
e
)
∈
R
\\psi(e) \\in \\mathcalR
ψ(e)∈R。
异质网络(Heterogeneous Network)指的是object的类型
∣
A
∣
>
1
|\\mathcalA|>1
∣A∣>1或者relation的类型
∣
R
>
1
∣
|\\mathcalR>1|
∣R>1∣。
2.1.3 网络模式(Network schema)
网络模式(Network schema),定义为: T G = ( A , R ) T_G=(\\mathcalA,R) TG=(A,R),是信息网络 G=(V, E)的一种 meta模板,这个信息网络有一个object类型映射函数 ϕ : V → A \\phi : V \\to \\mathcalA ϕ:V→A 和 link 类型映射函数 ψ : E → R \\psi: E \\to \\mathcalR ψ:E→R。信息网络G是一个定义在object类型 A \\mathcalA A上的有向图,并且边是 R \\mathcalR 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 → R A 2 → R A 3 . . . → R A l + 1 A_1→^RA_2→^RA_3...→^RA_l+1 A1→RA2→RA3...→RAl+1表示了从 A 1 A_1 A1 到 A l + 1 A_l+1 Al+1的复杂的关系, R = R 1 ∘ R 2 ∘ R 3 ∘ R l 。 R = R_1 ∘ R_2 ∘ R_3 ∘R_l。 R=R1∘R2∘R3∘Rl。元路径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 ) G = (V,E,T) G=(V,E,T),其中每个节点和边分别对应一个映射 ϕ ( v ) : V → T V \\phi(v) : V \\rightarrow T_V ϕ(v):V→TV 和 ψ ( e ) : E → T E \\psi(e) : E \\rightarrow T_E ψ(e):E→TE。 其中 T V T_V TV和 T E T_E TE分别表示节点的类型集合以及关系的类型集合。且 ∣ T V ∣ + ∣ T E ∣ > 2 \\left|T_V\\right|+\\left|T_E\\right|>2 ∣TV∣+∣TE∣>2。
Definition 2: 异质网络表示学习(Heterogeneous Network Representation Learning):
给定一个异构网络,学习一个维的潜在表征可以表征网络中顶点之间的结构信息和语义场景关系。异构网络表征学习的输出是一个低维的矩阵,其中行是一个维的向量,表示顶点的表征。这里需要注意的是,虽然顶点的类型不同,但是不同类型的顶点的表征向量映射到同一个维度空间。由于网络异构性的存在,传统的基于同构网络的顶点嵌入表征方法很难有效地直接应用在异构网络上。异质网络中的节点学习一个 d d d维的表示 X ∈ R ∣ V ∣ × d \\mathrmX \\in \\mathbbR^|V| \\times d X∈R∣V∣×d, d ≪ ∣ V ∣ d \\ll|V| d≪∣V∣。节点的向量表示可以捕获节点间结构和语义关系。
2.2 Metapath2vec框架
在正式介绍metapath2vec方法之前,作者首先介绍了同构网络上的基于random walk的graph embedding算法的基本思想,如:Deepwalk和node2vec等。该类方法采用了类似word2vec的思想,即:使用skip-gram模型对每个顶点的局部领域顶点信息进行预测,进而学习到每个顶点的特征表示。通常,对于一个同构网络
G
=
(
V
,
E
)
G = (V,E)
G=(V,E),目标是从每个顶点的局部领域上最大化网络似然:
arg
max
θ
∏
v
∈
V
∏
c
∈
N
(
v
)
p
(
c
∣
v
;
θ
)
\\arg \\max _\\theta \\prod_v \\in V \\prod_c \\in N(v) p(c \\mid v ; \\theta)
argθmaxv∈V∏c∈N(v)∏p(c∣v;θ)
其中
N
(
v
)
N(v)
N(v) 表示顶点
v
v
v 的领域, 如1-hop以内的邻接页点, 2 -hop以内的邻接顶点。
p
(
c
∣
v
;
θ
)
p(c \\mid v ; \\theta)
p(c∣v;θ) 表 示给定顶点
v
v
v 后, 顶点
c
c
c 的条件概率。下面正式给出基于异构网络的metapath2vec嵌入算法。
metapath2vec分为两个部分,分别是Meta-Path-Based Random Walks和Heterogeneous Skip-Gram
2.2.1 Heterogeneous Skip-Gram
在metapath2vec中,作者使用Skip-Gram模型通过在顶点
v
v
以上是关于PGL图学习之图游走类metapath2vec模型[系列五]的主要内容,如果未能解决你的问题,请参考以下文章
PGL图学习之图神经网络ERNIESageUniMP进阶模型[系列八]
PGL图学习之图神经网络ERNIESageUniMP进阶模型[系列八]