城市的快递网络里住着一位名叫阿邮的快递小哥。他每天要穿过几十条街道,把包裹送到各个商铺。起初阿邮送快递全凭心情——走到路口随机挑一条街就走,完全记不住自己来过哪里。后来快递公司给他装上两个旋钮:一个叫“回头情结”(p),控制他回到刚离开那家店的冲动;另一个叫“探险精神”(q),控制他跑去陌生街区的欲望。调好这两个旋钮,阿邮送出的每一条路线都暗藏玄机——把这家店附近经常一起出现的商家记录下来,就能推算出“什么样的店和什么样的店扎堆”。这正是 Node2Vec 的核心智慧:让机器在图上“逛街”,把每个节点变成一串数字向量。逛得巧妙,向量就自动捕捉了“谁和谁是一伙的”(同质性)以及“谁和谁长得像”(结构等价)。

岗位关联

掌握 Node2Vec 是从“会跑深度模型”进阶到“会用图思维解决工业问题”的关键一步——它直接支撑推荐召回、社交风控、链路预测等高频业务场景。

目录
  1. 可视化演示
  2. 1. 背景与目标
  3. 2. 随机游走引擎
  4. 3. 二阶寻路控制
  5. 4. Embedding 学习
  6. 5. 完整算法管线
  7. 6. 特性捕捉能力
  8. 7. 对比与调优
  9. 8. 业务落地场景
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示Node2Vec的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Node2Vec:Node Node2Vec的核心思想与动 二阶有偏随机游走机制 核心机制可视化 Node2Vec整体架构与关键组件

1. 背景与目标

快递公司新来了一个机器人助手小电,它不认地图,只认数字表格。老板想让它分析“哪几家商铺该互相推荐”,但小电面对一张密密麻麻的路线图完全懵了——它能读 Excel,却读不懂“线连成的网”。这就引出了图嵌入任务:把图中每个节点(商户)转换成一串固定长度的数字向量(类似把姓名变成身份证号的数字编码),让机器能计算任意两个节点有多“像”。

过去人们手动设计图的统计特征,比如计算一个节点有多少个邻居、邻居之间连得有多密,再把几十个手工特征拼成向量。这类方法的痛点在于:手工特征需要大量领域专家经验,而且不同图的规律千差万别——电商二部图和社交网络图的特征含义完全不同,换个场景就要重新设计。就像让一位老快递员凭经验手工写“街区画像表”,换一座城市就失效。

Node2Vec 的思路是让机器自己从图中“逛街”学特征,把图嵌入形式化为一个映射函数:

映射学好后,每个商户都有了“数字身份证”。机器学习模型可以放下地图,只凭向量就能判断“书店和文具店该互推,书店和理发店没什么关系”。向量是图的“翻译官”,把网络结构变成可计算的数字语言。

f:V→Rd\displaystyle f: V \to \mathbb{R}^d
  1. V 是图的节点集合图里所有商户构成集合 V,每个商户是其中一个元素。
    V={v1,v2,…,vn}V = \{v_1, v_2, \dots, v_n\}
  2. f 是映射函数把节点变成向量的函数,学习的核心就是这个 f 本身。
    f(u)=zuf(u) = z_u
  3. d 是向量维度每个节点被表示成一个 d 维实数向量,向量越长信息容量越大,但训练代价也越高。
    zu∈Rdz_u \in \mathbb{R}^d

2. 随机游走引擎

阿邮送快递时有一个习惯:从一家店出发,随机选一条相邻的街走到下一家店,记下店名,再重复。跑完一天,他的送件单就是一条节点序列:“便利店→咖啡店→书店→文具店→咖啡店→健身房……”。在 Node2Vec 里,这条序列就叫随机游走。它把“图”这种复杂结构,降维成了一串可以喂给语言模型的“句子”——图结构的信息被编码进每一步的相邻关系里。

随机游走的数学本质是马尔可夫链式的序列采样:当前站在哪个节点,只决定下一步可能走到哪些节点。整条路线的概率可以拆解成每一步决策的乘积:

