假设你是某新建小区的物业经理。小区入住第一天,你给每位住户拍了证件照、录了门禁卡,做成一本厚厚的住户名册。这套系统运行得很顺,直到第二周有人搬来:新住户满心期待地刷门禁,系统却显示“查无此人”。你只能重新拍照、更新名册,而只要小区持续有人搬入搬出,这套名册就永远在过时。 后来你换了一种思路:不背名册,改请一位“智能安保员”。这位安保员不问“你是谁”,只学“如何判断一个人属于哪个圈子”——看他的外貌特征(节点特征),问问他常和谁一起出入(邻居聚合),现场给他生成一张“行为画像”(嵌入向量)。新住户入住那一刻,画像瞬间生成,无需重新培训安保员。 这种“学会方法而不是背名单”的思路,就是归纳式(Inductive)学习。当图数据不断演化——社交网络注册新用户、电商上架新商品、金融系统冒出新账户——它都能在毫秒级生成嵌入,从容应对冷启动。本文就用这套“门禁系统”的逻辑,为你拆解 GraphSAGE 的每一块拼图。

岗位关联

学完本节,你将理解“学会方法而非背名册”的归纳式思维,能够解决新用户冷启动、动态图嵌入更新等工业级难题——这是推荐、风控领域最稀缺的工程能力之一。

目录
  1. 可视化演示
  2. 概念与背景
  3. 归纳式原理
  4. 直推式对比
  5. 泛化与迁移
  6. 动态图应用
  7. 采样聚合机制
  8. 工程落地实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示ECS(Entity-Component-System)架构中实体、组件与系统的协作关系,包括组件组合与系统批处理的运行机制,直观理解数据导向设计的核心优势。

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

游戏引擎ECS架构 Entity:轻量ID,仅作组件容器无逻辑 Component:纯数据结构,可自由组合复用 System:批处理逻辑,按组件查询执行 Entity = ID + ComponentSet; System Query(Archetype) → Process ECS以数据导向设计实现高性能游戏逻辑

概念与背景

小区的住户关系就是一张图:每个住户是一个“点”,经常串门的两户之间连一条“线”。门禁系统的终极目标,是给每位住户发一串“特征码”——生活习惯越相近,特征码就越接近。这样,新住户搬来时,系统就能凭特征码判断他跟谁聊得来。

在 AI 术语里,“点”叫节点(Node),“线”叫边(Edge),“特征码”叫嵌入向量(Embedding)。图嵌入的目标,就是把复杂的图结构压缩成几十维的向量,让下游的分类、推荐、异常检测任务有“数字”可用。它的本质,是给图中每个节点找一个“坐标”,让结构相近、特征相近的节点在坐标空间里靠得近。

传统方法 DeepWalk 的做法很朴素:在这张图上随机游走,把节点的访问顺序当成“句子”丢给 Word2Vec 训练,最终得到一张“节点 ID → 向量”的查找表。它的致命弱点在于:整体只针对“拍照那一刻”的图。图一旦演化、新节点加入,嵌入表就无法覆盖新人,只能整图重训。对一个动态演化的系统来说,这等于每次有人搬家,都要把全小区重新拍一遍全家福。

这就是“名册思维”的局限——名册永远赶不上搬家的速度。GraphSAGE 换了个问题:与其记住每一个人,不如学会一套“识人方法”,让任何新面孔都能被当场评估。这正是归纳式学习的起点。

归纳式原理

智能安保员不背名册,他的判断依据有三样:住户自己的外貌特征、他常来往的邻居、以及一套“如何从邻居推断此人”的方法。GraphSAGE 把这套方法做成 K 层神经网络,每一层都在做同一件事——“问邻居、汇总、结合自己、修一修”。

技术上,GraphSAGE 学习的是聚合函数。第 k 层时,节点 $v$ 先把邻居们的向量聚合成一个“集体评价”,再与自己的向量拼接,乘上权重、过激活函数:

经过 K 层聚合,节点的最终嵌入为:

新节点到来时,只要把它的特征和邻居喂进同一套网络,就能立即得到嵌入。邻居采样则让任何度数的节点都只参考固定数量的邻居,计算复杂度完全可控。安保员对老住户和新住户用同一套流程:“看外貌、问邻居、出画像”——差别只在于老住户的画像可能被缓存过,新住户则是现场算,但方法完全一致。

