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

img

1.异质图

在图结构中有一个重要概念,同构图和异构图:

同构图:节点类型仅有一种的图

异构图:节点类型有多种的图,举例如下:

异质图介绍

在真实世界中,很多的图包含了多种类别节点和边,这类图我们称之为异质图。显然,同构图是异质图中的一个特例,边和节点的种类都是一。异质图比同构图的处理上更为复杂。

为了能够处理实际世界中的这大部分异质图,PGL进一步开发了图框架来对异质图模型的支持图神经网络的计算,新增了MetaPath采样支持异质图表示学习。

本节:

  • 举例异质图数据
  • 理解PGL是如何支持异质图的计算
  • 使用PGL来实现一个简单的异质图神经网络模型,来对异质图中特定类型节点分类。

PGL中引入了异质图的支持,新增MetaPath采样支持异质图表示学习,新增异质图Message Passing机制支持基于消息传递的异质图算法,利用新增的异质图接口,能轻松搭建前沿的异质图学习算法。

真实世界中的大部分图都存在着多种类型的边和节点。其中,电子交易网络就是非常常见的异质图。这种类型的图通常包含两种以上类型的节点(商品和用户等),和两以上的边(购买和点击等)。

接下来就用图例介绍,图中有多种用户点击或者购买商品。这个图中有两种节点,分别是“用户”和“商品”。同时包含了两种类型的边,“购买”和“点击”。

img

以及学术论文

img

1.1使用PGL创建一个异质图

在异质图中,存在着多种边,我们需要对它们进行区分。使用PGL可以用一下形式来表示边:

代码语言:edges = {

复制

        '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: 0 | loss: 1.3536

复制

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)

论文归纳了以及每一种网络类型对应的经典的研究方法,如下表:

img

3)节点属性的异构图AMHEN

论文给出一个带节点属性的异构图的例子。在左侧原始的图中,用户包含了性别、年龄等属性,商品包含了价格、类目等属性。用户与商品之间包含了4种类型的边,分别对应点击、收藏、加入购物车以及购买行为。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传统的 graph embedding 算法比如 DeepWalk 的做法会忽略图中边的类型以及节点的特征,然后转换成一个 HON。

如果将边的类型考虑进去,那么就得到一个 MHEN,能够取得非常明显的效果。

此外,如果将节点的属性也同时考虑进去,那么就利用了原图的所有信息,可以得到最好的效果。

4)AMHEN嵌入难点

除了异构性和多样性外,处理 AMHEN 也面临着多重挑战:

  1. 多路复用的边(Multiplex Edges):每个节点对可能含有多种不同的类型边,如何将不同的关系边进行统一嵌入;
  2. 局部交互(Partial Observations): 存在大量的长尾客户(可能只与某些产品进行很少的交互);
  3. 归纳学习(Inductive):如何解决冷启动问题;
  4. 可扩展性(Scalability),如何拓展到大规模网络中。
2.1.2 信息网络(Information Network)

信息网络(Information Network)是指一个有向图 G=(V,E), 同时还有一个object类型映射函数 ϕ : V → A \phi : V \to \mathcal{A} ϕ:VA,边类型映射函数 ψ : E → R \psi : E \to \mathcal{R} ψ:ER。每一个object v ∈ V v \in V vV, 都有一个特定的object 类型 ϕ ( v ) ∈ A \phi (v) \in \mathcal{A} ϕ(v)A;每一条边 e ∈ E e \in E eE 都有一个特定的relation ψ ( e ) ∈ R \psi(e) \in \mathcal{R} ψ(e)R

异质网络(Heterogeneous Network)指的是object的类型 ∣ A ∣ > 1 |\mathcal{A}|>1 A>1或者relation的类型 ∣ R > 1 ∣ |\mathcal{R}>1| R>1∣

2.1.3 网络模式(Network schema)

