【Intro】metapath2vec

论文链接:

https://ericdongyx.github.io/papers/KDD17-dong-chawla-swami-metapath2vec.pdf

(开头先碎碎念一下,这几年异构图好像一直没什么新的进展的样子,不会是凉了吧)

更新:文章的code和dataset请参考作者提供的metapath2vec: Heterogeneous Network Embedding

Abstract

异构网络中的表示学习的独特挑战来自于多类型节点和链路的存在,这限制了传统网络嵌入技术的可行性。文章提出了两个可扩展的表示学习模型,名为metapath2vec和metapath2vec++。metapath2vec模型形式化了基于元路径的随机游走,以构建节点的异构邻域,然后利用异构skip-gram模型执行节点嵌入。metapath2vec++模型进一步实现了异构网络中结构和语义相关性的同时建模。实验证明metapath2vec和metapath2vec++不仅比(当时)最新的异构网络挖掘中的嵌入模型(如节点分类、聚类、相似搜索)表现的更好,还能辨别不同网络对象之间的结构和语义相关性。

希望大家还记得我们之前的模型中也用过skip-gram(如果我没记错是node2vec)。总之这一段的意思就是这两个模型:
1. 应用于异构网络
2. 好用

Introduction

基于神经网络的学习模型可以表示潜在的嵌入,这些嵌入捕获了各种形式(如图像、音频和语言)的丰富、复杂数据的内部关系。社交和信息网络同样是丰富而复杂的数据,编码了人类互动的动态和类型,并且同样适用于使用神经网络进行表示学习。特别是,通过将人们选择朋友和保持联系的方式映射为一种“社交语言”,自然语言处理(NLP)的最新进展可以自然地应用于网络表示学习,最著名的是一组被称为word2vec的NLP模型。最近的一些相关研究已经提出基于word2vec玩过表示学习框架,比如DeepWalk,LINE和node2vec。这些表示学习方法可以从“原始网络”中自动发现有用的和有意义的(潜在的)特征,而不是手工的网络特征设计。

然而这些方法更多的聚焦于同构网络(单一的节点和边的关系)的表示学习。然而,大量的社交和信息网络本质上是异构的,涉及节点类型和/或节点之间关系的多样性。这些异构网络引入的独特挑战无法被为同构网络量身定制的表示学习模型解决。以一个异构的学术网络为例:我们如何在多种类型的节点(如作者、论文、场所、组织等)中有效地保留“词-上下文”的概念?DeepWalk和node2vec中使用的随机漫步可以应用于多种类型节点的网络吗?我们能否直接将面向同质网络的嵌入架构(例如,skip-gram)应用到异构网络中?

通过解决这些挑战,潜在的异构网络嵌入可以进一步应用于各种网络挖掘任务,如节点分类、聚类和相似性搜索。与传统的基于元路径(meta-path)的方法相比,潜在空间表示学习的优势在于它能够在没有连接元路径的情况下对节点之间的相似性进行建模。例如,如果作者从未在同一场所发表过论文——假设一个人发表了10篇论文,全部用NIPS,另一个人发表了10篇论文,全部用ICML;他们基于“APCPA”的PathSim相似度将为零,这一问题将被网络表示学习自然克服。

贡献。定义了异构网络表示学习问题,其目标是同时学习多种类型节点的低维和潜在嵌入。metapath2vec的目标是最大限度地保留给定异构网络的结构和语义。在metapath2vec中,首先提出了异构网络中基于元路径的随机游走,以生成具有网络语义的异构邻域。其次,扩展了skip-gram,以方便对地理上和语义上相近的节点进行建模。最后,开发了一种基于异构负采样的方法,称为metapath2vec++,它能够准确和快速地预测节点的异构邻域

