咱们首先给出本文中使用的符号,而后形式化要解决的二分网络嵌入问题。算法
符号:设G = (U, V, E)
为二分网络,其中U
和V
分别表示两种顶点的集合,E ⊆ U × V
定义集合间的边。 如图 2 所示,u[i]
和v[j]
分别表示U
和V
中的第i
和第j
个顶点,其中i = 1,2, ..., |U|
和j = 1, 2, ..., |V|
。 每一个边带有一个非负权重w[ij]
,描述顶点u[i]
和v[j]
之间的链接强度;若是u[i]
和v[j]
断开链接,则边权重w[ij]
设置为零。 所以,咱们可使用|U|×|V|
矩阵W = (w[ij])
表示二分网络中的全部权重。数组
问题定义:二分网络嵌入的任务,旨在将网络中的全部顶点映射到低维嵌入空间,其中每一个顶点表示为密集嵌入向量。 在嵌入空间中,应保留相同类型的顶点之间的隐式关系,和不一样类型的顶点之间的显式关系。形式上,问题能够定义为:网络
G = (U, V, E)
和权重矩阵W
f: U ∪ V -> R^d
,它将G
中每一个节点映射为d
维嵌入向量为了使符号简单,咱们使用(带箭头的)u[i]
和v[j]
分别表示顶点u[i]
和v[j]
的嵌入向量。 所以,咱们能够将二分网络中全部顶点的嵌入向量表示为两个矩阵U = (u[i])
和V = (v[j])
。框架
良好的网络嵌入应该可以很好地重建原始网络。 为了对二分网络实现这一目标,咱们考虑从两个角度重构二分网络 - 由观察到的边证实的显式关系和由未观察但传递的连接隐含的隐含关系。 而后,咱们经过联合优化这两个任务来学习顶点嵌入。本节介绍了咱们的 BiNE 方法。dom
在二分网络中,边存在于两种不一样类型的顶点之间,在构建二分网络时提供显式信号。 相似于 LINE [20] 中的一阶邻近度建模,咱们经过考虑两个链接顶点之间的局部邻近度来建模显式关系。 顶点u[i]
和v[j]
之间的联合几率定义为:函数
(1)学习
其中w[ij]
是边e[ij]
的权重。显然,若是两个顶点以较大权重紧密相连,则它们共同出现的几率较高。优化
如今咱们考虑如何估计嵌入空间中两个顶点之间的局部邻近度。 word2vec 的有效性和普及性激发了许多工做 [4,8,20],使用内积来模拟两个实体之间的相互做用。 咱们遵循这个设置,并使用 sigmoid 函数将交互值转换为几率空间:编码
其中u[i] ∈ R^d
和v[j] ∈ R^d
分别是顶点u[i]
和v[j]
的嵌入向量。
利用顶点间共现几率的经验分布和重建分布,咱们能够经过最小化它们的差别来学习嵌入向量。 咱们选择 KL 散度做为分布之间的差别度量,能够定义为:
(3)
直观上,最小化该目标函数将使得在原始网络中强链接的两个顶点在嵌入空间中也彼此靠近,这保留了所需的局部邻近度。
现有的推荐工做 [12,15] 所示,显性和隐性关系都有助于揭示二分网络中的不一样语义。为了全面,一样重要的是还要考虑相同类型的两个顶点之间的隐式关系,即便它们没有显式链接。直观上,对于相同类型的两个顶点,若是它们之间存在路径,则它们之间应该存在某种隐式关系;路径的数量及其长度表示隐式关系的强度。不幸的是,计算两个顶点之间的路径具备指数阶的至关高的复杂度,这对于大型网络是不可行的。为了在二分网络中的顶点之间编码这种高阶隐式关系,咱们求助于 DeepWalk 的解决方案。具体地,首先经过执行随机游走将二分网络转换为顶点序列的两个语料库;而后从语料库中学习嵌入,语料库编码顶点之间的高阶关系。在下文中,咱们首先详细说明如何为二分网络生成两个高质量的语料库。
这是一种经常使用方法,经过在网络上执行随机游走将网络转换为顶点序列语料库,已经在一些同构网络嵌入方法中使用 [4,8]。 然而,直接在二分网络上执行随机游走可能会失败,由于因为周期性问题,二分网络上没有随机游走的固定分布 [34]。 为了解决这个问题,咱们考虑在两个同构网络上进行随机漫游,这两个网络包含相同类型顶点之间的二阶邻近度。 按照 Co-HITS [1] 的思想,咱们将两个顶点之间的二阶邻近度定义为:
其中w[ij]
是边e[ij]
的权重。 所以,咱们可使用|U|×|U|
矩阵W^U = (w^U[ij])
和|V|×|V|
矩阵W^V = (w^V[ij])
分别表示两个所得同质网络。
如今咱们能够在两个同构网络上执行截断随机游走,来生成两个语料库来学习高阶隐式关系。 如图 1 所示,DeepWalk 生成的语料库可能没法捕获真实网络的特征。 为了生成具备高保真度的语料库,咱们提出了一种偏置且自适应的随机游走生成器,其能够保持二分网络中的顶点分布。 咱们将其核心设计以下重点介绍:
通常来讲,上述生成过程遵循“富人更富”的原则,这是一种存在于许多真实网络中的物理现象,即顶点连通性遵循无标度幂律分布 [35]。
咱们的随机游走生成器的工做流程总结在算法 1 中,其中maxT
和minT
分别是从每一个顶点开始的随机游走的最大和最小数量。 算法 1 输出的D^U
(或D^V
)是从顶点集U
(或V
)生成的语料库。 顶点中心性能够经过许多度量来衡量,例如度中心性,PageRank 和 HITS [29] 等,咱们在实验中使用 HITS。
Algorithm 1: WalkGenerator(W, R, maxT, minT, p) ----------------------------------------------- Input: weight matrix of the bipartite network W, vertex set R (can be U or V ), maximal walks per vertex maxT, minimal walks per vertex minT, walk stopping probability p Output: a set of vertex sequences D^R 1 Calculate vertices’ centrality: H = CentralityMeasure(W); 2 Calculate W^R w.r.t. Equation (4); 3 foreach vertex vi ∈ R do 4 l = max(H(vi) × maxT, minT); 5 for i = 0 to l do 6 D[v[i]] = BiasedRamdomWalk(W^R, v[i], p); 7 Add D[v[i]] into D^R; 8 return D^R;
在分别对两个同构网络进行误差随机游走后,咱们获得顶点序列的两个语料库。 接下来,咱们在两个语料库上使用 Skipgram 模型 [11] 来学习顶点嵌入。
目的是捕获高阶邻近度,其假定常常在序列的相同上下文中共同出现的顶点,应被分配给相似的嵌入。 给定顶点序列S
和顶点u[i]
,上下文被定义为u[i]
以前和以后u[i]
中的ws
顶点;每一个顶点与上下文向量相关联,来将其表示为上下文的角色。 因为二分网络中有两种类型的顶点,咱们分别保留高阶邻近度。 具体而言,对于语料库D^U
,最大化的条件几率是:
(5)
其中C[S](u[i])
表示序列S
中顶点u[i]
的上下文顶点。相似地,咱们能够获得语料库D^V
的目标函数:
(6)
按照现有的神经嵌入方法 [4,8,20],咱们为输出使用带有 softmax 的内积核,参数化条件几率P(u[c] | u[i])
和P(v[c] | v[j])
:
其中P(u[c] | u[i])
表示在u[i]
的上下文中观察u[c]
的可能性;相似的含义适用于P(v[c] | v[j])
。 经过该定义,实现公式(5)和(6)中定义的目标,将迫使具备类似上下文的顶点在嵌入空间中接近。 然而,优化目标并不是易事,由于 softmax 函数的每次评估都须要遍历一侧的全部顶点,这是很是耗费时间的。 为了下降学习的复杂性,咱们采用了负采样的概念 [11]。
负采样的想法是用一些抽样的负实例逼近 softmax 的昂贵分母项 [36]。 而后,能够经过优化逐元素分类损失来执行学习。 对于中心顶点u[i]
,高质量负样本应该是与u[i]
不一样的顶点。 为了实现这一目标,已经应用了一些启发式方法,例如从误差为受欢迎程度的非均匀分布中抽样 [11]。 在这里,咱们提出了一种更落地的采样方法,来知足网络数据。
首先,咱们相对于输入二分网络中的拓扑结构,将每一个顶点与其ws
跳的邻居重叠,以后使用局部敏感散列(LSH)[37] 来封住顶点。 而后给定一个中心顶点,咱们从与包含中心顶点的桶不一样的桶中,随机选择负样本。 经过这种方式,咱们能够得到高质量和多样化的负样本,由于 LSH 能够保证不一样的顶点以几率方式位于不一样的桶中 [37]。
令N^{ns}[S](u[i])
表示序列S ∈ D^U
中的中心顶点u[i]
的ns
负样本,而后咱们能够将公式(7)中定义的条件几率p(u[c] | u[i])
近似为:
其中P(z|u[j])
定义为:
其中σ
表示 S 形函数1 / (1 + exp(-x))
。 经过将公式(5)中的p(u[c] | u[i])
替换为p(u[c], N^{ns}[S](u[i])| u[i])
的定义,咱们能够获得近似的目标函数来优化。 语义是中心顶点与其上下文顶点之间的邻近度应该最大化,而中心顶点和负样本之间的邻近度应该最小化。
按照相似的公式,咱们能够获得条件几率`p(v[c] | v[j])的对应物,因为空间限制,这里省略了其细节。
为了经过同时保留显式和隐式关系来嵌入二分网络,咱们将它们的目标函数组合起来造成一个联合优化框架。
其中参数α
,β
和γ
是要指定的超参数,用于组合联合优化框架中的不一样组件。
为了优化联合模型,咱们使用随机梯度上升算法(SGA)。 注意,公式(9)的三个份量具备不一样的训练实例定义。 为了解决这个问题,咱们经过执行以下的梯度步骤来调整 SGA 算法:
第一步:对于随机显式关系,即边e[ij] ∈ E
,咱们首先经过利用 SGA 更新嵌入向量u[i]
和v[j]
以最大化最后的份量L[1] = -γO[1]
。 咱们为u[i]
和v[j]
提供 SGA 更新规则,以下所示:
其中λ
表示学习率。
第二步:而后咱们将顶点u[i]
和v[j]
视为中心顶点; 经过使用 SGA 最大化目标函数L[2] = α logO[2]
和L[3] = β logO[3]
,咱们能够保留隐式关系。 具体来讲,给定中心顶点u[i]
(或v[j]
)及其上下文顶点u[c]
(或v[c]
),咱们更新它们的嵌入向量u[i]
(或v[j]
),以下所示:
其中I(z, u[i])
是一个指标函数,用于肯定顶点z
是否在u[i]
的上下文中;相似的含义适用于I(z, v[j])
。 此外,正和负实例的上下文向量更新为:
咱们在算法 2 中总结了学习过程。具体来讲,第 1-2 行初始化全部嵌入向量和上下文向量;第 3-4 行产生顶点序列的语料库;第8和第12行进行负采样; 第 9-10 行和第 13-14 行使用 SGA 来学习嵌入。
Algorithm 2: Training algorithm of BiNE --------------------------------------- Input: bipartite network G = (U, V, E), weight matrix of the bipartite network W, window size ws, number of negative samples ns, embedding size d, maximal walks per vertex maxT, minimal walks per vertex minT, walk stopping probability p Output: vertex embeding matrices U and V 1 Initialize embedding vectors u[i] and v[j]; 2 Initialize context vectors θ[i] and ϑ[j]; 3 D^U = WalkGenerator(W,U,maxT,minT,p); 4 D^V = WalkGenerator(W,V,maxT,minT,p); 5 foreach edge (u[i], v[j]) ∈ E do 6 Update u[i] and v[j] using Equations (10) and (11); 7 foreach (u[i], u[c]) in the sequence S ∈ D^U do 8 Negative sampling to generate N^{ns}[S](u[i]); 9 Update u[i] using Equation (12); 10 Update θ[z] using Equation (14) where z ∈ {u[c]} ∪ N^{ns}[S](u[i]); 11 foreach (v[j], v[c]) in the sequence S ∈ D^V do 12 Negative sampling to generate N^{ns}[S](v[j]); 13 Update v[j] using Equation (13); 14 Update ϑ[z] using Equation (15) where z ∈ {v[c]} ∪ N^{ns}[S](v[j]); 15 return Vertex embeding matrices U and V
预训练:BiNE 在公式(9)中的联合目标函数是非凸的,所以初始化对于找到一个好的解决方案起着重要的做用。咱们预训练公式(3)来得到初始顶点嵌入。
计算复杂性分析:语料库生成和联合模型优化是 BiNE 的两个关键过程。 然而,若是W^U
或W^V
变得密集,则生成语料库的复杂性将增长。 为了不处理密集矩阵,另外一种方法是在原始的二分网络中走两步。 假设v[c]
是生成的语料库中顶点v
的访问计数。 所以上下文大小为v[c]·2ws
。 对于高度的顶点,它多是一个大值,但咱们只是随机选择一小部分上下文顶点,例如bs (bs « vc)
。 所以,算法的复杂度为O(2|E|·bs·2ws·(ns + 1))
,其中ns
是负样本的数量。 在某种程度上,经过设置适当的bs
,能够在每次迭代中训练中心顶点的全部上下文顶点,由于在遍历全部边时将屡次访问中心顶点。