网络模式(Network schema),定义为: T G = ( A , R ) T_G=(\mathcal{A,R}) TG=(A,R),是信息网络 G=(V, E)的一种 meta模板,这个信息网络有一个object类型映射函数 ϕ : V → A \phi : V \to \mathcal{A} ϕ:VA 和 link 类型映射函数 ψ : E → R \psi: E \to \mathcal{R} ψ:ER。信息网络G是一个定义在object类型 A \mathcal{A} A上的有向图,并且边是 R \mathcal{R} 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} A1RA2RA3...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=R1R2R3Rl元路径P的长度即为关系R的个数.

确定元路径的意义在于我们会根据确定的元路径进行随机游走,如果元路径没有意义,会导致后续的训练过程中无法充分体现节点的意义,元路径通常需要人工进行筛选。

在基于元路径的游走过程中,只要首尾节点类型相同,就可以继续游走,直到达到最大游走长度或者找不到指定要求的节点。通常来说,元路径是对称的。

目前大部分的工作都集中在同构网络中,但真实场景下异构网络才是最常见的。针对同构网络设计的模型很多都没法应用于异构网络,比如说,对于一个学术网络而言:

  1. 如何高效根据上下文信息表征不同类型的节点?
  2. 能否用 Deepwalk 或者 Node2Vec 来学习网络中的节点?
  3. 能否直接将应用于同构网络的 Embedding 模型直接应用于异构网络?

解决诸如此类的挑战,有利于更好的在异构网络中应用多种网络挖掘任务:

  1. 传统的方法都是基于结构特征(如元路径 meta-path)来求相似性,类似的方法有 PathSim、PathSelClus、RankClass 等:
  2. 但这种方式挖掘出来的元路径(如 “APCPA”)经常会出现相似度为 0 的情况。如果我们能够将 Embedding 的思想应用于异构网络,则不会再出现这种情况。
  3. 基于这种观察,作者提出了两个可以应用于异构网络的 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):VTV ψ ( e ) : E → T ∗ E \psi(e) : E \rightarrow T*{E} ψ(e):ETE。 其中 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 \mathrm{X} \in \mathbb{R}^{|V| \times d} XRV×d d ≪ ∣ V ∣ d \ll|V| dV。节点的向量表示可以捕获节点间结构和语义关系。

2.2 Metapath2vec框架

在正式介绍metapath2vec方法之前,作者首先介绍了同构网络上的基于random walk的graph embedding算法的基本思想,如:Deepwalk和node2vec等。该类方法采用了类似word2vec的思想,即:使用skip-gram模型对每个顶点的局部领域顶点信息进行预测,进而学习到每个顶点的特征表示。通常,对于一个同构网络 G = ( V , E ) G = (V,E) G=(V,E),目标是从每个顶点的局部领域上最大化网络似然:

$$

\arg \max {\theta} \prod{v \in V} \prod_{c \in N(v)} p(c \mid v ; \theta)

$$

其中 N ( v ) N(v) N(v) 表示顶点 v v v 的领域, 如1-hop以内的邻接页点, 2 -hop以内的邻接顶点。 p ( c ∣ v ; θ ) p(c \mid v ; \theta) p(cv;θ) 表 示给定顶点 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 v 的领域 N ∗ t ( v ) , t ∈ T ∗ V N*{t}(v), t \in T*{V} Nt(v),tTV 上最大化 条件概率来学习异构网络 G = ( V , E , T ) G=(V, E, T) 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 ) N*{t}(v) Nt(v) 表示顶点 v v v 的类型为 t t t 的领域顶点集合。 p ( c ∗ t ∣ v ; θ ) p\left(c*{t} \mid v ; \theta\right) p(ctv;θ) 通常定义为一个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} Xv 是矩阵 X X X 的第 v v v 行矩阵, 表示页点 v v v 的嵌入向量。为了提升参数更新效率 metapath2vec采用了Negative Sampling进行参数迭代更新, 给定一个Negative Sampling的大 小 M , M, 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]

$$

其中 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1} {1+e^{-x}} σ(x)=1+ex1, $P(u)是一个negative node u m u^m um在M次采样中的预定义分布。

