第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阶邻居里固定采样K个节点(如果邻居不够就重复采样,超过就随机截取)。
- 特征聚合:把这些邻居的当前层特征,通过一个聚合函数(比如 Mean、Pool、LSTM)合并成一个向量。
- 更新表示:将聚合的邻居特征与目标节点自身的特征拼接(或求和),再经过一层非线性变换,得到新的一层表示。
- 多层递归:重复上述过程,可以扩展到2阶、3阶邻居。一般2阶就够用了。
你看,这个逻辑非常简单。但为什么它效果好?因为采样 + 聚合实际上做了一次局部结构信息的编码,而且因为采样是随机的,模型有了一定的鲁棒性——即使邻居结构有小变化,输出也不会剧烈抖动。
技巧:我项目里通常把采样数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 的原理并不复杂,但要真正用好,得多关注采样策略和聚合函数的选择。下一部分我们会进入实操,把今天讲的这些用代码跑一遍。