hv(k)=σ(W(k)⋅CONCAT(hv(k−1), AGG({hu(k−1), ∀u∈N(v)})))h_v^{(k)} = \sigma\left(W^{(k)} \cdot \mathrm{CONCAT}\left(h_v^{(k-1)},\ \mathrm{AGG}\left(\left\{h_u^{(k-1)},\ \forall u \in N(v)\right\}\right)\right)\right)
这是 GraphSAGE 的核心公式:每一层都在“问邻居、结合自己”。K 层之后,节点信息就能覆盖 K 跳范围内的朋友圈。
  1. $z_v$(最终嵌入)节点 $v$ 的最终向量,是下游分类、推荐、风控任务的输入素材。
  2. $h_v^{(K)}$(末层状态)经过 $K$ 层聚合后的状态,已融入自身与 K 跳邻居的信息。
  3. $\forall v \in V$(对任意节点)这个关系对所有节点成立,包括训练时从未见过的节点——这正是归纳式的关键。

直推式对比

DeepWalk 是典型的“老门卫”。他的本事全在一本名册上:每一行写着「门禁卡号 → 人脸照片」。新住户刷门禁,名册里没有这个卡号,他就只能干瞪眼——就算新住户跟老住户长得再像、来往再密切,他也无从判断。

技术上看,DeepWalk 属于直推式(Transductive)学习:随机游走生成“节点序列语料”,用 skip-gram 训练,得到一张嵌入查找表,推理时用节点 ID 去查行。ID 没出现过,就查不到向量,只能重训整个模型。它学的不是规律,而是“每个节点专属的向量”。

| 对比维度 | DeepWalk(直推式) | GraphSAGE(归纳式) |

| --- | --- | --- |

| 学习对象 | 节点 ID → 向量查找表 | 特征 + 邻居 → 向量的映射函数 |

| 新节点嵌入 | 查无此人,需全图重训 | 一次前向传播即时生成 |

| 节点特征 | 基本不用 | 必需且关键 |

| 动态图适应 | 差,图变即失效 | 强,支持增量推理 |

| 跨图泛化 | 无 | 有 |

老门卫靠“记忆”吃饭,安保员靠“方法”吃饭。记忆的保质期取决于名册更新的速度,而方法永远可以应对“今天搬来的新人”——这是两者最本质的分水岭。在做技术选型时,只要你的图会持续长出“新人”,直推式的重训成本就会把你拖垮,归纳式才是长久之计。

泛化与迁移

聪明的物业经理发现,安保员在 A 小区学会的识人心法,完全可以带到他新接管的 B 小区:虽然 B 小区一个人他都不认识,但他知道“爱遛狗的人往往和养狗的人走得近”“夜跑的人通常有固定跑友圈”这类规律。

技术根源在于:GraphSAGE 学到的聚合函数参数,只依赖于“特征维度”和“图结构的一般规律”,不依赖任何具体的节点 ID。于是模型具备跨图迁移能力——在一个图上完成训练,部署到另一个图上,就能为对方的节点直接生成嵌入。这对工业界意味着巨大的复用价值:一个训练好的模型,可以服务多个业务线。

这种泛化能力来自模型的归纳偏置(Inductive Bias):它假设“节点的角色由自身特征和邻居结构决定”。只要这个假设在新图上成立,迁移就有效。因此特征工程变得格外重要——特征质量差,聚合函数再强也是“巧妇难为无米之炊”。比如社交网络中,如果只给用户 ID 而不给年龄、兴趣、地域特征,安保员就失去了“外貌”,只能靠社交圈猜。

买一套安保系统,全城小区共用——归纳式模型本质上是可复用的“方法论资产”,而不是一次性的“住户档案”。这正是它相比直推式在工程上最有想象力的地方。

动态图应用

小区每天都在变:有人搬走、有人搬来、新的友谊不断产生。图数据也一样,节点和边随时间演化。面对这种“动态图”,静态名册式的嵌入方案会不断失效,而归纳式的整套流程可以随到随算。

社交网络是最典型的战场。新用户注册时只有手机号、通讯录和几个勾选的兴趣标签,没有任何行为数据——这是标准的冷启动。GraphSAGE 的做法是:把通讯录匹配出的好友当作邻居、注册信息当作特征,一次前向传播生成嵌入,立刻计算“你可能认识的人”,推荐延时从“重训几天”降到“毫秒级”。

电商推荐系统同样受益:新商品没有点击和购买记录,协同过滤束手无策,但把它放进“商品-类目-店铺-用户”的异构图,用类目特征加同店邻居聚合出嵌入,立刻就能进召回池。金融风控则是另一个高价值场景:新账户突然出现,GraphSAGE 聚合其交易对手的特征,与已知欺诈圈子做距离对比,秒级识别可疑账户,不必等它积累足够多的历史行为。