metapath2vec通过不考虑顶点的类型进行节点抽取来确定当前顶点的频率。

2.2.2Meta-Pathe-Based Random Walks

在同构网络中,DeepWalk和node2vec等算法通过随机游走的方式来构建Skip-Gram模型的上下文语料库,受此启发,作者提出了一种异构网络上的随机游走方式。在不考虑顶点类型和边类型的情况下, p ( v i + 1 ∣ v i ) p(v^{i+1}|v^i) p(vi+1vi)表示从顶点 v i v^i vi向其邻居顶点 v i + 1 v^{i+1} vi+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*{1} V1 和顶点 V ∗ l V*{l} Vl 之间的路径组合。例如下图中, "APA"表示一种固定语义的metapath, "APVPA"表示另外一种固定语义的meta-path。并且很多之前的研究成果都表明, meta-path在很多异构网络数据挖掘中很很大作用。因此,在本文中,作者给出了基于meta-path的随机游走方式。给定一个异构网络 G = ( V , E , T ) G=(V, E, T) G=(V,E,T) 和一个meta-path的scheme P \mathcal{P} 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}

$$

img

那么在第 i i 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 ∈ V ∗ t , N ∗ t + 1 ( v ∗ t i ) v*{t}^{i} \in V*{t}, \quad N*{t+1}\left(v*{t}^{i}\right) vtiVt,Nt+1(vti) 表示页点 v ∗ t i v*{t}^{i} vti V ∗ t + 1 V*{t+1} Vt+1 类型的领域顶点集合。换言之, v i + 1 ∈ V ∗ t + 1 , v^{i+1} \in V*{t+1}, vi+1Vt+1, 也 就是说随机游走是在预定义的meta-path scheme P \mathcal{P} P 条件下的有偏游走。初次之外, meta-path 通常是以一种对称的方式来使用, 也就是说在上述路径组合中,顶点 V ∗ 1 V*{1} V1 的类型和 V l V_{l} Vl 的类型相同。即:

$$

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模型中。

img

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 c*{t} ct 进行归一化。也就是说 p ( c ∗ t ∣ v ; θ ) p\left(c*{t} \mid v ; \theta\right) p(ctv;θ) 根据固定类型的页点进行调整。即:

$$

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 V_{t} Vt 是网络中 t t t 类型顶点集合。在这种情况下, metapath2vec++为Skip-Gram模型的输出层中的每种类型的领域指定了一个多项式分布的集合。而在metapath2vec, DeepWalk和node2vec中, Skip-Gram输出多项式分布的维度等于蜂个网络中顶点的数目,然而对于metapath2vec++的Skip-Gram, 其针对特定类型的输出多项式的维度取决于网络中当前类型顶点的数目。如下图示。

img

最终我们可以得到如下的目标函数:

$$

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}

$$

其中 KaTeX parse error: Undefined control sequence: \leftu at position 19: …thbb{I}*{c*{t}}\̲l̲e̲f̲t̲u̲_{t}^{m}\right 是一个指示函数, 用来指示 u ∗ t m u*{t}^{m} utm m = 0 , u ∗ t 0 = c ∗ t m=0, u*{t}^{0}=c*{t} m=0,ut0=ct 时是否是顶点 c ∗ t c*{t} ct 的上下文。该 算法使用随机梯度下降进行参数优化。整个metapath2vec++算法如下。

img

3.分布式图引擎(快速入门)

因为会存在许多无法在一台机器上加载的巨大图,例如社交网络和引文网络。为了处理这样的图,PGL 开发了一个分布式图引擎框架来支持大规模图网络上的图采样,以进行分布式 GNN 训练。

下面将介绍执行分布式图引擎以进行图采样的步骤。

如何启动分布式图引擎服务的示例:

  1. 假设我们有一个下图,它有两种类型的节点(u 和 t)。
  2. 首先,我们应该创建一个配置文件并指定每台机器的 ip 地址。 这里我们使用两个端口来模拟两台机器。
  3. 创建配置文件和 ip 地址文件后,我们现在可以启动两个图形服务器。
  4. 然后我们可以使用客户端从图服务器中采样邻居或采样节点。

