Graph Neural Networks — 把关系网络交给神经网络来读
待复核日常类比:普通神经网络像只看每个人的简历,图神经网络像同时看简历和通讯录。它不只问“这个节点自己有什么特征”,还会问“它连着谁、这些邻居又连着谁”。
Graph Neural Networks(GNN)是一类在图结构数据上学习表示的方法。图由节点和边组成:节点可以是用户、商品、分子里的原子、论文、道路路口;边可以是关注、购买、化学键、引用、道路连接。
这篇综述的价值不是提出一个新模型,而是把 GNN 版图整理成一条设计流水线:先找图结构,再判断图类型和规模,再定训练目标,最后用传播、采样、池化等模块拼模型。
读这篇时可以把它当成“地图索引”:
- 想学模型,先看传播模块:GCN、GraphSAGE、GAT、MPNN 都在这里。
- 想做工程,先看采样模块和大图部分:它们解释为什么全量邻居不可行。
- 想找应用,先看结构化和非结构化场景:它们告诉你哪里真的需要图。
不理解这篇综述,下面这些事都很难解释:
- 为什么 CNN 在图片上好用,但搬到社交网络、分子、知识图谱上会卡住——图片是整齐网格,图的邻居数量和顺序都不固定。
- 为什么 GCN、GraphSAGE、GAT、MPNN 看起来名字很多,本质上却都在做“邻居消息聚合 + 节点状态更新”。
- 为什么同一个 GNN 不能无脑套所有任务——节点分类、边预测、图分类需要不同 readout 和 loss。
- 为什么工业图学习总绕不开采样——真实推荐图、社交图太大,完整邻居展开会爆内存。
GNN 的全局理解可以拆成 三件事:
-
先把问题翻译成图:类比做城市地图,先决定哪些地方算路口、哪些路线算道路。论文区分显式图和隐式图:分子天然是图,文本和图片往往要先构造词图、场景图或相似图。
-
消息传递是共同骨架:类比小区业主群,每户把自己的情况发给邻居,邻居汇总后更新判断。多数 GNN 层都可以看成“收邻居消息、聚合、更新自己”,差别在于聚合用平均、卷积、注意力还是门控循环。
-
模块化决定能不能落地:类比做饭不只看菜谱,还要看锅有多大、食材是否分批下锅。小图可以全量传播,大图要采样;节点任务直接读节点向量,图级任务还要池化成整张图的向量。
案例 1:节点分类,判断论文属于哪个领域
Section titled “案例 1:节点分类,判断论文属于哪个领域”for paper in papers: msgs = [neighbor.h for neighbor in paper.cited_by] paper.h = relu(W @ mean(msgs + [paper.h]))label = softmax(C @ target_paper.h)逐部分解释:
paper.cited_by是图里的邻居,表示引用或被引用关系。mean(msgs + [paper.h])把邻居信息和自己信息合在一起,避免只听别人、不看自己。softmax把最后的节点向量变成类别概率,比如“机器学习”“数据库”“网络”。
案例 2:图分类,判断一个分子是否有毒
Section titled “案例 2:图分类,判断一个分子是否有毒”for atom in molecule.atoms: atom.h = update(atom.feature, neighbor_messages(atom))mol_h = sum(atom.h for atom in molecule.atoms)toxicity = sigmoid(MLP(mol_h))逐部分解释:
- 原子是节点,化学键是边,GNN 先让每个原子吸收附近原子的信息。
sum(atom.h ...)是 readout,把一堆原子向量压成一个分子向量。toxicity是图级输出,回答的是整张图的问题,而不是某个单独节点的问题。
案例 3:推荐系统,预测用户会不会点商品
Section titled “案例 3:推荐系统,预测用户会不会点商品”user_h = aggregate(user.clicked_items)item_h = aggregate(item.similar_items)score = dot(user_h, item_h)逐部分解释:
- 用户和商品可以组成二部图,点击、收藏、购买都是边。
aggregate让用户向量吸收历史商品信息,也让商品向量吸收相似商品信息。dot越大,表示用户和商品在图中学到的兴趣关系越匹配。
-
把“有关系”都当成“该连边”:边一旦加入就会参与消息传播,噪声边会把错误信息扩散到很多节点。
-
以为层数越深越好:GNN 堆太深容易过平滑,节点向量会越来越像,最后分不出谁是谁。
-
忽略图的类型差异:有向图、异构图、动态图的边含义不同,直接当普通无向同构图会丢掉关键信息。
-
只看模型名字不看任务粒度:节点级、边级、图级任务的输出位置不同,loss 和 pooling 也必须跟着变。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 数据天然带关系:社交网络、引用网络、知识图谱、分子、交通路网。
- 关系比单点特征更关键:一个用户买什么,常常要看朋友、相似用户、相似商品。
- 需要在局部邻居中推理:欺诈检测、蛋白质相互作用、视觉场景关系、文本依存句法。
不适用:
- 数据没有稳定关系,硬造图只会引入噪声。
- 图太大但没有采样、缓存或分布式训练方案。
- 任务只依赖单条样本特征,普通 MLP、CNN、Transformer 已经足够。
- 需要严格可解释的规则系统,而模型只能给黑盒嵌入。
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 1990s:递归神经网络开始处理树和有向无环图,图学习还很像“结构化数据上的 RNN”。
- 2005–2009:Gori、Scarselli 等人提出早期 GNN,用迭代到收敛的方式更新节点状态。
- 2014–2016:DeepWalk、node2vec、LINE 让图嵌入流行起来,但多数方法给每个节点学独立向量,泛化到新节点较弱。
- 2016–2018:GCN、GraphSAGE、GAT、MPNN 把“卷积、采样、注意力、消息传递”几条线推到主流。
- 2018 之后:研究重心转向大图采样、异构图、动态图、表达力、鲁棒性和预训练。
- GNN 的核心不是某个公式,而是“节点通过边交换信息,再更新表示”的建模习惯。
- 设计 GNN 前先问四件事:图从哪来、图是什么类型、任务监督信号是什么、模型模块怎么拼。
- 谱方法和空间方法是图卷积两条主线;工程上更常见的是直接在邻居上聚合的空间方法。
- 综述把应用分成结构化场景和非结构化场景:前者图天然存在,后者要先把图片、文本等数据构造成图。
- 论文 PDF:Graph Neural Networks: A Review of Methods and Applications(适合作为 GNN 任务版图入口)
- gcn-2017 —— 图卷积入门代表,把邻居平均和线性变换做成一层网络
- graphsage-2017 —— 大图归纳学习代表,用采样和聚合处理新节点
- gin-2019 —— 从表达力角度解释普通 GNN 的理论上限
- graphormer-2021 —— Transformer 进入图学习后的代表模型,可对比消息传递路线
- pagerank-1998 —— 传统图算法入口,能帮助理解“沿边传播分数”的直觉
- gcn-2017 —— 综述中的经典图卷积模型,适合先学最小公式。
- graphsage-2017 —— 解决大图和新节点问题,是综述里空间聚合路线的重要节点。
- gin-2019 —— 回答“GNN 到底能区分多少图”,补上理论视角。
- graphormer-2021 —— 把图结构编码进 Transformer,可对比 GNN 与注意力模型。
- attention —— GAT 把注意力用在邻居权重上,离不开这个基础概念。
- pagerank-1998 —— 早期图传播思想,和 GNN 的消息扩散有共同直觉。
- simrank-2002 —— 从结构相似性理解图上节点之间的关系。
- desbrun-1999-implicit-fairing —— Desbrun 1999 — 把热扩散方程隐式离散到三角网
- hits-1999 —— HITS — 给网页同时打两个分:权威页 + 索引页
- pagerank-1998 —— PageRank — 用随机游走给整个网络的页面打分
- taubin-1995-mesh-smoothing —— Taubin 1995 — 把网格平滑当成低通滤波