光有路线还不够,还要像 NLP 一样开一个“滑动窗口”:以路线中每个节点为中心,截取前后各 m 个节点作为它的上下文邻居。例如在“便利店→咖啡店→书店→文具店→咖啡店”里,以“书店”为中心、窗口大小为 2 时,上下文就是“便利店、咖啡店、文具店、咖啡店”。这些窗口样本就是后面的学习原料,相当于把阿邮每天的送件路线切成了无数个“短语”。

早期的 DeepWalk 正是用均匀随机游走加 Word2Vec 做图嵌入的尝试,相当于让阿邮完全凭心情选路。但均匀游走看不到“店铺性格”——它既不会特别留恋一个街区,也不会特别向往远方。Node2Vec 的最大升级,就是给游走装上参数旋钮。

P(c1,c2,…,cL)=∏i=1LP(ci∣ci−1)\displaystyle P(c_1, c_2, \dots, c_L) = \prod_{i=1}^{L} P(c_i \mid c_{i-1})
  1. c_i 是第 i 步所在的节点表示送件路线中第 i 家店的编号。
    ci∈Vc_i \in V
  2. P(c_i | c_{i-1}) 是一步转移概率从上一家店 c_{i-1} 走到当前店 c_i 的概率。
    P(ci∣ci−1)P(c_i \mid c_{i-1})
  3. 连乘符号累乘所有步骤整条路线的概率等于每一步转移概率相乘,这种“当前只依赖上一步”的性质叫一阶马尔可夫性。
    ∏i=1LP(ci∣ci−1)\prod_{i=1}^{L} P(c_i \mid c_{i-1})

3. 二阶寻路控制

要让阿邮的路线有性格,关键不在于下一步怎么选,而在于“他刚刚从哪来”。假如阿邮刚从书店走到咖啡店,面对下一个路口,他心里会权衡三个候选:原路返回书店(回头)、继续去旁边的文具店(附近)、还是绕远去宠物店(远方)?Node2Vec 用二阶随机游走处理这个决策——不仅看当前节点,还看上一步节点与候选节点的距离。核心是下面这个偏置函数:

有了偏置 α,从当前节点 v 走到候选节点 x 的概率就是把 α 乘上边权重,再对所有邻居归一化:

p 和 q 的组合就是在广度优先(BFS)与深度优先(DFS)之间拨动天平:小 p 让游走反复在局部邻居间周转,小 q 让游走不断冲向新区域。这就像阿邮既可以做一个“死守一条街”的守成小哥,也可以做一个“满城跑”的开拓小哥——不同性格决定他能观察到什么规律。