4 methpath2vec(实践)

4.1数据集介绍

链接:https://ericdongyx.github.io/metapath2vec/m2v.html

将所有数据和代码下载到一个 zip 文件中—metapath2vec.zip 6.7 GB,包括以下 B、C、D、E 和 F 部分(DropBox |百度云)。

代码语言:txt

复制

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。

原始网络数据

  1. 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. Œ

  1. 数据库和信息系统(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 地址如下:

代码语言:txt

复制

127.0.0.1:8553
127.0.0.1:8554
127.0.0.1:8555
127.0.0.1:8556

2)通过 OpenMPI 启动图形引擎

在启动图形引擎之前,您应该在中设置以下超参数config.yaml:

代码语言:txt

复制

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 的帮助下启动图形引擎。

代码语言:txt

复制

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 个终端上分别运行以下命令。

代码语言:txt

复制

# 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 算法,用于可扩展的表示学习。

img

那么,我们该如何学习大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

一、大模型全套的学习路线

学习大型人工智能模型,如GPT-3、BERT或任何其他先进的神经网络模型,需要系统的方法和持续的努力。既然要系统的学习大模型,那么学习路线是必不可少的,下面的这份路线能帮助你快速梳理知识,形成自己的体系。

L1级别:AI大模型时代的华丽登场

L2级别:AI大模型API应用开发工程

L3级别:大模型应用架构进阶实践

L4级别:大模型微调与私有化部署

一般掌握到第四个级别,市场上大多数岗位都是可以胜任,但要还不是天花板,天花板级别要求更加严格,对于算法和实战是非常苛刻的。建议普通人掌握到L4级别即可。

以上的AI大模型学习路线,不知道为什么发出来就有点糊,高清版可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/695063.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业网页制作

随着互联网的普及,企业网站已成为企业展示自己形象、吸引潜在客户、开拓新市场的重要方式。而企业网页制作则是构建企业网站的基础工作,它的质量和效率对于企业网站的成败至关重要。 首先,企业网页制作需要根据企业的特点和需求进行规划。在网…

MySQL的PrepareStatement真的是预编译语句么?

PrepareStatement真的是预编译语句么? ChatGPT对PrepareStatement的定义是: PrepareStatement 是 Java 数据库连接(JDBC)API 中用于执行预编译 SQL 语句的接口。通过使用 PreparedStatement,可以预编译 SQL 语句&…

Python代码大使用Paramiko轻松判断文件类型,提取上级目录

哈喽,大家好,我是木头左! 一、Paramiko简介 Paramiko是一个用于SSHv2协议的Python实现,提供了客户端和服务器功能。它可以用于远程连接和管理服务器,执行命令、上传下载文件等。本文将介绍如何使用Paramiko判断文件类…

前端 Vue 操作文件方法(导出下载、图片压缩、文件上传和转换)

一、前言 本文对前端 Vue 项目开发过程中,经常遇到要对文件做一些相关操作,比如:文件导出下载、文件上传、图片压缩、文件转换等一些处理方法进行归纳整理,方便后续查阅和复用。 二、具体内容 1、后端的文件导出接口,…

C++程序设计:对数据文件的操作与文件流