提出的metapath2vec和metapath2vec++模型与传统网络嵌入模型的区别在于,传统网络嵌入模型聚焦于同构网络。具体地说,传统模型是从对不同类型的节点和关系的相同处理中产生的,导致对异构节点无法产生有区分的表示。此外,metapath2vec和metapath2vec++模型与Predictive Text Embedding(PTE)也有诸多区别。首先,PTE是一种半监督学习模型,它结合了文本数据的标签信息。其次,PTE的异质性来自文本网络,其中一个链接连接两个单词,一个单词和它的文档,一个单词和它的标签。从本质上讲,PTE的原始输入是单词,其输出是每个单词的嵌入,而不是多种类型的对象。

作者在表1⬆️中,总结了总结了这些方法的区别,以及在DBSI网络中对于相同的两个查询的排名前五的相似度搜索结果。

图1⬆️显示了16个CS会议和每个领域相应的高水平研究人员的学习嵌入的二维投影的可视化。

总结:

  1. 形式化了异构网络表示学习问题,并识别了网络异构带来的独特挑战。
  2. 开发有效和高效的网络嵌入框架,metapath2vec和metapath2vec++,用于保存异构网络的结构和语义相关性。
  3. 证明了所提出的方法在各种异构网络挖掘任务中的有效性和可扩展性,例如节点分类(比基准实现35-319%的相对改进)和节点聚类(比基线实现13-16%的相对增益)。
  4. metapath2vec和metapath2vec++自动发现异构网络中不同类型节点之间的内部语义关系

Problem definition

定义 2.1 一个异构网络描述的是一个图G=\left ( V,E,T \right )中的节点v和其边e分别被其映射函数\phi\left ( v \right ): V\rightarrow T_V\varphi \left ( e \right ): E\rightarrow T_E所关联。其中T_VT_E是表示对象和关系类型的集合,且满足\left | T_V \right | + \left | T_E \right | > 2

比如⬆️,我们可以用来描述一个学术网络,其中包含作者(A),论文(P),组织(O)作为节点,此时,边就代表了coauthor(A-A), 出版(A-P),归属(O-A)关系。通过考虑一个异构网络作为输入,可以异构网络表示学习问题描述为:

给定一个异构网络G,任务是寻找d维的潜在表示X \in \mathbb{R}^{\left | V \right | \times d}, d\ll \left | V \right |,这一潜在表示可以捕获其中的结构和语义关系。

问题的输出是一个低维矩阵X,矩阵的第v行是一个d维向量X_v,对应节点v的表示。注意,虽然在V(节点集合)中的节点类型不同,他们的表示都被映射到相同的潜在空间。学到的节点表示可以应用于多种异构网络挖掘任务。例如:每个节点的嵌入向量可以被用作特征输入节点分类、聚类、相似性等研究任务。

该问题的主要挑战来自于网络的异构性,无法直接应用同质语言和网络嵌入方法。网络嵌入模型的前提是保持节点与其邻域(上下文)之间的接近性。在异构环境中,我们如何定义和建模这个“节点-邻居”概念?此外,我们如何优化嵌入模型,使其能够有效地维护多种类型节点和关系的结构和语义?

The metapath2vec framework

文中提出了一个通用框架Metapath2vec,可以用来学习异构网络中的满足需求的节点表示。metapath2vec的目标是在考虑多种类型的节点和边的情况下最大化网络概率。

Homogeneous Network Embedding

对于一个文本语料库,word2vec可以学到语料库中单词的表示,受其启发,deepwalk和node2vec将文本语料库中的文字-上下文对应到网络中。这两种方法都利用随机游走来实现这一点,并利用skip-gram模型来学习节点的表示,以便在同质网络中预测其结构上下文(局部邻居)。通常,对于给定的网络G=\left ( V,E \right ),目标是根据局部结构最大化网络概率:

arg \max_{\theta} \prod_{v \in V} \prod_{c \in N\left ( v \right )} p\left ( c|v; \theta \right )

这里N\left ( v \right )是节点v在网络G中的邻居,另一种定义方法是节点v的one-hop邻居。p\left ( c|v; \theta \right )表示的是给定节点v后有上下文节点c的条件概率。

Heterogeneous Network Embedding: metapath2vec