αpq(t,x)={1pif dtx=01if dtx=11qif dtx=2\displaystyle \alpha_{pq}(t, x) = \begin{cases} \frac{1}{p} & \text{if } d_{tx} = 0 \\ 1 & \text{if } d_{tx} = 1 \\ \frac{1}{q} & \text{if } d_{tx} = 2 \end{cases}
  1. w_vx 是边权重表示 v 到 x 这条街的通行强度,无权重图里取 1。
    wvx∈R>0w_{vx} \in \mathbb{R}_{>0}
  2. Z 是归一化常数把 v 的所有邻居的非归一化分数加起来,保证概率和为 1。
    Z=∑y∈N(v)αpq(t,y)×wvyZ = \sum_{y \in N(v)} \alpha_{pq}(t, y) \times w_{vy}
  3. 整体物理含义每走一步都像抽一次“加权签”,回头签、附近签、远方签的比例由 p、q 决定。
    P(ci=x∣ci−1=v)∝αpq(t,x)×wvxP(c_i = x \mid c_{i-1} = v) \propto \alpha_{pq}(t, x) \times w_{vx}

4. Embedding 学习

路线样本攒够了,接下来要做的事类似于培养阿邮的“行业直觉”:看到一家店,能猜到它周围经常出现什么店。SkipGram 模型就是干这个的——它拿到大量“中心店→窗口店”的配对样本,训练每个节点的向量,使“和中心店在窗口里共现过的店”被预测出来的概率尽量大。整体目标函数写为:

每个上下文邻居被预测的概率用 softmax 计算,即“中心向量”与“候选向量”的内积越大,预测分数越高,再在全图范围内归一化:

全图 softmax 的计算量随节点数线性增长,上亿节点的工业图根本算不动。于是 Node2Vec 采用负采样:只从全图中随机抽 K 个“负样本”节点参与分母近似计算,其余节点不再参与。这相当于阿邮判断“这家店是不是咖啡店的常客”时,只抽查几个不相关的店来对照,而不是把全城所有店都问一遍,训练速度因此大幅提升。

max⁡f∑u∈Vlog⁡P(NS(u)∣f(u))\displaystyle \max_{f} \sum_{u \in V} \log P(N_S(u) \mid f(u))
  1. f(n_j)·f(u) 是向量内积衡量中心店 u 与候选店 n_j 的向量相似度,内积越大越“合拍”。
    sim(u,nj)=f(nj)⋅f(u)=∑k=1df(nj)kf(u)k\text{sim}(u, n_j) = f(n_j) \cdot f(u) = \sum_{k=1}^{d} f(n_j)_k f(u)_k
  2. exp 指数函数放大差异把相似度分数映射成正数,显著拉开“合拍”与“不合拍”的差距。
    exp⁡(sim)>0\exp(\text{sim}) > 0
  3. 分母遍历全图归一化把分数转成所有节点上的概率分布,概率总和为 1。
    ∑v∈Vexp⁡(sim(u,v))∑v′∈Vexp⁡(sim(u,v′))=1\sum_{v \in V} \frac{\exp(\text{sim}(u, v))}{\sum_{v' \in V} \exp(\text{sim}(u, v'))} = 1

5. 完整算法管线

把阿邮的整套工作流程抽象出来,Node2Vec 就是一条三步流水线。第一步是预处理:为每个节点的每条出边预先算好“非归一化转移分数”,因为一条边是“回头”还是“远走”,取决于它相对上一步节点的位置,这个关系可以被预先固化。第二步是采样:让阿邮从每个节点出发,按偏置概率走上百步、跑好几轮,生成大量路线序列。第三步是学习:用 SkipGram 加负采样在这些序列上做随机梯度下降,不断微调每个节点的向量。

第三步的更新规则是典型的梯度上升式迭代:

流水线跑完后,阿邮脑子里形成了一张“城市商户关系网”:向量相近的店,要么在同一片商圈里(同质性),要么在结构上扮演相似角色(比如每个小区门口都有一个“便民超市”)。向量就是阿邮的经验结晶,此后他再也不需要背地图,看一眼向量就知道该往哪送。

f(u)←f(u)+η∂L∂f(u)\displaystyle f(u) \leftarrow f(u) + \eta \frac{\partial \mathcal{L}}{\partial f(u)}
  1. L 是目标函数值本节的 SkipGram 对数似然,衡量当前向量好坏。
    L=∑u∈Vlog⁡P(NS(u)∣f(u))\mathcal{L} = \sum_{u \in V} \log P(N_S(u) \mid f(u))
  2. η 是学习率控制每一步向量调整的幅度,太大容易震荡,太小收敛慢。
    η∈(0,1)\eta \in (0, 1)
  3. 偏导数是梯度方向告诉向量“往哪个方向调整能让损失变大最快”,梯度上升沿此方向前进。
    ∂L∂f(u)\frac{\partial \mathcal{L}}{\partial f(u)}
  4. ← 表示迭代更新每次迭代把向量沿梯度方向挪一小步,反复多轮后达到局部最优。
    ft+1(u)=ft(u)+η∂L∂f(u)f_{t+1}(u) = f_t(u) + \eta \frac{\partial \mathcal{L}}{\partial f(u)}

6. 特性捕捉能力

同质性与结构等价是图嵌入最关注的两类“相似”。同质性指“距离近的节点应该相似”——比如同一片大学城里的奶茶店、书店、文具店彼此紧密相连,向量应该靠在一起。结构等价指“扮演角色相同的节点应该相似”——比如北京西站旁的小卖部和上海虹桥站旁的小卖部,一个在东一个在西,物理距离很远,但它们在各自的街区里都担任“车站附近便利店”这个角色,向量也应该靠在一起。