姚老师小课堂开课啦! 一、文件的分类: 1.ASCII码文件: ASCII文件使用方便,比较直观,便于阅读,便于对字符进行输入输出,但一般占用存储空间较多,而且需要花费转换时间(二…

逆市创新高!水电“双雄“是怎样炼成的? 博通,赢麻了!

高分红夏季用电高峰AI的尽头是电力 6月7日,长江电力(600900)、华能水电(600025)股价双双上涨。截至收盘,长江电力股价上涨1%,收于28.31元/股;华能水电股价上涨1.52%,收于…

sqli-labs 靶场 less-8、9、10 第八关到第十关详解:布尔注入,时间注入

SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less 8 SQLI DUMB SERIES-8判断注入点 当输入id为1时正常显示: 加上单引号就报错了 …

Kafka 架构

1 整体架构 1.1 Zookeeper Zookeeper 是一个分布式协调服务,用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。 Zookeeper 确保了 Kafka 集群的高可用性和可靠性。 但 Zookeeper 已经成为 Kafka 性能瓶颈,…

什么是 AOF 重写?AOF 重写机制的流程是什么?

引言:在Redis中,持久化是确保数据持久性和可恢复性的重要机制之一。除了常见的RDB(Redis Database)持久化方式外,AOF(Append Only File)也是一种常用的持久化方式。AOF持久化通过记录Redis服务器…

基于xml的Spring应用(理解spring注入)

目录 问题: 传统Javaweb开发的困惑? 问题: IOC、DI和AOP的思想提出 问题: Spring框架的诞生 1. BeanFactory快速入门 2. ApplicationContext快速入门 3. BeanFactory和ApplicationContext的关系 基于xml的Spring应用 1. SpringBean的…

Mamba v2诞生:3 SMA与Mamba-2

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提…

312. 戳气球 Hard

有 n 个气球,编号为0 到 n - 1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球,你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和 i 相邻…

JDK17 | Windows环境配置

众所周知, Jdk8做了很大的提升,网上的访谈,问到当下程序员要不要升级JDK版本的时候,得到异口同声的答案,不需要。这么多年过去了,数据是不会骗人的,现在Star最多的是JDK17,今天&…

STM32中ADC在cubemx基础配置界面介绍

ADCx的引脚,对应的不同I/O口,可以复用。 Temperature :温度传感器通道。 Vrefint :内部参照电压。 Conversion Trigger: 转换触发器。 IN0 至 IN15,是1ADC1的16个外部通道。本示例中输出连接的是ADC2的IN5通道,所以只勾选IN5.Temperature Sensor Cha…

搭建自己的组件库<2>dialog 组件

目录 设置title 插槽显示 控制宽高 关闭对话框 transition实现动画 引入深度选择器 同样创建组件dialogue.vue后全局注册 dialogue模版&#xff1a; <template><!-- 对话框的遮罩 --><div class"miao-dialog_wrapper"><!-- 真的对话框 …

python如何输入回车

Python默认遇到回车的时候&#xff0c;输入结束。所以我们需要更改这个提示符&#xff0c;在遇到空行的时候&#xff0c;输入才结束。 raw_input就是从标注输入读取输入&#xff0c;输入的是什么就是什么。 文档解释&#xff1a; The function then reads a line from input,…

debian系统apt 国内安装源

debian系统apt 国内安装源&#xff1a; 国内阿里镜像源&#xff1a; deb http://mirrors.aliyun.com/debian stable main non-free contrib deb-src http://mirrors.aliyun.com/debian stable main non-free contrib 打开源文件位置&#xff1a;/etc/apt/sources.list,原来的内…

《经典图论算法》广度优先搜索

摘要&#xff1a; 1&#xff0c;广度优先搜索介绍 2&#xff0c;广度优先搜索的解题步骤 3&#xff0c;广度优先搜索的代码实现 1&#xff0c;广度优先搜索介绍 广度优先搜索(Breadth-first search&#xff0c;BFS)&#xff0c;又称宽度优先搜索&#xff0c;简单的说&#xff0…

知识工作者如何在工作中使用大模型?

自 2022 年 11 月 OpenAI 发布 ChatGPT 以来&#xff0c;人们对生成式人工智能&#xff08;GenAI&#xff0c;以下简称“生成式AI”&#xff09;的兴趣激增&#xff0c;同时也对其安全性表示担忧。 &#xff08;译者注&#xff1a;生成式人工智能&#xff0c;即用 AI 生成文本…

大模型常用推理参数工作原理

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 do_sample do_sample 参数控制是否使用采样…