为了对节点的异构邻域进行建模,metapath2veci引入了异构skip-gram模型。为了将skip-gram应用在异构网络结构中,提出了在异构网络中基于meta-path的随机游走。

Heterogeneous Skip-Gram。在metapath2vec中,对于一个\left | T_V \right |> 1的异构网络G=\left ( V,E,T \right )(节点类别大于1的异构网络),给定节点v通过最大化有异构上下文N_{t}\left ( v \right ),t \in T_V的概率使用skip-gram来学习有效的节点表示。

arg \max_{ \theta} \sum_{v \in V} \sum_{t \in T_V} \sum_{c_t \in N_{t\left ( v \right )}} log \mathit{p} \left ( c_t|v; \theta \right )

N_{t\left ( v \right )}表示节点v的邻居里第t类的节点,\mathit{p} \left ( c_t|v; \theta \right )被定义为softmax函数:\mathit{p} \left ( c_t|v; \theta \right ) = \frac{e^{X_{c_t} \cdot X_v} } {\sum_{u \in V} e^{X_{u} \cdot X_v} },其中X_vX的第v行(X是一个低维矩阵,X_vv行是一个d维向量)表示的是节点v的嵌入向量。

对于⬆️图中,描述的是一个学术网络,作者节点a_4可以再结构上接近其他作者(e.g., a_2, a_3, a_5),场所(e.g., ACL, KDD),组织机构(CMU、MIT),论文(e.g., p_2, p_3)。为了实现高效优化,Mikolov等人引入了负采样,即从语料库(网络)中采样相对较小的一组词(节点)来构建softmax,在metapath2vec中也应用了相同的方法。

对于给定的副采样大小M,arg \max_{ \theta} \sum_{v \in V} \sum_{t \in T_V} \sum_{c_t \in N_{t\left ( v \right )}} log \mathit{p} \left ( c_t|v; \theta \right )更新为:

log \sigma\left ( X_{c_t} \cdot X_v \right ) + \sum_{m=1}^{M}\mathbb{E}_{u^m \sim P\left ( u \right ) } \left [ log \sigma\left ( -X_{u^m} \cdot X_v \right ) \right ],其中\sigma\left ( x \right ) = \frac{1}{1+e^{-x}}P\left ( u \right )是预先确定的分布,从这个分布中得到一个负节点u^mM次。Metapath2vec通过同质地查看不同类型的节点、不考虑节点类型来抽取(负)节点来构建节点频率分布。

Meta-Path-Based Random Walks

如何高效的把网络结构转化为skip-gram呢?在deepwalk和node2vec中,是通过在邻居函数里合并在一个网络上随机游走所遍历的节点路径来实现的。

自然,我们可以将随机游走放到异构网络中来生成包含多种类型节点的路线。在第i步,转移概率\mathit{p} \left ( v^{i+1}| v^i \right )是忽略节点类型时的,节点v^i的邻居的归一化概率分布。生成的路径可以用作node2vecv和DeepWalk的输入。但是不适用于异构网络。

->生成能够捕获不同类型节点之间语义和结构相关性的路径,从而促进异构网络结构转换为metapath。

metapath被定义为V_1 \overset{R_1}{\rightarrow} V_2 \overset{R_2}{\rightarrow} \cdot \cdot \cdot V_t \overset{R_t}{\rightarrow} V_{t+1} \cdot \cdot \cdot \overset{R_{l-1}}{\rightarrow} V_l,其中R = R_1\circ R_2 \cdot \cdot \cdot \circ R_{l-1}定义了节点类型V_1V_l之间的合成关系。

图中,metapath “APA”表示了一篇论文(P)中两个作者(A)之间的共同作者关系,“APVPA”表示两个作者(A)在同一个场合(V)发表了论文(P)。异构信息网络中的许多数据挖掘任务都可以从metapath建模中受益。