动态图时代需要的不是“重拍全家福”,而是“随到随算的现场服务”。增量推理把成本从“全图规模”压缩到“新节点 K 跳邻居范围”,这是工程能落地的前提。

采样聚合机制

安保员永远不会挨家挨户问遍全小区——那太慢了。他通常随机抽几个关键联系人,就足以形成判断。GraphSAGE 也是一样,用固定大小的邻居采样来控制成本,把每个节点的计算开销从“跟随度数爆炸”变成“恒定常数”。

具体做法是:对每个节点,有放回地均匀采样固定数量(比如 25)的邻居。有放回保证了小度数的节点也能采满。聚合函数有几种“问法”:均值聚合(Mean)简单稳定,把邻居向量逐维取平均:

池化聚合(Pooling)先让每个邻居过一层 MLP,再取最大或平均,擅长筛选“最强信号”;LSTM 聚合把采样邻居当随机序列处理,表达能力更强但更重。无监督训练使用负采样损失,让相邻节点的嵌入相似、随机负样本的嵌入疏远:

“抽样问邻居、聚合出结论、负采样拉距离”——这套机制保证了两点:一是算得动(复杂度可控),二是用得上(嵌入真的能反映圈子远近)。

AGGmean=1∣N(v)∣∑u∈N(v)hu(k−1)\mathrm{AGG}_{\mathrm{mean}} = \frac{1}{|N(v)|}\sum_{u \in N(v)} h_u^{(k-1)}
  1. $J_G(z_u)$(总损失)衡量节点 $u$ 嵌入质量的标量,值越小越好。
  2. $z_u^\top z_v$(内积相似度)两个嵌入做内积,值越大表示越相似。
  3. $\sigma(\cdot)$(Sigmoid 函数)把相似度压到 0 到 1 之间,便于按“概率”理解。
  4. 第一项(正样本项)让相邻节点 $u,v$ 的相似度尽量高——“好友的画像要接近”。
  5. $Q$(负样本数量)每个正样本配 $Q$ 个负样本,通常取 5 到 20。
  6. $\mathbb{E}_{v_n \sim P_n(v)}$(负采样期望)从噪声分布随机抽 $Q$ 个不相邻节点,期望它们的相似度尽量低——“陌生人的画像要疏远”。

工程落地实践

真正把安保系统部署到小区,要分清两个阶段:白天培训(离线训练)学习识人心法,上岗执勤(在线推理)时心法已经固定,对每个新人走一遍问询流程即可。

工程上,GraphSAGE 的训练阶段在离线集群完成:采样、聚合、反向传播,学出各层权重。推理阶段,新节点到达时只需:取特征 → 采样邻居 → 逐层聚合 → 输出嵌入。这个前向传播只触碰新节点 K 跳以内的邻居,复杂度 O(K·S)——S 是采样数,K 是层数,与全图规模完全无关。这意味着即使图里有一亿个节点,处理一个新节点的成本也恒定。

性能上需要平衡几个旋钮:采样数 S 越大信息越全但越贵,论文常用 25;层数 K 决定感受野,K=2 通常够用,太大反而有过平滑风险,让所有嵌入趋于相同;嵌入维度 d 折中表达力与存储。工程上还有一个实用技巧:老节点的嵌入不会变,可以提前算好缓存;只有新节点需要现场计算。这样推理服务的吞吐量大幅提升。

“缓存老住户、现算新住户”——这套架构让物业既省电又高效。GraphSAGE 的工程落地,本质上就是把归纳式的思想翻译成一条“离线训练 + 在线增量”的流水线。

AI 应用场景

社交网络新用户冷启动推荐

阶段:模型推理 / 增量学习

解决的问题:传统协同过滤依赖用户行为矩阵,新用户零行为导致推荐系统“空转”;直推式图嵌入也因名册里没有新用户而失效。GraphSAGE 用注册画像当特征、通讯录匹配的好友当邻居,一次前向传播生成嵌入,把“等行为积累”变成“秒级冷启动”。

具体案例:微信“你可能认识的人”背后就有类似思路——新用户授权通讯录后,系统立即把他与通讯录好友建边,结合注册时选的兴趣标签,GraphSAGE 前向传播产出嵌入,TopK 相似度推荐即刻返回,无需等待任何历史行为。

电商平台新商品冷启动召回

阶段:特征工程 + 模型推理