Node2Vec 用 p、q 两个旋钮在这两种特性间调节。偏向同质性时,需要让游走尽量在局部社区内打转(小 p 带来的频繁回退 + 适度 q),这样同一社区的节点会反复在同一窗口出现,向量自然聚拢。偏向结构等价时,需要让游走多访问“离上一步较远”的节点(小 q 带来的外跳),游走者才能在不同社区的相似结构之间建立桥接,让扮演相同角色的节点进入同一窗口。

从阿邮的角度看,这两个旋钮就是他的两种工作模式。同质性模式像“社区巡游小哥”:整天绕着几个熟脸店铺转,熟客们被牢牢记住。结构等价模式像“全市巡查员”:每到一个新的小区,他都会立刻认出“哦,这里的超市和另一个小区的超市是同类”。

值得强调的是,p、q 并不是非此即彼的开关,而是连续的调节杆。现实中大多数图同时包含两种特性,调参的目标不是追求某个极端,而是找到让下游任务表现最好的中间点,这通常要做小规模网格搜索验证。

7. 对比与调优

DeepWalk 是 Node2Vec 的前身,两者的差别只有一句话:DeepWalk 游走时所有邻居的转移概率相等(等价于固定 p=1、q=1 的 Node2Vec),Node2Vec 则允许通过 p、q 灵活调整游走偏好。DeepWalk 像一位完全没性格的阿邮,走到哪算哪;Node2Vec 则允许业务方按图的结构特点定制游走性格。

调参时通常采用两步走策略。第一步粗调:固定游走长度(walk_len,常见 50~100)、游走次数(num_walks,常见 5~20)、向量维度(dim,常见 64~256)在经验区间内,重点在 p、q 上做网格搜索,p、q 的候选集一般是 {0.25, 0.5, 1, 2, 4}。第二步精调:拿到 p、q 的最优点后,再在 walk_len、dim 等参数附近小范围扫描,以线下评测指标(如节点分类的 F1、链路预测的 AUC)为准则选择最终配置。

这种先粗后细的调参流程很像阿邮换新车:先确定性格旋钮(p/q)配出能跑通全城的车,再调发动机排量(walk_len)和油箱大小(num_walks),最后看实测油耗(下游指标)。把评估指标当成唯一裁判,不要凭直觉拍脑袋决定参数。

8. 业务落地场景

学到的节点向量最终要服务业务。第一个高频场景是节点分类——例如社交平台判断一个账号是否是营销号:把用户关系图做成无向图,跑 Node2Vec 得到用户向量,再叠一个轻量分类器(逻辑回归或两层 MLP),就能以低成本获得相当不错的分类效果。相比直接在原始图上做特征工程,向量是全自动学出来的,节省大量人工。

第二个场景是链路预测——预测两个尚未建立连接的节点未来是否会产生边。典型例子是好友推荐:在社交图上跑完 Node2Vec 后,对任意两个用户求向量余弦相似度,相似度高的候选对就是“可能认识的人”。这个思路也广泛用于电商的“常买搭配”关系挖掘。第三个场景是推荐系统召回——把用户和商品放在同一个二部图里,跑 Node2Vec 让两类节点共享同一向量空间,然后用用户向量去最近邻搜索商品向量,就能从千万级商品里快速召回候选集合。

三个场景共享同一套基础设施:向量一旦训练好,下游就退化成标准的向量检索或分类问题,可以复用成熟的近邻搜索工程架构(如 HNSW、Faiss)。对算法工程师而言,Node2Vec 的意义在于把“图结构先验”装进向量里,让后续建模更专注。

AI 应用场景

社交网络用户分类与风控识别

阶段:特征工程阶段

解决的问题:传统风控模型依赖手工统计的用户画像特征(发帖频率、好友数等),难以捕捉“关系网络中的隐藏结构”。Node2Vec 自动从社交关系中学习用户向量,把“谁和谁扎堆”“谁在相似位置”编码进特征,让下游分类器能识别异常聚集或角色异常的用户。