如何使用metapath来指导异构随机游走。给定一个异构网络G=\left ( V,E,T \right ),metapath \mathfrak{p}:V_1 \overset{R_1}{\rightarrow} V_2 \overset{R_2}{\rightarrow} \cdot \cdot \cdot V_t \overset{R_t}{\rightarrow} V_{t+1} \cdot \cdot \cdot \overset{R_{l-1}}{\rightarrow} V_l,第i步的的转移概率被定义为:

\mathit{p}\left ( v^{i+1}|v_t^i, \mathfrak{p} \right )= \left\{\begin{matrix} \frac{1}{\left | N_{t+1} \left ( v_t^i \right ) \right |} & \left ( v^{i+1}, v_t^i \right ) \in E, \phi \left ( v^{i+1} \right )=t+1 \\ 0 & \left ( v^{i+1}, v_t^i \right ) \in E, \phi \left ( v^{i+1} \right )\neq t+1 \\ 0 & \left ( v^{i+1}, v_t^i \right ) \notin E \end{matrix}\right.

其中v_t^i \in V_tN_{t+1}\left ( v_t^i \right )表示节点v_t^iV_{t+1}种邻居,也就是说,游走的位置取决于预先定义的metapath \mathfrak{p}。此外,metapath通常定义为兑成的形式,也就是说,其第一个节点类型V_1和最后一个V_l是相同的,这为随机游走提供了递归引导:

\mathit{p}\left ( v^{i+1}|v_t^i \right ) = \mathit{p}\left ( v^{i+1}|v_1^i \right ), if {\ } t=l

(简单做个总结,这里的t表示的是节点的类型,我倾向于认为上标的i、i+1表示的是节点所在的路径的位置,因此\mathit{p}\left ( v^{i+1}|v_t^i \right )表示的是路径的第i个节点的类型是V_t的前提下,路径第v^{i+1}个节点的条件概率)

基于metapath的随机游走策略确保不同类型节点之间的语义关系可以适当地合并到skip-gram中。例如,在传统的随机游动过程中,如图⬆️所示,从节点CMU迁移到节点a_4上的游动对象的下一步可以是围绕它的所有类型的节点a_2, a_3, a_5, p_2, p_3和CMU。然而,在metapath方案“OAPVPAO”下,例如,根据该路径的语义,在组织节点CMU (O)上的前一步,游走路径偏向于论文节点(P)。

(这里可能不是特别好理解,其实意思是,现在我们在a_4节点上,如果我们已知来这个节点之前,即上一步,在CMU(O),那么下一步就倾向于去取论文节点)

metapath2vec++

metapath2vec可以在arg \max_{ \theta} \sum_{v \in V} \sum_{t \in T_V} \sum_{c_t \in N_{t\left ( v \right )}} log \mathit{p} \left ( c_t|v; \theta \right )中构建的邻居函数N_t\left ( v \right )时,通过给定节点v的类型后取分辨其上下文节点(邻居节点)。然而,在softmax函数中忽略了节点类型信息。

换句话说,为了推断给定节点v的上下文N_t\left ( v \right )中的c_t的特定类型,metapath2vec实际上鼓励所有类型的负样本,包括相同类型t的节点以及异构网络中的其他类型。

Heterogeneous negative sampling

metapath2vec++中,softmax函数根据上下文的节点类型c_t进行规范化。也就是说,\mathit{p} \left ( c_t|v; \theta \right )被调整为特定的节点类型t

\mathit{p} \left ( c_t|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和node2vec / DeepWalk中,输出多项分布的维数等于网络中的节点数。而在metapath2vec++的skip-gram中,t型节点的多项分布维数由t型节点的个数决定。

如图⬆️,对于给定的在输入层中的目标节点a_4,matepath2vec++输出4个多项分布集合,每一个都对应一种类型的邻居。(venues V , authors A, organizations O, and papers P.)

(总结来看,就是对于某个节点,这个节点本身具有一个类别,去计算所有类别的节点在其邻域中的概率,与之前的分别在于这里是按照类型做分类了,一些group by :X)

收到PTE的启发,对抽样分布也由想要预测的邻居c_t的节点类型P_t\left ( \cdot \right )来指定:

\mathcal{O}\left ( \mathbf{X} \right )=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 ]

其梯度定义为:

\frac{\partial \mathcal{O}\left ( X \right ) }{\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 \mathcal{O} \left ( X \right ) }{\partial X_v} = \sum_{m=0}^M \left ( \sigma\left ( X_{u_t^m} \cdot X_v - \mathbb{I}_{c_t} \left [ u_t^m \right ] \right ) \right ) X_{u_t^m}

\mathbb{I}_{c_t} \left [ u_t^m \right ]是一个指示函数(指示函数:一个函数,对于其定义域中属于给定集合的所有点,函数值等于1,而对于不属于该集合的所有点,函数值等于0。),表示u_t^m是否是当m=0, u_t^0=c_t时的邻域上下文节点c_t

(回顾一下m表示什么:"P\left ( u \right ) is the pre-defined distribution from a negative node u^m is drew from M times",m=0, u_t^0=c_t表示的就应是没有被选到过的,类型为t的节点)

采用随机梯度下降算法对模型进行优化。metapath2vec++的伪代码见算法1。

Experiments

Data

  1. AMiner Computer Science(CS)
  2. Database and Information Systems(DBIS)

研究发现,异构学术网络中最常用和最有效的元路径方案是“APA”和“APVPA”[12,25 - 27]。注意,“APA”表示合著者语义,即传统的(同构的)协作链接/关系。“APVPA”代表作者在同一地点发表论文的异构语义。

------------------summary---------------------

目的:保留异构网络的结构&语义信息

方式:异构sikp-gram(最大化节点和其异构上下文邻居的共现概率)

arg \max_{ \theta} \sum_{v \in V} \sum_{t \in T_V} \sum_{c_t \in N_{t\left ( v \right )}} log \mathit{p} \left ( c_t|v; \theta \right )

metapath是什么

节点类型的序列\mathfrak{p}:V_1 \overset{R_1}{\rightarrow} V_2 \overset{R_2}{\rightarrow} \cdot \cdot \cdot V_t \overset{R_t}{\rightarrow} V_{t+1} \cdot \cdot \cdot \overset{R_{l-1}}{\rightarrow} V_l

这里R也有序号完全是因为不同类型节点之间的关系肯定是不一样的,比如,家长-学生-老师三个节点,家长-学生之间是监护关系,学生和老师之间是受教育关系,但是metapath同时还规定了路径必须是对偶的,比如:家长-学生-老师-学生-家长,可能就对应着家长A-学生A-老师A-学生B-家长B,那家长A和家长B的孩子都被某老师教过,比方说,家长A介绍说老师A教的好,家长B听到了,觉得我也把孩子送过去上课这样。因此,下一跳节点的节点类型由当前节点类型和metapath模式确定,比如到老师节点的时候,可能老师还连接了任教学校、毕业学校等,但是因为metapath指定了是家长-学生-老师-学生-家长,那么下一个节点就肯定是邻域内学生类节点中的一个。

目的:捕获不同节点类型之间的联系,并且确保不同类型节点的语义联系可以合理的融合到skip-gram模型中。

metapath2vec++相对于metapath2vec作出了什么改进?

归一化方法改变。

softmax函数不再使用所有节点做归一化(metapath2vec p\left ( c|v; \theta \right )

而是取与中心节点同类型的节点做归一化(metapath2vec++ \mathit{p} \left ( c_t|v; \theta \right ) = \frac{e^{X_{c_t} \cdot X_v} } {\sum_{u_t \in V_t} e^{X_{u_t} \cdot X_v} }

什么是负采样?

Distributed representations of words and phrases and their compositionality

https://www.cnblogs.com/wy-ei/p/11534647.html

这一方法的目的是让目标词 w_O和噪声分布P_{n\left ( w \right )}可以区分开。对于每个数据采样,都有k个负样本。w_I是中心词,w_i是随机抽取的词。我们希望前面的值越大越好,后面的值越小越好(指LR)->同一个窗口内的值是高度相关的,随机选取的值相关性不高

(感觉可以比较粗糙的理解为,让当前节点与其关系密切的节点建立联系,也就是当前节点和邻居建立联系,类似于,熊猫、竹子、大象、香蕉,我们天然希望熊猫和竹子连在一起,并且被认为是相关的,熊猫和大象都是动物,理论上也可能相关,但是在指定的metapath(动物-食物)中就不应该连起来了。也就是说,按照预先制定的路径类型,我们保留了“熊猫吃竹子”这样一个语义信息,并且保留了熊猫和竹子是邻居的结构信息)

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Word2Vec 模型的代码示例: ```python import numpy as np import tensorflow as tf from tensorflow.contrib.tensorboard.plugins import projector # 定义参数 batch_size = 64 embedding_dimension = 5 negative_samples = 8 LOG_DIR = "logs/word2vec_intro" # 语料 corpus_raw = 'He is the king . The king is royal . She is the royal queen ' # 数据预处理 def preprocess_text(text): # 去除标点符号并转化为小写 text = text.lower() text = text.replace('.', ' .') words = text.split() return words words = preprocess_text(corpus_raw) word2int = {} int2word = {} vocab_size = 0 # 构建vocabulary for word in words: if word not in word2int: word2int[word] = vocab_size int2word[vocab_size] = word vocab_size += 1 # 输入和输出的占位符 x_inputs = tf.placeholder(tf.int32, shape=[batch_size]) y_inputs = tf.placeholder(tf.int32, shape=[batch_size, 1]) # 随机选择负样本 embeddings = tf.Variable(tf.random_uniform([vocab_size, embedding_dimension], -1.0, 1.0)) softmax_weights = tf.Variable(tf.truncated_normal([vocab_size, embedding_dimension], stddev=0.5 / np.sqrt(embedding_dimension))) softmax_biases = tf.Variable(tf.zeros([vocab_size])) embed = tf.nn.embedding_lookup(embeddings, x_inputs) # 损失函数 loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(weights=softmax_weights, biases=softmax_biases, inputs=embed, labels=y_inputs, num_sampled=negative_samples, num_classes=vocab_size)) # 优化器 optimizer = tf.train.AdagradOptimizer(0.5).minimize(loss) # 初始化变量 init = tf.global_variables_initializer() # 保存embedding的metadata file_writer = tf.summary.FileWriter(LOG_DIR) metadata = os.path.join(LOG_DIR, 'metadata.tsv') with open(metadata, 'w') as metadata_file: for i in range(vocab_size): metadata_file.write('{}\n'.format(int2word[i])) # 运行会话 with tf.Session() as sess: # 初始化变量 sess.run(init) total_loss = 0 writer = tf.summary.FileWriter(LOG_DIR, sess.graph) # 训练模型 for epoch in range(1000): batch_inputs, batch_labels = generate_batch(words, batch_size, window_size) feed_dict = {x_inputs: batch_inputs, y_inputs: batch_labels} # 梯度下降 _, loss_val = sess.run([optimizer, loss], feed_dict=feed_dict) total_loss += loss_val if epoch % 100 == 0: print("Epoch ", epoch, "Avg loss: ", total_loss / (epoch + 1)) # 保存embedding embedding_var = tf.Variable(embeddings, name='embedding') sess.run(embedding_var.initializer) config = projector.ProjectorConfig() embedding = config.embeddings.add() embedding.tensor_name = embedding_var.name embedding.metadata_path = metadata projector.visualize_embeddings(file_writer, config) # 关闭会话 sess.close() ``` 这个代码示例中使用了 TensorFlow 框架,实现了一个简单的 Word2Vec 模型。其中包括了数据预处理、构建词汇表、定义输入和输出占位符、随机选择负样本、定义损失函数、优化器等步骤。同时,为了可视化词向量,还使用了 TensorBoard 工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值