解决的问题:新上架商品没有点击、加购、购买记录,协同过滤无法计算相似商品。把商品放进“商品-类目-店铺-品牌”异构图中,用类目特征加同店、同款邻居聚合出嵌入,新商品立刻拥有与其他商品的相似度,可直接进入召回池参与排序。

具体案例:某跨境电商每日上架数万新品,接入归纳式嵌入后,新品从“无推荐位”变为“进召回池被曝光”,冷启动期点击率提升约 35%,且模型每月只增量更新一次权重,不必每天全图重训。

金融风控新账户欺诈识别

阶段:在线推理 / 实时风控

解决的问题:欺诈账户常“突然出现”,直推式模型对陌生节点没有嵌入,只能等行为积累,往往为时已晚。GraphSAGE 对新账户聚合其交易对手(收款方、转账方)的历史画像特征,与已知欺诈社区嵌入比对距离,秒级给出风险分。

具体案例:某支付平台对“新注册 + 立即大额转账”的账户,用 GraphSAGE 聚合其对手方特征并计算与黑样本聚类中心的距离,识别准确率较传统规则提升 28%,单笔推理耗时小于 10 毫秒。

Python 演示

python68 行
import numpy as np  class MiniGraphSAGE:    """迷你版 GraphSAGE:用均值聚合为任意节点生成嵌入    注释说明:为聚焦归纳式推理演示,权重直接初始化。    实际工程中权重由离线训练得到,此处省略训练细节。"""     def __init__(self, dim=4, depth=2):        self.dim = dim        self.depth = depth        # 每层权重矩阵:拼接自身与聚合结果后做线性变换        self.W = [0.2 * np.random.randn(dim, dim * 2) for _ in range(depth)]     def sample_neighbors(self, adj, node, k=3):        nbrs = list(adj[node])        if not nbrs:            return []        picks = np.random.randint(0, len(nbrs), size=k)        return [nbrs[i] for i in picks]     def aggregate_mean(self, feats, ids):        if not ids:            return np.zeros(self.dim)        return np.mean([feats[i] for i in ids], axis=0)     def forward(self, feats, adj, node):        """归纳式前向:任意节点(含新增)一次传播即得嵌入"""        h = {i: feats[i] for i in range(len(feats))}        for k in range(self.depth):            h_next = {}            for n in range(len(feats)):                agg = self.aggregate_mean(h, self.sample_neighbors(adj, n))                h_next[n] = np.tanh(self.W[k] @ np.concatenate([h[n], agg]))            h = h_next        return h[node]  def add_new_user(feats, adj, new_feat, friends):    idx = len(feats)    feats = np.vstack([feats, new_feat.reshape(1, -1)])    adj[idx] = friends    for f in friends:        adj[f].append(idx)    return feats, adj, idx  if __name__ == '__main__':    # 已有 5 位用户的画像特征与好友关系    feats = np.array([        [0.9, 0.1, 0.7, 0.2],        [0.3, 0.8, 0.6, 0.9],        [0.8, 0.2, 0.4, 0.3],        [0.4, 0.7, 0.9, 0.8],        [0.6, 0.9, 0.3, 0.7],    ])    adj = {0: [1, 2], 1: [0, 3, 4], 2: [0, 3], 3: [1, 2, 4], 4: [1, 3]}     model = MiniGraphSAGE()    # 新用户小新:特征偏运动风格,好友连到 1 号与 4 号    feats, adj, new_id = add_new_user(        feats, adj,        new_feat=np.array([0.7, 0.5, 0.8, 0.4]),        friends=[1, 4],    )    emb = model.forward(feats, adj, new_id)    print('新用户嵌入向量:', np.round(emb, 3))    print('无需重训,模型直接完成冷启动推理')
目的:用 NumPy 实现迷你版 GraphSAGE 的前向推理,演示新节点加入动态图后如何通过采样邻居、均值聚合、逐层变换生成嵌入。
  1. self.W = [0.2 * np.random.randn(dim, dim * 2) for _ in range(depth)]初始化每层权重,实际工程中这组“识人心法”由离线训练学得。
  2. def sample_neighbors(self, adj, node, k=3)固定大小有放回采样,把计算成本控制在常数范围。
  3. def aggregate_mean(self, feats, ids)均值聚合函数,把邻居特征汇成“一句话”。
  4. h_next[n] = np.tanh(self.W[k] @ np.concatenate([h[n], agg]))拼接自身与邻居总结,做线性变换加激活。
  5. for n in range(len(feats)):对新旧节点一视同仁地走前向,这正是归纳式的核心。
  6. adj[idx] = friends; for f in friends: adj[f].append(idx)模拟动态图的新增节点与新增边。
  7. emb = model.forward(feats, adj, new_id)一次前向传播即为新节点生成嵌入,无需重训。