具体案例:某社交平台要识别刷单团伙。平台把用户之间的关注、私信关系建成图,跑 Node2Vec(p=0.5, q=2)得到用户向量,再训练梯度提升树分类器。相比手工特征方案,AUC 提升约 8%,且发现了若干“平时行为正常但结构位置与已确认黑产高度相似”的潜在风险账号。

电商推荐系统中的向量召回

阶段:召回阶段

解决的问题:传统协同过滤在数据稀疏时难以找到足够相似的商品,而用户-商品二部图上天然存在“用户买 A 也买 B”的传递关系。Node2Vec 在二部图上生成游走序列,学出的向量使“被同一类用户购买的商品”自动聚集,提升召回覆盖率。

具体案例:某跨境电商将过去 30 天的购买记录构建为用户-商品二部图,运行 Node2Vec 得到商品向量。在每次请求时取用户历史交互商品的向量均值,在 Faiss 索引中做近邻搜索,召回候选商品后再精排,实现线上 CTR 提升约 3.2%。

生物网络中的链路预测

阶段:模型训练与评估阶段

解决的问题:在蛋白质-蛋白质相互作用网络中,通过实验验证新的相互作用成本极高。Node2Vec 学出的蛋白质向量可以预测尚待验证的相互作用边,为生物学家提供实验优先级排序。

具体案例:某基因研究团队用已知的蛋白质相互作用网络跑 Node2Vec(q=0.5 偏向结构等价),对未知蛋白质对计算向量相似度,取 Top 100 送去湿实验验证,验证命中率是随机挑选的 6 倍,显著节约了实验成本。

Python 演示

python57 行
import randomimport networkx as nxfrom gensim.models import Word2Vec  def biased_walk(graph, start, walk_len, p, q):    walk = [start]    prev = None    for _ in range(walk_len - 1):        cur = walk[-1]        neighbors = list(graph.neighbors(cur))        if not neighbors:            break        weights = []        sum_w = 0.0        for nxt in neighbors:            if prev is None:                w = 1.0            else:                d = 0 if nxt == prev else (1 if graph.has_edge(nxt, prev) else 2)                w = 1.0 / p if d == 0 else (1.0 if d == 1 else 1.0 / q)            weights.append(w)            sum_w += w        r = random.uniform(0, sum_w)        acc = 0.0        chosen = neighbors[-1]        for nxt, w in zip(neighbors, weights):            acc += w            if r <= acc:                chosen = nxt                break        prev = cur        walk.append(chosen)    return [str(node) for node in walk]  def node2vec(graph, p=1.0, q=1.0, walk_len=80, num_walks=10, dim=16):    walks = []    nodes = list(graph.nodes())    for _ in range(num_walks):        random.shuffle(nodes)        for node in nodes:            walks.append(biased_walk(graph, node, walk_len, p, q))    model = Word2Vec(walks, vector_size=dim, window=5, min_count=0,                     sg=1, hs=0, negative=5, workers=1, epochs=5)    return model  if __name__ == "__main__":    graph = nx.karate_club_graph()    p_value, q_value = 0.5, 0.5    model = node2vec(graph, p=p_value, q=q_value)    node = 0    print("特征向量维度", model.wv[str(node)].shape)    print("节点", node, "向量前5维", model.wv[str(node)][:5].round(3))    similar = model.wv.most_similar(str(node), topn=3)    print("最相似节点", [(int(n), round(score, 3)) for n, score in similar])
目的:在经典的空手道俱乐部社交网络上实现带二阶偏置的 Node2Vec,输出指定节点向量及其最相似节点。
  1. def biased_walk(graph, start, walk_len, p, q):定义带偏置的随机游走函数,模拟阿邮的一次送件路线,p、q 是性格旋钮。
  2. d = 0 if nxt == prev else (1 if graph.has_edge(nxt, prev) else 2)计算候选节点到上一步节点的图距离,这是“二阶”信息的核心。
  3. w = 1.0 / p if d == 0 else (1.0 if d == 1 else 1.0 / q)把距离映射成权重:回头权重 1/p,附近权重 1,远方权重 1/q。
  4. r = random.uniform(0, sum_w)按权重比例随机抽样,让游走既受偏置引导、又保持随机性。
  5. walks.append(biased_walk(graph, node, walk_len, p, q))从每个节点出发生成一条序列,全部序列构成训练语料。
  6. model = Word2Vec(walks, vector_size=dim, window=5, min_count=0, sg=1, hs=0, negative=5, workers=1, epochs=5)用 SkipGram(sg=1)加负采样(negative=5)学习节点向量,等价于 Node2Vec 的向量学习阶段。

