简介:这是一份面向深度学习入门与进阶学习者的图神经网络系统课件,围绕GNN基础理论及其主流变体展开,适合需要补齐非欧式数据建模知识、准备课程汇报或科研入门的人群。内容从「为什么需要图神经网络」讲起,对比欧式与非欧式数据的差异,再深入图的基本概念、邻接矩阵与邻接列表的表示方式,以及聚合、更新、迭代的GNN流程。变体部分覆盖图卷积神经网络的空间域与频域两条路线,并延伸至DCNN、NN4G、MPNN、GAT、GAE与VGAE等模型,最后落到自然语言处理、计算机视觉、推荐系统和预测问题四类应用场景。资源包为1个pptx文件,约12.69MB,以图文并茂的幻灯片形式组织,目录按四大PART划分,便于按主题检索与课堂讲解。目前已有1581人学习,可作为梳理GNN知识脉络、理解模型演进逻辑的参考材料。
1. 从朋友圈到分子式:到底什么是图神经网络
你有没有想过,为什么微信能猜出你可能认识谁,短视频平台能精准推给你可能感兴趣的内容,甚至科学家能预测一种新药分子会不会有效?这些看似八竿子打不着的问题,背后其实共享着同一套底层逻辑——它们处理的数据都不是排得整整齐齐的表格或图片,而是一张张错综复杂的“关系网”。这种关系网,在数学上就叫“图”。而专门用来在这类关系网上做深度学习的算法,就是图神经网络,英文缩写GNN。
过去十年,深度学习在图像和文本上大杀四方,靠的是卷积神经网络(CNN)这类模型。但 CNN 有个隐含前提:数据得是“欧式空间”里的,像素排成规整的网格,邻居数量固定。可现实世界里大量数据是“非欧式”的——社交网络里每个人的好友数天差地别,化学分子里原子之间的连接方式千变万化。硬把 CNN 套上去,就像拿一把只能拧六角螺丝的扳手去拧四角螺丝,根本对不上。GNN 的出现,就是为了解决这个“对不上”的问题。它把深度学习的能力延伸到了图结构数据上,让机器能直接理解“谁和谁有关系”“关系有多强”。搞懂 GNN,你就拿到了理解推荐系统、知识图谱、药物发现等一大票前沿应用的钥匙。
2. 为什么非得有 GNN:传统神经网络的“翻车”现场
2.1 欧式数据与非欧式数据:一场关于“秩序”的分野
要理解 GNN 为什么存在,得先看清数据的两副面孔。一副面孔叫欧式数据,特点是节点排列有固定规则和顺序。比如一张 256x256 的图片,每个像素的位置是确定的,你把它上下翻转或左右平移,像素之间的相对关系依然有规律可循。CNN 之所以能横扫图像任务,就是因为它利用了这种“平移不变性”——不管猫出现在图片左上角还是右下角,同一个卷积核扫过去都能认出它。文本、音频也类似,都是排得整整齐齐的序列或网格。
另一副面孔叫非欧式数据,它完全不讲这套秩序。节点没有固定顺序,连接关系是动态的、多模态的。你随便挑一个节点,它的邻居数量可能是一个,也可能是十万个。知识图谱、社交网络、化学分子结构、蛋白质相互作用网,全是这类数据。它们用图结构来表示,表现能力极强,但传统神经网络看了直摇头。
注意:非欧式数据不满足平移不变性,这是 CNN 无法直接套用的根本原因,不是调调参数就能绕过去的。
2.2 平移不变性失效之后:卷积核为什么定不下来
打个比方,CNN 处理图像就像用一把标准尺寸的印章在纸上盖戳,不管盖在哪儿,戳的图案不变。因为图像上每个像素的邻居数量固定(内部像素有 8 个邻居,边缘少一些但规则明确),所以印章的“齿”可以设计成固定大小。但到了图数据里,每个节点的邻居数量不一样,邻居之间也没有排列顺序。你没法设计一个固定大小的印章,因为有的节点周围只有两个邻居,有的有五百个。更麻烦的是,就算两个节点邻居数量相同,邻居的排列顺序一变,印章盖出来的结果就全乱了——可图本身表达的关系并没有变。
这就是 CNN 在图数据上“翻车”的核心:无法定义全局共享的卷积核。有人可能会想,那我把邻接矩阵当成图片输入不就行了?邻接矩阵确实能表示连接关系,但它有两个致命伤。第一,节点数一多,邻接矩阵就是节点数乘节点数的方阵,社交网络动辄上亿节点,这个矩阵大到根本存不下,而且里面绝大多数位置是零,稀疏得可怕。第二,邻接矩阵的行列顺序一换,矩阵长得完全不一样,但它们表示的其实是同一张图。神经网络如果对顺序敏感,换一次编号就得出不同结果,那训练出来的模型毫无意义。
2.3 从邻接矩阵到邻接列表:存储与顺序无关的巧思
为了解决邻接矩阵又大又顺序敏感的问题,图神经网络普遍采用一种叫邻接列表的存储结构。它维护一个长度等于边数的列表,第 i 项记录第 i 条边连接了哪两个节点。节点和边的属性分别用向量存起来,全局信息也单独存一份。这样一来,存储量只和实际存在的边数成正比,稀疏图也不会浪费空间。更重要的是,你可以任意打乱边的顺序,只要同步调整邻接列表的对应位置,图表达的性质完全不变。这种对顺序不敏感的表示,才是神经网络能稳定处理图数据的前提。
下面用一段极简的 Python 代码示意邻接列表的构建逻辑,帮助理解它和邻接矩阵的区别:
# 假设有5个节点,边列表为 (起点, 终点) edges = [(0, 1), (1, 2), (2, 0), (3, 4)] # 邻接列表:每个节点只存它实际连接的邻居 adj_list = {i: [] for i in range(5)} for u, v in edges: adj_list[u].append(v) adj_list[v].append(u) # 无向图需要双向添加 # 输出结果:{0: [1, 2], 1: [0, 2], 2: [1, 0], 3: [4], 4: [3]} print(adj_list)这段代码里,edges是边的集合,adj_list是最终得到的邻接列表。关键点在于:无论你把edges里的顺序怎么打乱,只要边集不变,最终每个节点的邻居集合就不变。而如果用邻接矩阵,节点编号一换,矩阵的行列就得跟着换,模型输入就变了。邻接列表这种“只记关系、不记位置”的特性,正好契合图神经网络对顺序无关性的要求。
3. 拆开 GNN 的黑匣子:聚合、更新与迭代
3.1 什么是图:节点、边和全局信息
在深入 GNN 的计算流程之前,得先把“图”这个数据结构本身说清楚。图由节点和边组成,节点表示实体,边表示实体之间的关系。数学上,节点集合用 V 表示,边集合用 E 表示,整张图用 U 表示。每个节点可以带一个特征向量,每条边也可以带一个特征向量,整张图还能有一个全局特征向量。比如一个社交网络图,节点是人,节点特征可以是年龄、性别;边是好友关系,边特征可以是认识时长;全局特征可以是这个社交平台的平均活跃度。
图还分有向图和无向图。有向图的边有方向,比如“A 关注了 B”和“B 关注了 A”是两条不同的边;无向图的边没有方向,比如“A 和 B 是朋友”是对称的。这个区分在建模时很重要,因为信息的传递方向会直接影响聚合结果。
3.2 把图片、文本、社交网络都变成图
图神经网络的强大之处在于,它能把各种数据都“翻译”成图。图片可以变成图:每个像素是一个节点,相邻像素之间连一条边,这样一张图片就变成了一个网格图。文本也可以变成图:每个词是一个节点,词和词之间的前后关系是一条有向边,一句话就变成了一条链式图。社交网络天然就是图:每个人是节点,同时出现在一个场景里就连一条边。
这种“万物皆可图”的视角,让 GNN 的应用范围一下子打开了。但翻译成图之后,问题也随之而来:怎么在这样一张没有固定顺序的图上,定义类似卷积的操作?这就引出了 GNN 的核心机制。
3.3 聚合、更新、迭代:GNN 的三步循环
GNN 的核心思想可以用三个词概括:聚合、更新、迭代。通俗地说,每个节点都把自己的邻居信息“收”过来,跟自己的信息融合,然后更新自己的状态。这个过程重复多轮,每个节点就能逐渐“看到”越来越远的邻居信息。
打个比方,假设你刚搬进一个新小区,想了解这个小区的氛围。第一轮,你只问了你左右两户邻居,把他们的说法跟自己的观察结合起来,形成初步印象。第二轮,你左右两户邻居也各自问了他们的邻居,于是你间接获得了更远几户的信息。轮数越多,你对整个小区的了解就越全面。GNN 里的“聚合”就是收集邻居信息,“更新”就是融合后刷新自己的状态,“迭代”就是重复多轮。
用一段简化的公式示意单个节点的更新过程:
# 假设节点5的邻居信息为 N,自身特征为 h5 # a, b, c 是邻居节点特征的权重系数 # 聚合操作:将邻居信息加权求和 neighbor_info = a * (2, 2, 2, 2, 2) + b * (3, 3, 3, 3, 3) + c * (4, 4, 4, 4, 4) # 更新操作:将聚合结果与自身特征融合 new_h5 = activation(W_self * h5 + W_neighbor * neighbor_info)这里的a、b、c是不同邻居的权重,W_self和W_neighbor是可学习的参数矩阵,activation是激活函数。聚合方式可以很简单地求和,也可以加权平均,甚至用注意力机制动态分配权重——这就引出了后面要讲的 GAT。更新方式也多种多样,可以是简单的线性变换加激活,也可以是复杂的门控机制。迭代轮数通常设为 2 到 4 层,层数太多会导致所有节点的表示趋同,反而丢失区分度。
3.4 图上的三类问题:图层、顶点层、边层
GNN 能解决的问题大致分三类。图层面的问题:给一堆图,判断每张图属于什么类别。比如判断哪个分子结构可能有毒性,哪张社交网络图是正常互动、哪张是异常行为。顶点层面的问题:给一张图,判断每个节点属于什么类别。比如在社交网络里判断每个用户属于哪个兴趣圈子,在引用网络里判断每篇论文属于哪个学科。边层面的问题:给一张图,预测两个节点之间应该是什么关系。比如在图像语义分割中,先提取出人物和背景作为节点,再判断人物之间是什么互动关系。
这三类问题对应着不同的输出形式,但底层都依赖 GNN 学到的节点表示。节点表示学好了,图层面的问题可以通过池化所有节点表示来解决,边层面的问题可以通过组合两个端点的表示来解决。
4. GNN 家族大盘点:GCN、GAT、GAE 到底差在哪
4.1 图卷积神经网络:从空间域到频域
图卷积神经网络是 GNN 最主流的变体。它的核心思路是把卷积操作从图像搬到图上。但怎么搬,分出了两大流派。基于空间域的 GCN直接在节点的邻居上做卷积,把邻居特征加权求和,权重由邻接矩阵决定。基于频域的 GCN则借助图拉普拉斯矩阵,在谱域上做滤波,再把结果变换回空间域。两种方法殊途同归,但频域方法理论更漂亮,空间域方法工程上更灵活。
常见的空间域变体包括DCNN和NN4G。DCNN 用扩散核来定义邻居的权重,让信息像热扩散一样在图上传播。NN4G 则是最早的一批图神经网络模型之一,直接对邻居特征做加权求和再进神经网络层。这些变体各有侧重,但核心都是解决“怎么在无序邻居上做加权聚合”的问题。
4.2 基于注意力的 GAT:让邻居权重自己学出来
图注意力网络在聚合邻居信息时引入了注意力机制。普通 GCN 给不同邻居的权重是固定的,要么由邻接矩阵决定,要么由预定义的核函数决定。GAT 则让模型自己学习每个邻居的重要性。比如在判断一个用户的兴趣时,他关注的一个体育明星和一个美食博主,对判断他兴趣的贡献显然不同。GAT 能自动给体育明星更高的权重,给美食博主更低的权重,而不是一视同仁。
这种动态权重的好处是模型更灵活,能捕捉到更细粒度的关系。代价是计算量增加,因为每个邻居的权重都要单独算。但在很多任务上,这点计算量换来的精度提升非常划算。
4.3 基于自编码器的 GAE 与 VGAE:无监督的图表示学习
图自编码器和变分图自编码器走的是另一条路。它们不直接做节点分类或边预测,而是先通过编码器把图压缩成低维表示,再通过解码器重构出原始的图结构。训练目标是让重构误差最小。这样学到的节点表示,天然包含了图的结构信息,可以拿去做下游任务。
GAE 是确定性的自编码器,VGAE 则引入了变分推断,让学到的表示服从一个概率分布。VGAE 的好处是能生成新的图结构,而不仅仅是重构已有的。在药物分子生成、社交网络模拟等场景里,这种生成能力很有价值。
4.4 一张表看清 GNN 主要变体的区别
| 变体名称 | 核心机制 | 邻居权重 | 主要用途 | 训练方式 |
|---|---|---|---|---|
| GCN(空间域) | 邻居特征加权求和 | 由邻接矩阵固定 | 节点分类、图分类 | 监督/半监督 |
| GCN(频域) | 图拉普拉斯滤波 | 由谱函数决定 | 节点分类、图分类 | 监督/半监督 |
| DCNN | 扩散核传播 | 由扩散距离决定 | 图分类 | 监督 |
| NN4G | 直接邻居聚合 | 可学习参数 | 图分类 | 监督 |
| GAT | 注意力机制 | 动态学习 | 节点分类、边预测 | 监督/半监督 |
| GAE | 编码器-解码器重构 | 不涉及邻居聚合 | 图表示学习、链接预测 | 无监督 |
| VGAE | 变分自编码器 | 不涉及邻居聚合 | 图生成、链接预测 | 无监督 |
这张表里,GCN 和 GAT 属于“聚合派”,核心是设计更好的邻居信息聚合方式;GAE 和 VGAE 属于“重构派”,核心是设计更好的图表示学习目标。MPNN 则是把聚合和更新抽象成一个消息传递框架,统一了各种变体的接口。理解这些区别,就能在遇到具体问题时判断该用哪一类模型。
5. 常见误区与易混概念:别把 GNN 和这些搞混了
5.1 误区一:GNN 就是 GCN
很多人第一次接触图神经网络,看到的就是 GCN,于是把两者画等号。易混点在于 GCN 是 GNN 的一个子集,不是全部。为什么混:因为 GCN 太出名了,很多入门资料直接拿 GCN 当 GNN 讲。怎么区分:GNN 是处理图数据的神经网络的总称,GCN 只是其中一种利用卷积思想的变体。GAT、GAE、MPNN 都是 GNN,但不是 GCN。就像“水果”和“苹果”的关系,苹果是水果,但水果不只有苹果。
5.2 误区二:图神经网络只能处理图数据
易混点:以为只有社交网络、知识图谱这种天然图结构才能用 GNN。为什么混:名字里带“图”,容易让人以为输入必须是图。怎么区分:任何数据只要能表示成节点和边,就能用 GNN。图片可以变成像素网格图,文本可以变成词序列图,甚至表格数据也可以构造成图。GNN 是一种建模范式,不是只针对某类数据。
5.3 误区三:GNN 层数越多效果越好
易混点:把 GNN 层数类比成 CNN 的深度,以为越深越强。为什么混:深度学习里“更深更强”的经验在图像领域很常见。怎么区分:GNN 的层数对应信息传播的跳数。层数太多会导致“过平滑”问题——所有节点的表示趋于一致,失去区分度。通常 2 到 4 层就够了,再深反而掉点。这和 CNN 可以堆到上百层完全不同。
5.4 误区四:邻接矩阵和邻接列表可以随便换
易混点:觉得两者只是存储格式不同,用哪个都行。为什么混:在小图上两者确实可以互相转换,效果没差别。怎么区分:邻接矩阵对节点顺序敏感,换编号就换矩阵;邻接列表对顺序不敏感,更适合神经网络。而且邻接矩阵在稀疏大图上存储效率极低,邻接列表只存实际存在的边。工程实现里,邻接列表是默认选择。
5.5 误区五:GNN 和 Graph Embedding 是一回事
易混点:把图神经网络和图嵌入混为一谈。为什么混:两者都输出节点向量表示。怎么区分:图嵌入(如 DeepWalk、Node2Vec)通常是无监督的,只利用图结构,不利用节点特征,学到的表示是静态的。GNN 则同时利用图结构和节点特征,通过聚合邻居信息动态更新表示,而且可以端到端训练。图嵌入像是给每个节点拍一张固定照片,GNN 像是让每个节点不断和邻居交流、刷新自己的认知。
6. 什么时候该用 GNN,什么时候别碰
6.1 适合上 GNN 的三个信号
第一个信号:数据天然有连接关系,而且关系本身携带信息。比如推荐系统里用户和物品的交互、知识图谱里实体之间的语义关系、分子结构里原子之间的化学键。这些关系不是噪音,而是任务的关键。第二个信号:节点没有固定顺序,邻居数量不固定。如果你的数据能排成规整网格,CNN 可能更简单高效。第三个信号:任务需要利用多跳邻居信息。比如判断一个用户是否属于某个社群,光看他自己的行为不够,还得看他朋友、朋友的朋友。GNN 的迭代聚合天然适合这种需求。
6.2 别硬上 GNN 的三种情况
第一种情况:数据本身就是规整的欧式数据,且 CNN 已经够用。比如标准图像分类,CNN 成熟稳定,硬换成 GNN 把像素当节点,计算量暴增而收益甚微。第二种情况:图规模极大且极度稀疏,但任务只关心局部。比如一个上亿节点的社交网络,如果只判断某个用户是否点击某条广告,可能用简单的特征工程加梯度提升树就够了,上 GNN 的工程成本太高。第三种情况:节点特征质量极差或根本没有。GNN 依赖节点特征和结构信息共同作用,如果特征全是噪音,聚合出来的表示也好不到哪去。
6.3 一个具体例子:从分子毒性预测看 GNN 的边界
假设某实验室要预测一批新合成分子的毒性。分子天然就是图:原子是节点,化学键是边,原子属性(元素类型、电荷)是节点特征,键属性(单键、双键)是边特征。任务目标是给每个分子打一个“有毒/无毒”的标签,属于图层面的分类问题。这种场景下,GNN 非常合适:分子图规模不大(几十个原子),节点特征明确,而且毒性往往取决于某些子结构的组合,需要多跳聚合才能捕捉。
但如果换一个场景:某公司要预测用户对一条新闻的点击率,用户和新闻构成二部图,节点数上千万,边数上亿。这时候直接上 GNN 做全图聚合,计算和存储都吃不消。更务实的做法是先用图嵌入或随机游走采样出用户和新闻的局部表示,再喂给轻量级模型。GNN 不是万能锤,得看钉子适不适合。
提示:判断是否用 GNN,先问三个问题——关系是否重要?顺序是否不固定?是否需要多跳信息?三个都是“是”,再考虑 GNN。
从那以后我每次拿到一个新数据集,都强制自己先画一张图看看节点和边到底长什么样,再决定要不要上 GNN。这个习惯帮我省下了不少白忙活的时间。希望帮到你。
本文还有配套的精品资源,点击获取