常见误区

误区“既然 GraphSAGE 能直接处理新节点,那模型是不是根本不需要训练?拿到图就能用?”

正解恰恰相反。GraphSAGE 的聚合函数和各层权重 $W^{(k)}$ 必须在训练图上通过反向传播学习出来。归纳式说的是“推理阶段对新节点免训”,不是“训练阶段免学”。就像安保员上岗前必须经过培训,只是他学会的是“识人方法”而非“背诵名单”。

为何常见:把“新节点免重训”错误地推广到“整个模型免训练”,混淆了训练与推理两个阶段。

误区“给新用户找一个最像的老用户,把他的嵌入复制过来不就行了?”

正解复制是“伪归纳”:它丢掉了新用户自身的特征,也没有真正利用邻居结构,更无法解释为什么相似。GraphSAGE 是用聚合函数把特征和邻居信息实时计算出来,每个嵌入都是“现场推导”的结果,可解释、可迁移。

为何常见:人类直觉喜欢用“找相似案例”来类比,而忽略模型学的是函数映射而不是案例库。

误区“既然聚合是利用邻居信息,那把所有邻居都聚进来肯定最准。”

正解真实图中节点度数差异极大,全量邻居会带来内存与计算的双重爆炸,且大量低质量邻居会稀释信号。GraphSAGE 用固定大小(如 25)的有放回采样,实验表明与全量聚合的效果差距很小,却换来恒定的计算开销。

为何常见:直觉认为“信息越多越好”,忽略了计算复杂度的硬约束和邻居噪声问题。

误区“归纳式就是给动态图设计的,静态图用 DeepWalk 就够了。”

正解归纳式是一种学习范式,静态图同样可以使用 GraphSAGE,而且它比直推式多出跨图迁移的能力——在 A 图训练、到 B 图部署。动态图只是最能发挥其优势的场景,不是它的功能边界。

为何常见:把“典型应用场景”误当成“能力边界”,忽略了范式本身的通用性。

误区“GCN 和 GraphSAGE 都是聚合邻居的图神经网络,差不多吧?”

正解关键差别在“归纳 vs 直推”。GCN 依赖全图归一化拉普拉斯矩阵,权重与具体图结构绑定,图变了要重训;GraphSAGE 通过采样加聚合函数把结构信息“参数化”进函数里,图变了不必重训。GCN 更接近“全体住户的合影”,GraphSAGE 则是“可迁移的识人模式”。

为何常见:两者网络结构相似,都做邻居聚合,容易忽略“归纳 / 直推”这一本质上的学习范式差异。

面试题

Q1. 关于直推式学习方法,以下哪项描述最准确?

单选题 · easy

  • A.只为训练时见过的节点生成嵌入← 正确答案
  • B.可为任意新节点即时生成嵌入
  • C.完全不需要学习任何参数
  • D.只能适用于无向图结构

答案:A。直推式把嵌入存成“节点 ID → 向量”的查找表,只有训练见过的 ID 才能取出向量,新节点在表里查无此人。B 是归纳式的特点;C 错误,直推式同样要训练;D 与有向无向无关。就像老门卫名册里没有的人,他永远认不出来。

Q2. GraphSAGE 与 DeepWalk 最本质的区别是什么?

单选题 · easy

  • A.不再使用随机游走策略
  • B.学习聚合函数而非节点查找表← 正确答案
  • C.只适用于动态变化的图结构
  • D.完全不需要节点特征信息

答案:B。DeepWalk 把节点 ID 映射为向量,本质是“背名册”;GraphSAGE 学习从“特征+邻居结构”到向量的聚合函数,新节点也能算。A 中 GraphSAGE 也做采样但不是本质;C 错,静态图同样可用;D 错,它必须吃节点特征。核心差异是“学查找表还是学映射函数”。

Q3. 新用户冷启动场景中,GraphSAGE 的最大优势是什么?

单选题 · mid

  • A.直接克隆相似老用户的嵌入向量
  • B.需要等社区结构稳定后再推断
  • C.无需重训即可生成新节点嵌入← 正确答案
  • D.遍历存储全部历史路径求相似