常见误区

误区我以为 p、q 是类似学习率的参数,调得越大,模型学到的信息就越多,效果一定越好。于是直接设成 p=10、q=10,结果下游任务反而变差了。

正解p、q 是概率偏置的倒数,p 越大意味着 1/p 越小,游走者几乎从不回退;q 越大则几乎从不跳远,两种极端都会让游走失去多样性。p、q 的有效区间通常在 0.25 到 4 之间,它们控制的是游走的“性格方向”而非“强度”,必须结合图的规模与任务目标,通过网格搜索确定最优值。

为何常见:因为绝大多数超参(如学习率、向量维度)都是越大或越小单方向调节的,学习者容易把 p、q 也当成单调超参,忽略了它们其实是“权衡旋钮”。

误区我在做节点分类时想要同质性,就把 p 调到 0.1;想要结构等价,就把 q 调到 0.1。结果发现无论怎么调都不稳定,向量分布乱七八糟。

正解同质性和结构等价不是由单个参数单独决定的。小 p 让游走频繁回退到上一步,本质是把视野收缩在当前节点的邻域内(偏 BFS),这会同时强化两类“邻域内”的信号;小 q 让游走倾向于跳到离上一步较远的节点(偏 DFS),适合在不同社区的相似结构之间建立联系。实践中通常需要 p、q 组合调节,并用小规模标注集验证哪种倾向对任务更有利。

为何常见:学习者习惯把多因素问题简化为“一参数对一属性”的映射,忽略了二阶游走中 p、q 作用于同一决策的不同距离档位,两者是协同而非独立。

误区我为了提高效果把 num_walks 设成 200、walk_len 设成 500,结果训练时间暴涨,内存快爆了,但效果几乎没有提升。

正解随机游走的收益是递减的。当游走次数和长度超过一定阈值后,新序列只能提供少量重复窗口信息,边际收益趋近于零,而计算和存储开销线性增长。一般建议先用小规模实验快速扫描参数,观察下游指标收敛曲线,找到“性价比”最高的区间,而非盲目堆资源。

为何常见:深度学习时代的直觉是“更多数据 = 更好效果”,但随机游走是人为生成的数据,重复采样会产生冗余,数据量与信息量不是线性关系。

误区我一直以为 DeepWalk 和 Node2Vec 是互相竞争的两套方案,选了 Node2Vec 之后,DeepWalk 就完全没有参考价值了。

正解DeepWalk 是 Node2Vec 的特例——p=1、q=1 时偏置函数恒为 1,二阶游走退化为均匀游走。Node2Vec 在实现时通常可以把 DeepWalk 视为参数组合中的一种基线配置。理解这层关系,调参时就能把 DeepWalk 的结果当作“默认档”,用它来衡量 p、q 是否真的带来了增益。

为何常见:研究不同算法时,人们容易把它们看作相互独立的黑盒,忽略论文中的推导关系,尤其是“特例-推广”这种容易被泛化描述掩盖的结构关联。

面试题

Q1. Node2Vec 在 DeepWalk 基础上最重要的创新是什么?

单选题 · easy

  • A.更长的游走序列
  • B.带偏置的随机游走← 正确答案
  • C.更大规模的语料
  • D.更深层的神经网络

答案:B。Node2Vec 的核心改进是引入二阶随机游走,用 p、q 参数控制转移概率。更长的序列、更大的语料属于工程配置而非算法创新,Node2Vec 也没有使用更深的神经网络。

Q2. 随机游走中 p 参数的主要作用是什么?

单选题 · easy

  • A.控制返回上一步的倾向← 正确答案
  • B.控制跳向远方的倾向
  • C.控制学习率的快慢
  • D.控制向量维度大小

