1. 图神经网络概述:深度学习与图数据的交汇
1.1 从深度学习到图数据:为什么要学 GNN?
深度学习这些年横扫了图像、语音、文本。但**图数据**是个例外——社交关系、分子结构、知识图谱,这些数据天生就不是规整的网格或序列。你用 CNN 或 RNN 去处理图,就像拿梳子去梳一团乱麻,根本使不上劲。
我最早接触 GNN,是因为一个推荐系统项目。用户和商品之间是交互关系,天然就是图。我当时尝试把用户向量拼接后扔进 MLP,效果惨不忍睹。后来换成图神经网络,第一次跑通时,AUC 直接涨了 5 个点。说白了,图数据需要图专用的神经网络,这就是 GNN 存在的理由。
你可能会问:为什么不直接提取特征,比如用图论指标(度、聚类系数)喂给传统模型?嗯,可以,但人工特征有限,而且丢失了图的结构信息。GNN 能自动学习节点、边甚至全图的表示,这才是真正的端到端。
1.2 图论基础回顾
别慌,我带你快速过一遍。图论在大学可能学过,但这里只捡 GNN 最常用的概念讲。
- 节点:图里的基本单元,比如用户、原子、论文。
- 边:节点之间的连接,可以是无向/有向、加权/无权。
- 邻接矩阵 A:
n×n矩阵,A[i][j]=1表示 i 和 j 有边。我记得第一次处理百万节点图时,A 直接占了几个 G 内存,不得不换稀疏格式。 - 度矩阵 D:对角矩阵,
D[i][i] = sum(A[i])。 - 特征矩阵 X:
n×d,每个节点有 d 维特征,比如用户年龄、性别。
为了让你直观理解,我整理了一张表,对比图、图像和序列数据:
| 数据形式 | 结构 | 传统模型 | GNN 的优势 |
|---|---|---|---|
| 图像 | 欧几里得网格 | CNN | 不需要,因为 CNN 已经自带局部感受野 |
| 文本/序列 | 线性排列 | RNN / Transformer | 图有分支,序列模型处理不了环 |
| 社交网络/分子 | 任意拓扑 | 手工特征 + MLP | 自动学习邻居聚合,适应不同结构 |
1.3 GNN 的核心思想:消息传递
GNN 为什么能工作?因为它反复做一件事——消息传递。每个节点汇集邻居的信息,更新自己的表示,多次迭代后全图信息交融。
你可以把它想象成一个“八卦扩散”过程:每个人听听隔壁邻居说了啥,再结合自己的信息更新一下,几轮后整个社区都知道发生了什么。我曾经把消息传递层数从 2 层加到 5 层,结果节点表示过于平滑,所有节点变得一模一样——这就是著名的“过平滑”问题。后面我会专门讲怎么躲坑。
消息传递的伪代码大致是这样:
for each layer in L:
for each node v:
# 聚合邻居消息
m_v = aggregate({h_u for u in N(v)})
# 更新节点表示
h_v = update(h_v, m_v)
实际实现中,aggregate 可以是 sum、mean、max 或更复杂的注意力机制;update 通常是一个 MLP + 非线性。别小看这简单循环,正是它支撑起了推荐、分子、社交等各类任务。
1.4 应用场景
我挑三个最典型的场景展开说说,你在课程后面会反复碰到。
推荐系统
用户和物品构成二部图。GNN 学习用户偏好和物品属性,再预测边(是否交互)。
- 协同过滤:只利用交互矩阵,GNN 做节点 Embedding。
- 社交推荐:加入用户好友关系,GNN 同时聚合社交邻居和物品邻居。
- 我参与过一个电商推荐,使用 LightGCN(一种简化 GCN),离线 HR@10 提升 8%,线上点击率升 12%。
分子性质预测
原子是节点,化学键是边。任务:预测分子是否有毒性、溶解性等。
- 图级别任务:整图分类或回归。
- GNN 自动从原子类型、键长等特征出发,揉合出分子指纹。
- 我曾经用 GIN(图同构网络)在 MoleculeNet 上做分类,比传统分子指纹(ECFP)准确率高 15 个百分点。注意:数据量小的时候 GNN 容易过拟合,我用了几何增强才压住。
社交网络分析
节点分类(预测用户兴趣)、链接预测(推荐好友)、社区检测。
- 比如预测某个用户是否会被广告转化,GNN 利用他的社交圈信息。
- 链接预测常用:编码器(GNN)输出节点嵌入,解码器(点积)预测边存在概率。
- 坑:正负样本极度不平衡。我一般用负采样 + 加权损失来训练。
下图把本章的知识脉络串起来,你可以当思维导图用:
这张图你看一遍就行:深度学习是底座,图数据和图论是输入基础,消息传递是引擎,最终落地三个场景。后面的章节会逐一深入每个技术细节。