Arxiv 1607.00653node
咱们将网络中的特征学习表示为最大似然优化问题。 设G = (V, E)
为给定网络。 咱们的分析是通用的,适用于任何有向(无向)的带权(无权)网络。 设f: V -> R^d
是从节点到特征表示的映射函数,咱们的目标是为下游预测任务学习它。 这里d
是指定咱们的特征表示的维数的参数。 等价地,f
是大小|V|×d
的参数矩阵 。 对于每一个源节点u ∈ V
,咱们将N[S](u) ⊂ V
定义为,经过邻域采样策略S
生成的节点u
的网络邻域。算法
为了使优化问题易于处理,咱们作出两个标准假设:网络
条件独立性。 咱们经过假设给定源的特征表示,观察邻域节点的似然与观察任何其余邻域节点无关,来对分解似然:架构
特征空间中的对称性。源节点和邻域节点在特征空间中具备彼此对称的效果。 所以,咱们将每一个源 - 邻域节点对的条件似然建模为 softmax 单元,该 softmax 单元由其特征的点积参数化:框架
根据上述假设,公式(1)中的目标简化为:异步
对于大型网络,每节点分区函数Z[u] = ∑ exp(f(u)·f(v)), v ∈ V
的计算成本很高,咱们使用负采样来近似它 [22]。 咱们在定义特征f
的模型参数上,使用随机梯度上升优化公式(2)。函数
基于 Skip-gram 架构的特征学习方法最初是在天然语言的背景下开发的 [21]。 考虑到文本的线性特性,可使用连续单词上的滑动窗口天然地定义邻域的概念。 然而,网络不是线性的,所以须要更丰富的邻域概念。 为了解决这个问题,咱们提出了一个随机程序,它对给定源节点u
的许多不一样邻域进行采样。 邻域N[S](u)
不只限于直接邻居,而是根据采样策略S
能够具备很是不一样的结构。学习
咱们将源节点的邻域抽样视为局部搜索的形式。 图 1 显示了一个图表,其中给定源节点u
,咱们的目标是生成(采样)其邻域N[S](u)
。 重要的是,为了可以公平地比较不一样的采样策略S
,咱们将邻域集N[S]
的大小约束到k
个节点,而后为单个节点u
采样多个集合。 一般,有两种极端采样策略用于生成k
个节点的邻域集N[S]
:测试
广度优先采样(BFS):邻域N[S]
仅限于做为源的直接邻居的节点。 例如,在图 1 中,对于大小为k = 3
的邻域,BFS 采样节点s[1]
,s[2]
,s[3]
。优化
深度优先采样(DFS):邻域包括在距离源节点不断增长的距离处顺序采样的节点。 在图 1 中,DFS 采样s[4]
,s[5]
,s[6]
。
广度优先和深度优先抽样表明了他们探索的搜索空间的极端状况,从而对学习的表示产生了有趣的影响。
特别是,网络中节点上的预测任务常常在两种类似行之间穿梭:同质性和结构等价性 [12]。 在同质性假设 [7,36] 下,高度互连且属于相似网络集群或社区的节点应紧密地嵌入在一块儿(例如,图 1 中的节点s[1]
和u
属于同一网络社区)。 相反,在结构等价假设下 [10],在网络中具备类似结构角色的节点应紧密地嵌入在一块儿(例如,图 1 中的节点u
和s[6]
充当其相应社区的集线器)。 重要的是,与同质性不一样,结构等价性并不强调连通性;节点在网络中可能相距很远,但仍然具备相同的结构角色。 在现实世界中,这些等价概念并非互斥的;网络一般表现出一些行为,其中一些节点表现出同质性而其余节点反映结构等价性。
咱们观察到,在产生反映上述任一等价性的表示中,BFS 和 DFS 策略起着关键做用。特别是,BFS 采样的邻域产生与结构等价性紧密对应的嵌入。 直观地,咱们注意到,为了肯定结构等价性,一般足以准确地表示局部社区。 例如,能够经过观察每一个节点的直接邻域来推断基于网络角色(例如网桥和集线器)的结构等价性。 经过将搜索限制到附近的节点,BFS 实现了这种表示并得到了每一个节点邻域的微观视图。 此外,在 BFS 中,采样邻域中的节点倾向于重复屡次。 这也很重要,由于它减小了表示 1 跳节点相对于源节点的分布的方差。 然而,对于任何给定的k
,它只探索图的很是小的部分。
对于 DFS 来讲则相反,DFS 能够探索网络的更大部分,由于它能够更加远离源节点u
(样本大小k
是固定的)。 在 DFS 中,采样节点更准确地反映了邻域的宏观视图,这对于基于同质性推断社区是必不可少的。 可是,DFS 的问题在于,不只要推断网络中存在哪些节点到节点的依赖关系,并且还要肯定这些依赖关系的确切性质。 这是很难的,由于咱们对样本大小有限制而且须要探索大的邻域,这产生高方差。 其次,移动到更大的深度致使复杂的依赖性,由于采样节点可能远离源而且可能不太具备表明性。
基于上述观察,咱们设计了一个灵活的邻域采样策略,容许咱们在 BFS 和 DFS 之间平滑插值。 咱们经过开发灵活的偏置随机游走过程来实现这一目标,该过程能够以 BFS 以及 DFS 方式探索邻域。
形式上,给定源节点u
,咱们模拟固定长度l
的随机游走。 令c[i]
表示游走中的第i
个节点,从c[0] = u
开始。 节点c[i]
由如下分布生成:
其中π[vx]
是节点v
和x
之间的非归一化转移几率,Z
是归一化常数。
α
偏置咱们的随机游走的最简单方法是基于静态边权重w[vx]
(即π[vx] = w[vx]
)对下一节点进行采样。(若是是未加权的图w[vx] = 1
。)可是,这不容许咱们考虑网络结构,并指导咱们的搜索过程,来探索不一样类型的网络邻域。 此外,与 BFS 和 DFS 不一样,它们是分别适用于结构等价和同质性的极端抽样范例,咱们的随机游走应该适应这些等价概念不是竞争或排他性的事实,而现实世界的网络一般表现出二者的混合。
node2vec 中随机游走过程的示意图。 游走刚刚从t
转换到v
,如今正在评估节点v
的下一步。 边标签表示搜索误差α
。
咱们定义了一个二阶随机游走,其中有两个参数p
和q
来指导游走:考虑一个随机游走,它刚刚遍历边(t, v)
,如今位于节点v
(图 2)。 如今,游走须要决定下一步,因此它评估从v
引出的边(v, x)
上的转移几率π[vx]
。 咱们将非标准化转移几率设置为π[vx] = α[pq](t, x)·w[vx]
,其中:
而且d[tx]
表示节点t
和x
之间的最短路径距离。 请注意,d[tx]
必须是{0,1,2}
中的一个,所以,这两个参数对于引导游走是必要且足够的。
直观地,参数p
和q
控制游走探索和离开起始节点u
的邻域的速度。 特别是,这些参数容许咱们的搜索过程(大体)在 BFS 和 DFS 之间进行插值,从而对节点等价的不一样概念反映出折中。
返回参数,p:参数p
控制当即从新访问游走中节点的可能性。 将其设置为高值(> max(q, 1)
)可确保咱们不太可能在下面两步中采样已访问过的节点(除非游走中的下一个节点没有其余邻居)。 该策略鼓励适度探索并避免采样中的两跳冗余。 另外一方面,若是p
较低(<min(q, 1)
),它将使游走回溯一步(图 2),这将使游走“局部”靠近起始节点u
。
出入参数q
。 参数q
容许搜索区分“向内”和“向外”节点。 回到图 2,若是q> 1
,则随机游走偏向于接近节点t
的节点。 咱们的样本由较小局部性的节点构成,从这个意义上,这样的遍历得到相对于游走中起始节点的底层图的局部视图和近似的 BFS 行为。
随机游走的好处。相对于纯 BFS / DFS 方法,随机游走有几个好处。随机游走在空间和时间要求方面都是计算上有效的。存储图中每一个节点的直接邻居的空间复杂度是O(|E|)
。对于二阶随机游走,存储每一个节点的邻居之间的互连是有帮助的,这致使空间复杂度为O(a^2 |V|)
,其中a
是图的平均度,而且一般对于实际小世界网络。随机游走优于传统的基于搜索的采样策略的另外一个关键优点是时间复杂度。特别是,经过在样本生成过程当中强制利用图的连通性,随机游走提供了一种方便的机制,经过在不一样的源节点之间重用样原本提升有效采样率。经过模拟长度为l> k
的随机游走,因为随机游走的马尔可夫性质,咱们能够一次为l-k
个节点生成k
个样本。所以,咱们的有效复杂度是每一个样本的O(l k(l-k))
。例如,在图 1 中,咱们采样长度为l = 6
的随机游走{u, s[4], s[5], s[6], s[8], s[9]}
,这产生N[S](u) = {s[4], s[5], s[6]}
,N[S](s[4]) = {s[5],s[6],s[8]}
和N[S](s[5]) = {s[6], s[8], s[ 9]}
。请注意,样本重用可能会在整个过程当中引入一些误差。可是,咱们观察到它大大提升了效率。
LearnFeatures(Graph G = (V, E, W), Dimensions d, Walks per node r, Walk length l, Context size k, Return p, In-out q) π = PreprocessModifiedWeights(G, p, q) G' = (V, E, π) Initialize walks to Empty for iter = 1 to r do for all nodes u ∈ V do walk = node2vecWalk(G', u, l) Append walk to walks f = StochasticGradientDescent(k, d, walks) return f node2vecWalk(Graph G' = (V, E, π), Start node u, Length l) Inititalize walk to [u] for walk_iter = 1 to l do curr = walk[−1] Vcurr = GetNeighbors(curr, G') s = AliasSample(Vcurr, π) Append s to walk return walk
算法 1:node2vec 算法
node2vec 的伪代码在算法1中给出。在任何随机游走中,因为选择起始节点u
而存在隐式误差。 因为咱们学习了全部节点的表示,咱们经过模拟从每一个节点开始的固定长度l
的随机游走来抵消这种误差。 在游走的每一个步骤,基于转移几率π[vx]
进行采样。 能够预先计算二阶马尔可夫链的转移几率π[vx]
,所以,模拟随机游走时的节点采样,可使用别名采样在O(1)
时间内有效地完成。 node2vec 的三个阶段,即用于计算转移几率的预处理,随机游走模拟和使用 SGD 的优化,被顺序执行。 每一个阶段都是可并行化的,而且是异步执行的,这有助于 node2vec 的总体可扩展性。
node2vec 位于:http://snap.stanford.edu/node2vec。
node2vec 算法提供半监督方法来学习网络中节点的丰富特征表示。 可是,咱们常常对涉及节点对而不是单个节点的预测任务感兴趣。 例如,在链路预测中,咱们预测网络中的两个节点之间是否存在链路。 因为咱们的随机游走本质上基于底层网络中节点之间的链接结构,所以咱们使用自举方法,将各个节点的特征表示扩展为节点对。
给定两个节点u
和v
,咱们在相应的特征向量f(u)
和f(v)
上定义二元运算符,以便生成表示g(u, v)
,使得g: V×V -> R^d'
,其中d'
是该对(u, v)
的表示大小。 咱们但愿一般为任何节点对定义运算符,即便对之间不存在边,由于这样作使表示对连接预测有用,其中咱们的测试集包含真边和假边(即,不存在的)。 咱们考虑运算符的几种选择,使得d'= d
,如表 1 所示。
表 1:用于学习边特征的二元运算符的选项。 定义对应于g(u, v)
的第i
个份量。