答案:A。p 的倒数 1/p 是“回到上一步节点”的转移权重,p 越小回退倾向越强。q 控制远方跳跃,学习率和维度由训练配置决定,与游走概率无关。

Q3. 当 p 取很小值(如 0.25)时,游走者会表现出什么行为?

单选题 · mid

  • A.频繁回头重访旧节点← 正确答案
  • B.一直奔向全新区域
  • C.完全停止随机游走
  • D.均匀选择所有邻居

答案:A。p=0.25 时 1/p=4,回退到上一步节点的权重是默认邻居的 4 倍,游走者会频繁折返,路径聚集在局部区域,类似广度优先的探索风格。

Q4. 当 q 大于 1(即 1/q 小于 1)时,游走偏好最接近哪种策略?

单选题 · mid

  • A.深度优先不断走远
  • B.广度优先局部兜圈← 正确答案
  • C.均匀随机走遍全图
  • D.只沿最短路径返回

答案:B。q 大意味着走到距上一步两步之遥的节点权重被压低,游走者倾向留在上一步的邻居范围内,行为接近广度优先搜索,适合捕捉结构等价。

Q5. Node2Vec 使用以下哪个模型学习节点向量?

单选题 · mid

  • A.LSTM 语言模型
  • B.Transformer 模型
  • C.SkipGram 词向量← 正确答案
  • D.朴素贝叶斯分类器

答案:C。随机游走序列被视为句子,节点视为词,论文直接采用 Word2Vec 中的 SkipGram 模型,配合负采样在窗口内预测上下文节点,从而得到节点向量。

Q6. Node2Vec 适合以下哪类图学习任务?

单选题 · easy

  • A.图像分类任务
  • B.节点分类与链路预测← 正确答案
  • C.语音识别任务
  • D.文本翻译任务

答案:B。Node2Vec 的产物是节点向量,天然服务于节点分类、链路预测、推荐召回等图结构任务。图像、语音、翻译属于其他模态,不在 Node2Vec 的适用范围内。

Q7. 关于 DeepWalk 与 Node2Vec 的关系,以下说法正确的是?

单选题 · hard

  • A.两者是完全无关的算法
  • B.DeepWalk 是 p=q=1 的特例← 正确答案
  • C.Node2Vec 无法退化为 DeepWalk
  • D.DeepWalk 效果必然优于 Node2Vec

答案:B。当 p=1、q=1 时,二阶偏置函数恒等于 1,转移概率等价于均匀随机游走,Node2Vec 退化为 DeepWalk。因此 DeepWalk 是 Node2Vec 的特例,而不是无关算法。

Q8. 下列哪些超参数会影响 Node2Vec 的嵌入效果?

多选题 · mid

  • A.游走长度 walk_len← 正确答案
  • B.游走次数 num_walks← 正确答案
  • C.向量维度 dim← 正确答案
  • D.显示器分辨率

答案:ABC。walk_len 决定上下文窗口能覆盖多远,num_walks 决定语料规模,dim 决定向量容量,三者都直接影响嵌入质量。显示器分辨率与算法毫无关系。

Q9. Node2Vec 训练完成后,典型的下游任务包括哪些?

多选题 · hard

  • A.节点分类← 正确答案
  • B.链路预测← 正确答案
  • C.推荐系统召回← 正确答案
  • D.图像超分辨率重建

答案:ABC。节点向量可以作为特征做节点分类,可以做向量相似度预测潜在连边,也可以在用户-商品图上做向量召回。图像超分是像素级别的视觉任务,与图嵌入无关。

Q10. 负采样在 Node2Vec 训练中的作用是什么?

多选题 · mid

  • A.加速 SkipGram 训练← 正确答案
  • B.避免全量 softmax 开销← 正确答案
  • C.让负样本参与更新← 正确答案
  • D.替代所有随机游走过程

答案:ABC。负采样用少量随机负节点近似分母,避免遍历全图计算 softmax,同时让负样本参与梯度更新,从而大幅加速训练。它不影响随机游走本身,只是 SkipGram 训练的优化技巧。