简介这是一份面向深度学习入门与进阶学习者的图神经网络系统课件围绕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。这个习惯帮我省下了不少白忙活的时间。希望帮到你。本文还有配套的精品资源点击获取