第2章 GraphSAGE 背景与原理归纳总结

说到图神经网络,其实最早大家用的都是 GCN(图卷积网络)。GCN 的思路很直接——把整张图塞进去,算一个全局的拉普拉斯矩阵,然后做卷积。听起来挺漂亮,对吧?但我第一次在实际项目中用 GCN 时,就碰了一鼻子灰。

为什么?因为大部分业务场景的图是动态的。用户今天加了个好友,明天新注册了一个节点,图的结构一直在变。GCN 是直推式学习,训练时必须看到全部节点,新节点来了就得重新训练。我当时的项目里,线上每天新增十几万用户,重新训练一次要跑四五个小时——这谁受得了?

所以后来 GraphSAGE 出来的时候,我眼睛一亮。它解决了那个最要命的问题:不用看到全图也能做推理。

2.1 GraphSAGE 的核心思想

GraphSAGE 的全称是「Graph SAmple and aggreGatE」。名字已经说得很明白了:采样 + 聚合。

它不再需要整张图的结构信息,而是对每个目标节点,只采样它的邻居节点,然后把这些邻居的特征通过某种聚合函数融合起来,更新目标节点的表示。这叫归纳式学习,说白了就是:模型学会的是「怎么聚合邻居信息」这个能力,而不只是记住某个节点的位置。

我习惯用一个比喻来理解:好比你要了解一个人,不用认识他所有的朋友,只随机抽几个聊一聊,然后综合他们的评价,就能大致判断这个人的特点。GraphSAGE 就是这样干的。

关键区别:GCN 是转导式学习,需要全图结构和所有节点特征参与训练;GraphSAGE 是归纳式学习,训练集和测试集可以来自不同的图结构。

特性 GCN GraphSAGE
学习方式 转导式(Transductive) 归纳式(Inductive)
训练数据要求 需全图结构 只需局部子图(采样)
对新节点预测 需要重新训练 直接预测,不需重训
内存开销 全图拉普拉斯矩阵,大图容易 OOM 按 batch 采样,可控

我曾经在十亿量级的社交网络图上跑 GCN,直接炸了内存,连服务器都被拖死。后来换成 GraphSAGE 的分批采样,一台 64G 内存的机器就搞定了。嗯,这个坑你们不用再踩了。

2.2 采样与聚合流程

先看一个最基础的流程:

  1. 采样邻居:对每个目标节点,从它的1阶邻居里固定采样K个节点(如果邻居不够就重复采样,超过就随机截取)。
  2. 特征聚合:把这些邻居的当前层特征,通过一个聚合函数(比如 Mean、Pool、LSTM)合并成一个向量。
  3. 更新表示:将聚合的邻居特征与目标节点自身的特征拼接(或求和),再经过一层非线性变换,得到新的一层表示。
  4. 多层递归:重复上述过程,可以扩展到2阶、3阶邻居。一般2阶就够用了。

你看,这个逻辑非常简单。但为什么它效果好?因为采样 + 聚合实际上做了一次局部结构信息的编码,而且因为采样是随机的,模型有了一定的鲁棒性——即使邻居结构有小变化,输出也不会剧烈抖动。

GraphSAGE 采样与聚合流程图 目标节点 v 采样邻居1 采样邻居2 采样邻居3 采样邻居4 聚合函数(Mean/Pool/LSTM) 拼接 + 非线性变换 新表示 h' 固定采样数K,控制计算图大小 避免指数级爆炸

技巧:我项目里通常把采样数K设为10~25之间。再大效果提升不明显,但显存占用会翻倍。工业场景2层就足够了。

2.3 三种聚合函数

GraphSAGE 的论文里给出了三种聚合方式,我来聊聊它们各自的特点和适用场景。

  • Mean Aggregator:把邻居特征的每个维度取均值。最简单,也最稳定。我推荐初学者先试这个,因为效果不差,还不容易过拟合。
  • Pool Aggregator:对每个邻居的特征过一层 MLP,然后做 element-wise max pooling。它能学到非线性组合,表达能力更强,但参数量也大。我记得有一次在商品推荐图上,Pool 比 Mean 提升了3个百分点的 AUC,但训练时间多了30%。
  • LSTM Aggregator:对邻居序列(随机排序)做 LSTM。理论上能捕捉邻居之间的顺序关系,但图没有天然顺序,所以需要随机打乱。我个人很少用 LSTM,因为计算太慢,且效果并没有显著优于 Pool。
聚合器 优点 缺点 推荐场景
Mean 速度快,参数少,鲁棒 丢失部分非线性关系 大图、快速原型
Pool (Max) 表达能力中等,效果稳定 训练稍慢 中等规模,追求精度
LSTM 理论容量大 慢,需打乱顺序,易过拟合 小众,不推荐生产

我曾经在一个风控数据集上对比过三种聚合器。最终生产上线用的是 Mean,原因是线上延迟要求20ms以内,Mean 不需要额外 MLP 计算,推理快了一倍。所以,别只看论文号,还得看你的业务场景。

2.4 为什么 GraphSAGE 适合变量衍生

这和我们课程的主题直接相关。图上的节点特征可以看作我们已有的字段,而 GraphSAGE 通过聚合邻居信息,产生了新的特征——这不就是「变量衍生」吗?只不过传统方法靠人工组合、统计聚合,现在用图神经网络自动学习。

举个例子,在信贷风控场景里,每个用户是一个节点,他们之间的转账关系是边。我们可以把用户的年龄、收入、负债率作为初始特征。通过 GraphSAGE 聚合邻居信息后,模型自动学到了「你的转账对象平均负债率」这种高阶特征。这在传统特征工程里需要手动写 SQL 统计,而现在一步到位。

注意坑:GraphSAGE 虽然能自动衍生特征,但不意味着特征就比人工特征好。我遇到过几次负优化:当图结构噪音很大(比如随机添加的好友关系)时,聚合出来的特征反而干扰模型。一定要先用 EDA 确认图的信号质量。

嗯,这一章先到这里。GraphSAGE 的原理并不复杂,但要真正用好,得多关注采样策略和聚合函数的选择。下一部分我们会进入实操,把今天讲的这些用代码跑一遍。