答案:C。新用户一到,拿特征和邻居做一次前向传播就得到嵌入,模型参数完全不用更新。A 是伪归纳,丢失用户自身信息;B 与实时性矛盾;D 是暴力法,复杂度不可接受。类比:安保员现场问几句话就出画像,而不是翻遍全小区旧档案。

Q4. GraphSAGE 支持的聚合函数包括以下哪些?

多选题 · mid

  • A.均值聚合(Mean)← 正确答案
  • B.池化聚合(Pooling)← 正确答案
  • C.LSTM 聚合(RNN)← 正确答案
  • D.哈希聚合(Hash)

答案:ABC。原文给出 Mean、Pooling(max/mean)、LSTM 三种聚合器,分别对应“平均看法”“筛选最强信号”“按序列理解”。哈希聚合是工程上压缩高维向量的技巧,并非 GraphSAGE 定义的聚合函数。三种聚合在实验中各有优劣,Pooling 通常表现稳定。

Q5. GraphSAGE 对邻居做固定大小有放回采样,主要目的是什么?

单选题 · mid

  • A.保证嵌入结果唯一确定
  • B.避免训练出现梯度消失
  • C.提升节点特征稀疏程度
  • D.控制计算复杂度和内存← 正确答案

答案:D。真实图中节点度数差异巨大,全量聚合会让内存与计算按度数爆炸。固定采样(如 25)把每个节点的开销限制为常数,有放回保证小度数节点也能取满。A、B、C 都不是采样动机。像门卫只抽查三个关键联系人,而不是挨家挨户问全楼。

Q6. 关于 GraphSAGE 的跨图迁移,下列说法正确的是?

多选题 · hard

  • A.训练好的聚合函数可部署到新图← 正确答案
  • B.新图节点的特征维度必须一致← 正确答案
  • C.两图节点数量必须完全相同
  • D.新图必须包含训练图的全部节点

答案:AB。聚合函数的输入是特征向量,参数不绑定任何具体节点 ID,因此能整体搬迁到新图;但输入维度由特征决定,维度不同则模型结构不兼容。节点数量无关(这正是归纳式的意义),也不要求新图包含旧节点。就像安保员的心法可以带去任何小区,前提是“看人”的维度一致。

Q7. 归纳式与直推式学习的核心差异在于什么?

单选题 · mid

  • A.是否使用随机梯度下降优化
  • B.训练数据是否需要人工标注
  • C.学习映射函数还是节点查找表← 正确答案
  • D.模型参数量是否保持不变

答案:C。直推式学的是“每个节点专属的嵌入向量”(查找表),归纳式学的是“从特征与邻居到嵌入的映射函数”。新节点对前者不可见,对后者一视同仁。A、D 与学习范式无关,B 两者都可以有监督或无监督训练。

Q8. 在动态图增量推理中,为新节点生成嵌入的正确流程是什么?

单选题 · extreme

  • A.一次前向传播聚合其邻居信息← 正确答案
  • B.重新随机游走全图所有节点
  • C.对邻接矩阵重新做特征分解
  • D.直接复用最近邻节点的全部参数

答案:A。新节点只需走一遍训练好的聚合网络:采样其 K 跳内邻居、逐层聚合,复杂度 O(K·S) 与全图规模无关。B、C 都是全图级重算,违背“增量”的初衷;D 是复制粘贴,没有真正计算。这正是“只问几个邻居就出画像”的工程体现。

Q9. 关于图嵌入中“相似节点向量相近”,正确的理解是什么?

单选题 · easy

  • A.节点编号相邻则向量必然相同
  • B.特征结构相似则向量距离小← 正确答案
  • C.向量维度必须等于节点总数
  • D.嵌入向量无法用于下游分类

答案:B。图嵌入的设计目标就是让“特征相近、结构相近”的节点在向量空间距离更近,从而支持相似度计算、分类等下游任务。A 与编号无关;C 维度是超参数,通常远小于节点数;D 错误,嵌入正是为下游任务服务的。

Q10. 以下哪些场景更适合使用 GraphSAGE 归纳式方案?

多选题 · hard

  • A.新用户注册后的好友推荐← 正确答案
  • B.新商品上架后的曝光推荐← 正确答案
  • C.静态论文引用网络离线分析
  • D.图结构固定不变的历史数据

答案:AB。A、B 都面临“新节点源源不断”的冷启动问题,需要立刻生成嵌入,正是归纳式的舞台。C、D 图基本不变,用直推式 DeepWalk 已经足够,没必要引入采样聚合的额外复杂度。选型判断标准很简单:图是否会持续长出“新人”。