中文精炼导读

核心观点

  • 这篇 Distill 交互式图解文章是图神经网络(GNN)的温和入门:从"什么是图、什么样的数据最适合用图表示"讲起,逐步搭建一个现代 GNN,并提供可交互的 playground 让读者亲手体会每个组件的贡献。
  • 图由节点与边组成,可以在节点、边乃至整个图上存储标量或嵌入信息,还可以给边指定方向(有向/无向);图是极其灵活的数据结构——甚至图像(每个像素是节点、与相邻像素连边)和文本(每个 token 是节点、连向后一个 token)都可以看成图。
  • 真实世界的图数据(分子、社交网络、引文网络、场景图、数据流图)与图像/文本不同:邻居数量是可变的,很难用其他方式表达;图数据在节点数、边数和连通性上差异巨大。
  • 图上的预测任务分三类:图级(预测整图属性)、节点级(预测每个节点属性)、边级(预测边是否存在或其属性);现代 GNN 的核心是消息传递(message passing)——每层把邻居节点的信息聚合到自身,通过多层传递让信息在图内扩散。
  • 基于真实任务(分子气味预测)的经验教训:参数量与性能正相关、GNN 是参数高效的模型(几千参数就能表现不错)、更高维表示提升均值与下界、但"层数越多越好"并不成立——最佳模型通常是两层,层数过多会把节点表示"稀释"掉。
GNN 全景示意
GNN 全景示意

内容精讲

文章开篇用一句话概括主题:图无处不在,现实世界的对象往往由它们与其他事物的连接来定义;一组对象加上它们之间的连接,自然就表达为一个图。研究者开发在图数据上运作的神经网络(GNN)已超过十年,近期发展与表达力的提升让它们开始在抗菌药物发现、物理模拟、假新闻检测、流量预测与推荐系统等实际场景落地。全文分四部分:先看什么数据最适合用图表达,再看图与其他数据的不同、以及使用图时要做哪些专门选择,然后从历史建模创新出发、从最简实现逐步走到 SOTA 的 GNN,最后提供一个 playground 让读者在真实任务上亲手实验。

第一部分是"图是什么、去哪找"。三种图属性:节点、边与全局(整个图的)属性,都可以存标量或嵌入。边可以是有向的(信息从源节点流向目标节点)或无向的(两个方向都流,一条无向边等价于两条相反的有向边)。两个反直觉的例子说明了图的通用性:图像可以看作规则结构的图——每个像素是节点、通过边与相邻像素连接(非边界像素恰有 8 个邻居、存 RGB 三维向量);文本可以数字化成字符/词/token 序列,每个索引是节点、通过边连向后一个——这形成一个简单有向图。当然实践中并不这样编码图像和文本(这些图表示是冗余的:图像的邻接矩阵呈带状、文本的邻接矩阵是一条对角线),但通过它们能建立对图结构的直觉。更异构的真实图数据包括:分子图(原子是节点、共价键是边——香茅醛、咖啡因的 3D 结构、邻接矩阵与图表示三视图对照)、社交网络(人/角色是节点、关系是边,如《奥赛罗》剧本的角色互动、空手道俱乐部的人际关系)、引文网络(论文是节点、引用是有向边、节点可存摘要的词嵌入)、以及其他例子(视觉场景中对象与关系、机器学习模型/代码/数学公式可表达为数据流图)。

第二部分是"图上的任务类型":图级任务(预测整图属性)、节点级任务(预测每个节点的属性)、边级任务(预测边是否存在或其属性)。文章随后进入 GNN 构建,核心是消息传递层。在更新节点嵌入时,要从邻居节点收集信息(聚合);真实图数据中邻居数量不固定,这与图像/文本的固定邻域不同。为了也利用边信息,可以学习"边空间到节点空间"的线性映射、或把边信息与节点信息拼接后一起过更新函数;更新节点与边的先后顺序(先节点后边、先边后节点、或"编织"式的四路更新)是 GNN 设计中的开放研究问题。

一个关键缺陷引出了全局表示:图中相距很远的节点可能永远无法高效传递信息——k 层消息传递最多传播 k 步。虽然可以加"虚拟边"让所有节点互联,但大图上计算成本过高(该方法只在小图如分子上用过)。解决方案是给图加一个全局表示 U(也叫 master node 或 context vector):它连接到网络中所有节点与边,充当它们之间的信息桥梁,逐步构建整图的表示,让远距离信息也能流动。这构成了 Graph Nets 架构:所有图属性(节点、边、全局)都有学习表示,池化时可以"用其余信息来调节感兴趣的属性"——例如更新某节点时,把相邻节点、相邻边和全局信息拼接(或线性映射到同一空间后相加,或用特征级调制层做注意力式调节)。

最后是 GNN playground 与经验教训。playground 用图级预测任务:Leffingwell 气味数据集——预测分子结构(图)是否"刺鼻"(pungent),这是横跨化学、物理、神经科学与机器学习、约百年的老问题;分子表示为图(原子节点是 C/N/O/F 的 one-hot、键边是单/双/三/芳香键的 one-hot),模型模板是顺序 GNN 层 + 带 sigmoid 的线性分类头,可用"深度、各属性维度、聚合函数(max/mean/sum)、更新的图属性(消息传递风格)"这些开关自由定制;还能看倒数第二层激活(graph embeddings)经 PCA 降到 2D 的决策边界可视化。跨大量架构的实验给出几条经验:更高的参数量确实与更高性能相关,GNN 是参数高效的模型(约 3k 参数就能找到高性能模型);更高维的表示有更好的均值与下界,但最好成绩并不在高维一侧;层数方面,均值随层数增加而提升,但最好的模型是两层而非三或四层,且四层时性能下界下降——因为层数多的 GNN 会把信息广播到更远距离、经过多次迭代后节点表示容易被"稀释"。聚合函数的选择则取决于数据。这些经验恰恰提醒读者:GNN 的设计选择没有放之四海皆准的答案,需要针对数据与任务实验验证。

阅读价值

适合完全没接触过图神经网络、想建立直观理解的读者(包括对图论陌生的工程师与产品人):文章用图像/文本"居然也是图"的例子降低门槛,从图级/节点级/边级任务讲到消息传递、全局表示与池化,最后用交互式 playground 把"参数高效、层数并非越多越好"等经验变成可亲手验证的直觉;与配套的《Understanding Convolutions on Graphs》合读,就能把 GNN 的构建模块与设计取舍掌握完整。

阅读英文原文 → 返回 AI 技术文档

本文为中文精炼导读,由 AI 基于原文整理,内容与图片版权归原作者所有。原文: https://distill.pub/2021/gnn-intro