跳到主要内容

图上的另两类任务 — 挖掉 30% 的边再补回来,以及 1 113 张蛋白质图的两类判定

这一章讲两件事: 给图上的连线补缺(链接预测),和给整张网贴标签(图分类); 外加一次工程交接——从手写的稠密写法换到生产里用的 PyTorch Geometric 库。

它在全书链条里的位置: 第 18 章在同一张小网上比出了四种机器; 这一章把这些机器接到三类任务的后两类上,并第一次让数据长到真实规模。

需要的基础: 第 18 章的消息传递框架;第 05 章的二分类那套尺子;第 03 章的训练循环。

1. 先看现象:「可能认识的人」不是给节点贴标签

社交软件隔一阵就给你冒出一条「你可能认识的人」。它不是在猜你属于哪一派(那是第 18 章), 它在猜一张还没发生的连线:你和他之间应不应该有一条边。

这类任务叫链接预测:基于图的一部分已知边,预测两个节点之间现在有没有 (或将来会不会形成)一条边1。书里一口气列了四个落脚点:

场景猜的边
社交网络「可能认识的人」
知识图谱(把事实拆成「实体—关系—实体」存成的网,如「爱因斯坦—出生地—?」)缺的那个关系末端
推荐系统用户和商品之间「买不买/看不看」
生物蛋白质之间的相互作用1

2. 编码器加解码器:给每一对节点打分

做法还是老二样:先把每个节点编成向量,再对着向量打分2:

第一步(编码) z_i = GNN(X, A) ← 第 18 章任何一种模型都行,
每个节点得到一个 d 维向量 z_i
第二步(解码) p_ij = sigmoid(z_i · z_j)
← 最简单的打分:两个向量的对应分量相乘再加起来
(这叫内积;两个向量越「同向」,分越高)

训练目标:真实边的得分要高、不存在的边(负例)的得分要低——本质上又回到了第 05 章那个二分类2

3. 负例从哪来:负采样

题目立刻来了:真实世界里「不存在的边」比存在的多得多,而图自己不会自动给出负例—— 必须人为造。书里的账:一张稀疏网里正例(真实存在的边)有 E 条, 不存在的点对大约有 N(N−1)/2 − E 个,往往差出几百倍; 常规做法就是负采样:每一轮随机抽和正例一样多的、确实不相连的点对当负例3

这套造法在第 18 章的主走查对象上会打出这些数:

主走查输入:还是那张 34 人空手道俱乐部
────────────────────────────────────────────────
正例(真实边) 78 条
所有可能的点对 34 × 33 ÷ 2 = 561 种
不存在的点对 561 − 78 = 483 种(是正例的 6 倍多)
^ 这三个数是我们按定义算的,书里没直接给[^3]
────────────────────────────────────────────────

4. 主走查:挖掉 30% 的边,再把它们找回来

光有负例还不够,得防作弊:如果考卷上的边都在训练时见过,成绩是背出来的。 所以先把原图挖个洞——书里把 78 条边随机切走约 30%(约 23 条)藏起来当测试集, 剩下 55 条组成训练时模型唯一看得见的残缺图4;

主走查全程
════════════════════════════════════════════════
① 切边 78 条 → 训练可见 55 条 + 藏起来的考卷 23 条
② 编码 两层 GCN(隐藏 32 → 16 维)看残缺图,
每个人编成 16 维向量;Adam lr=0.01、权重衰减 5e-4、200 轮
③ 打分 对训练正例打分拉高,每轮新采 55 条负例压低
④ 考试 对藏在一边的 23 条真边打分,对同样多的假边打分,
看「真边排在假边前面」的比例 —— 曲线下面积(AUC)[^5]
════════════════════════════════════════════════

四个检查点的考试分数5:

轮数测试 AUC对照
500.5501才比乱抽(0.5)高一点
1000.6238
1500.5709← 不升反降
2000.7694真边的得分排在前面的比例约为四分之三

中间那次回落不是笔误:负例每一轮都重新抽,考试用的负例也随种子变, 所以这条曲线天生上下抖;书里的结论是 Karate 终究是小图, 留足测试边之后整体已经稳定有意义,终点 0.7694 明显高于乱抽的 0.56。 VGAE 那篇 2016 年的工作最早用了这个「GCN 加内积」组合,后来长期是该任务的常用参照底座7

5. 为什么不用准确率:这一章的三把尺子

如果拿「预测对了多少条边」算准确率,一个什么都不学的模型也能接近满分—— 483 种点对里只有 78 条是真的,全答「没有边」就能对六分之五8。 第 05 章末尾预告过的三把尺子在这里才真正派上用场,顺手复述一遍: 精确率(判成「有边」的里面有多少真是边)、召回率(真边里面被捞出来多少)、F1(两者的折中调和)。 但注意链接预测的主指标不是它们,而是这两个9:

指标算什么为什么用它
AUC(ROC 曲线下面积)随机抽一条真边、一条假边,真边得分更高的概率只看排序,不看划在哪条线上
Hits@K全部测试边按得分排队,前 K 个里有多少真边更像「可能认识的人」推给你的实际体验9

6. 图级任务:整张网压成一个数再判

第二类任务换了问法。化学、制药领域的常见局面是大量小图,每张是一个分子: 原子当节点、化学键当边,要预测整个分子的属性——毒性、溶解度、能不能抑制某种酶10

相比节点级任务,多了一步读出(readout):把所有节点的表示聚合成一份「整张图的表示」, 求和、取均值、取最大都行,还有更讲究的做法(Set2Set 一类)11。 书里拿玩具分子图演示了这一步怎么落地,并给了三条要紧的取舍12:

图级任务三条要点(书里的提醒框)
────────────────────────────────────────────────
① 读出用 sum 别用 mean:sum 对节点个数敏感,
能区分「10 个原子的小分子」和「20 个原子的大家伙」
② 多层读出拼接:不同深度的层看到不同尺度的子结构,
把每层的图表示摞在一起再回归(GIN 原论文推荐的做法)
③ 成批训练:每个批(batch,一批同时过网络的样本数)里
摞着大小不一的多张图 —— 具体怎么摞,见第 8 节

7. 真实规模第一站:Cora 引用网络

从这一节开始,数据不再是 34 人的玩具。Cora 是节点分类的入门标准数据集—— 一个机器学习(让机器从数据里自己学规律的人工智能分支)论文互引网络,规模一下拉开了几档13:

Karate(上一章) Cora(这一章)
────────────────────────────────────────────
节点 34 2 708 篇论文 ≈ 80 倍
边 78 条 10 556 条引用 ≈ 135 倍
类别 2 派 7 个研究方向
标签 2 个 140 个(每类 20 个,占总数 5.2%)[^15]
────────────────────────────────────────────

换工具:从手写稠密到 PyG

34 个点随手写没问题,放到 2 708 个节点,第 18 章那种「邻接矩阵整块进显存」的写法开始吃力, 百万节点的图则直接爆。工程界的标准答案是 PyTorch Geometric(PyG):一键加载常见数据集、 稀疏边表存储、现成的 50 多种层可以直接调用14。 接口变化就一处:不再传整张矩阵 Ã,改传那张 [2, E] 的边列表; 对称归一化搬到层内部按需做,不用手动算15

模型就是第 18 章的两层 GCN 换成 PyG 版(隐藏仍 16 维、暂退率 0.5、Adam 学习率 0.01、 权重衰减 5e-4、200 轮,按验证集成绩保留最好的一版)——测试成绩 0.812016

这 0.81 是怎么挣来的:三条基线并排

光一个数说明不了图有用。书里摆了不用图和不用特征的两个对照组(供比较的参照配置)17:

模型用了什么信息测试准确率
多层感知机只用论文自身的词频特征 X0.58
标签传播只用引用关系 A,不看内容0.68
两层 GCN两者都用0.81
两层 8 头 GAT两者都用 + 学邻居权重0.83

内容和关系缺一不可,合起来的 GNN 比任一单打都高出十几个百分点18。照实注明一句:这张基线表里没有 GraphSAGE——原书表 9.2 就没排它;第 18 章那句「到 Cora 再看一次」对 GAT 兑现(0.83),对 SAGE 只能记为悬置。 书里还专门提了个醒:Cora 上 0.81 听着不高,但训练只用了 140 个标签去做 2 708 个点的七分类—— 同样的标注(人工贴标签的工作)量放在手写数字集上早就过拟合了;这已经是很强的半监督成绩19

单篇论文走一遍预测

拿测试集里随便一篇论文名为节点 1708 的问一次模型20:

预测走查:节点 1708
──────────────────────────────────────────────────────
特征 1 433 维词频向量(某关键词在摘要里出现与否)
邻居 它引用的和引用它的论文们的向量,经两层消息传递掺进来
输出 七个方向各一个分数 → 最高分是 RL(强化学习),置信度 0.19
真相 Rule Learning(规则学习)← 判错了
──────────────────────────────────────────────────────

书里特意把这次错误留在正文里,并给了规律:置信度低的往往是引用横跨多个领域的「边界论文」, 也正是图模型最容易判错的地方21。这种「把失败例子摆在台面上」的写法, 和第 16 章 0.66485 后面那段自我解释是同一品格。

8. 真实规模第二站:1 113 张蛋白质图判「是不是酶」

前面所有任务都是在一张图上打转;图分类面对的是一堆小图。 书里用的是 TU Dortmund 的 PROTEINS 基准集:1 113 张图,每张是一种蛋白质的二级结构图—— 节点是氨基酸(带 3 维属性)、边是空间相邻或共价键,任务是二分类:这张蛋白质是不是酶22

按 80% / 10% / 10% 切分,成批训练时每批 64 张图23大小不一的 64 张图怎么一起过网络?这是图分类最巧的一步:把一个批里的所有图拼成一张 「块对角」的大图——各图各自占据对角线上一块,图与图之间零连线;再用一个 batch 向量记下每个节点来自哪张图,读出时按它分组求和即可24。模型仍是第 18 章的 GIN 思想 (PyG 现成层,3 层、每层读出求和后拼接),训 100 轮。

主走查:一个批长什么样
════════════════════════════════════════════════════
批次打印(书里原样):约 64 张图粘成一张大图
节点约 1 800 个、边约 2 700 条、batch 向量长约 1 800[^27]
batch 向量片段:[0,0,0,1,1,1,1,2,…]
← 前 3 个节点属于第 0 张图,接下来 4 个属于第 1 张…
每张图里跑同一套消息传递,读出时按编号分组、各自求和
════════════════════════════════════════════════════

最终成绩:Best-val 模型测试准确率典型落在 0.68~0.78 这一档25。 书里配的评价是一张混淆矩阵(把「真实类别 × 预测类别」四种组合各计数的一张方表)外加 ROC 曲线26:

预测:非酶 预测:酶
┌──────────────┬──────────────┐
真实:非酶 │ 43(对) │ 25(误报) │
├──────────────┼──────────────┤
真实:酶 │ 10(漏报) │ 34(对) │
└──────────────┴──────────────┘
────────────────────────────────────────────────────
曲线下面积 AUC ≈ 0.77;书里说模型在两类上都有合理召回、
具备一定的区分能力[^29]

顺手把第 5 节那三把尺子在这张表上真的用一遍(这两个数是我们按表格算的,书里没直接给): 以「酶」为目标类别——召回率 = 34/(10+34) ≈ 0.77(真酶里有 77% 被认出来了), 精确率 = 34/(25+34) ≈ 0.58(被判成酶的里头,近一半是冤枉的); 总的对角占 77/112 ≈ 0.69,正好落在书给的 0.68~0.78 区间下沿。 书还走了一次单张预测:测试集第一张图判「非酶」,真相也是非酶——蒙对了;它提示读者多试几张、 对照混淆矩阵看清模型更容易在哪一类上犯错27

判断(我们的,不是书里的):这两站的数据规模仍然只是「热身级」。 2 708 个节点、1 113 张图,离 OGB 那种百万节点、亿条边的图隔着三个数量级; 而书里的链接预测只在 Karate 上完整跑了流程,Cora 上的链接预测留成了练习28如果错,会错在: 如果半监督设定本身决定了规模不重要,那这一条就是在瞎担心。 判据是:负采样方式或边的密度一变,AUC 就明显漂移(书里自己承认波动存在6), 说明这条链路还没有到「稳态通用」的程度。

9. 边界与局限

先把欠的那道墙正面交代掉:书自己的写法为什么不能直接上大图。 第 18 章为了让人读懂,全程用稠密写法——邻接矩阵整块存、边消息摊成 N×N×D 的三维整块。 34 个节点毫无问题;Cora(2 708 节点)开始吃力;百万节点的图,光那一块边消息张量就撑爆显存 ——这正是第 18 章第 9 节许诺的那道墙,出路就是把存储换成稀疏边表、聚合换成按边列表的散加 (scatter_),原理不变、内存友好得多;这也是 PyG 存在的理由29

其余没覆盖的:

没讲什么依据 / 为什么值得知道
打分的更多花样decoder 只给了内积;知识图谱常用的 DistMult、ComplEx、双线性层在笔记框里点了名30
实验的方差链接预测只报了一组种子的曲线;书承认每轮重采负例会让 AUC 波动6
图Transformer 与异质图不涉及多种节点类型,注意力也没用于图这边
负例的质量全部随机采,没有难负样本(专挑容易混的来当陪练)这一说
图级任务的真实数据玩具分子之外,QM9、ogbg-mol* 这些真基准只在笔记框列名31

出门会撞见的名字:

  • 链接预测(link prediction)、负采样(negative sampling) —— 第 1、3 节;
  • AUC / ROC 曲线、Hits@K —— 第 4、5 节;
  • VGAE(变分图自编码器) —— 第 4 节,「GCN+内积」组合的老祖宗7;
  • 读出(Readout)、global_add_pool —— 第 6、8 节;
  • PyTorch Geometric(PyG)、edge_index —— 第 7 节;
  • 标签传播(Label Propagation) —— 第 7 节那个只看图不看特征的基线;
  • 块对角小批图、batch 向量 —— 第 8 节。

10. 可带走的

  1. 链接预测=给每一对点打分:编码靠 GNN,打分靠内积,本质又是二分类;
  2. 负例必须人造,数量和正例持平;真实网里不存在边要多出几个数量级(Karate 上是 6 倍多);
  3. 别用准确率考链接预测:全答「无边」都能及格;要看 AUC 或 Hits@K 这种只认排序的尺子;
  4. 考题必须从训练图里挖走——不然模型是在背答案而不是补洞(Karate:78 条挖 23 条);
  5. 图分类多了读出一步:sum 优于 mean(能感知图的大小),多层读出拼接是 GIN 论文钦定的用法;
  6. 成批的多张图拼成块对角大图,batch 向量记录归属,读出分组求和;
  7. Cora 三条基线的排法值得记住:只用内容 0.58、只用结构 0.68、两者都用 0.81——图的价值必须这样证;
  8. 置信度低的预测集中在跨界样本上,看错误比看正确更能摸到模型的脾气;
  9. 稠密写法是小图的学具:Cora 吃力、百万节点必爆,上规模就换稀疏边表 + PyG。

11. 原文地图

主题原书章原文位置
链接预测的定义与应用第9章 图神经网络text/10-ch09.txt:926(搜「基于图的一部分已知边」)
编码器-解码器与内积第9章 图神经网络text/10-ch09.txt:945(搜「内积评分」)
数量悬殊与负采样第9章 图神经网络text/10-ch09.txt:952(搜「几百倍的悬殊」)
挖边作测试集第9章 图神经网络text/10-ch09.txt:969(搜「挖掉」)
四个检查点的 AUC第9章 图神经网络text/10-ch09.txt:1046(搜「test_AUC=0.7694」)
约 23 条测试边第9章 图神经网络text/10-ch09.txt:1078(搜「约 23 条」)
AUC 波动的交代第9章 图神经网络text/10-ch09.txt:1080(搜「重新采的负样本」)
准确率不合适第9章 图神经网络text/10-ch09.txt:1052(搜「准确率不太合适」)
AUC 与 Hits@K 定义第9章 图神经网络text/10-ch09.txt:1055(搜「ROC 曲线下面积」)
VGAE 出处第9章 图神经网络text/10-ch09.txt:1094(搜「VGAE」)
图级任务与读出第9章 图神经网络text/10-ch09.txt:1103(搜「聚合成一个图级表示」)
读出的选项第9章 图神经网络text/10-ch09.txt:1107(搜「Set2Set」)
图级三条要点第9章 图神经网络text/10-ch09.txt:1131(搜「关键点」)
分子是一张图第9章 图神经网络text/10-ch09.txt:1364(搜「原子是节点」)
PyG 从学具到工程第9章 图神经网络text/10-ch09.txt:1138(搜「学具」)
GCNConv 的接口变化第9章 图神经网络text/10-ch09.txt:1183(搜「按需做了对称归一化」)
Cora 规模与切分第9章 图神经网络text/10-ch09.txt:1191(搜「10556 条无向引用边」)
140 标签占 5.2%第9章 图神经网络text/10-ch09.txt:1194(搜「5.2%」)
PyG 数据对象第9章 图神经网络text/10-ch09.txt:1215(搜「统一管理」)
Cora 模型配置第9章 图神经网络text/10-ch09.txt:1221(搜「两层GCNConv」)
Best-val 0.8120第9章 图神经网络text/10-ch09.txt:1273(搜「test_acc = 0.8120」)
三条基线表第9章 图神经网络text/10-ch09.txt:1311(搜「参考值」)
缺一不可第9章 图神经网络text/10-ch09.txt:1323(搜「缺一不可」)
半监督的提醒框第9章 图神经网络text/10-ch09.txt:1328(搜「非常强的半监督」)
单点预测走查第9章 图神经网络text/10-ch09.txt:1349(搜「节点 1708」)
边界论文第9章 图神经网络text/10-ch09.txt:1352(搜「边界论文」)
PROTEINS 任务说明第9章 图神经网络text/10-ch09.txt:1369(搜「TU Dortmund」)
1 113 个图第9章 图神经网络text/10-ch09.txt:1376(搜「1113 个图」)
8:1:1 切分与批第9章 图神经网络text/10-ch09.txt:1384(搜「0.8 * n」)
块对角小批图第9章 图神经网络text/10-ch09.txt:1393(搜「块对角的大图」)
batch 向量第9章 图神经网络text/10-ch09.txt:1400(搜「batch 向量前 20 个」)
GIN 组装图分类器第9章 图神经网络text/10-ch09.txt:1405(搜「global_add_pool」)
典型成绩 0.68~0.78第9章 图神经网络text/11-ch10.txt:12(搜「0.68~0.78」)
混淆矩阵与 ROC第9章 图神经网络text/11-ch10.txt:34(搜「区分酶/非酶」)
单张预测蒙对第9章 图神经网络text/11-ch10.txt:88(搜「non-enzyme,真实」)

Footnotes

  1. 出处:「第9章 图神经网络」第 926–934 段(text/10-ch09.txt:926,搜「基于图的一部分已知边」)。原文:链接预测(link prediction)——基于图的一部分已知边,预测两个节点之间是否本就连着(或将来是否会形成)一条边;现实中俯拾皆是:社交网络的「可能认识的人」、知识图谱补全(「爱因斯坦–出生地–?」)、推荐系统的 user–item 二部图、蛋白质相互作用网络补全。 2

  2. 出处:「第9章 图神经网络」第 939–947 段(text/10-ch09.txt:945,搜「内积评分」)。原文:链接预测的常见范式是「编码器–解码器」——encoder 用 GNN 把每个节点编成 d 维向量 z_i;decoder 用最简单的内积评分判断 i 和 j 之间应该有边的概率;p̂_ij = sigmoid(z_iᵀz_j);训练目标是让真实边得分高、负样本得分低,本质是一个二分类问题。 2

  3. 出处:「第9章 图神经网络」第 951–953 段(text/10-ch09.txt:952,搜「几百倍的悬殊」)。原文:链接预测的训练样本天然不均衡——一张稀疏图里正样本(真实边)有 |E| 条,负样本(不存在边)有 N(N−1)/2−|E| 条,往往是几百倍的悬殊;常规做法是负采样:每个 epoch 随机抽和正样本同样多的不存在的边作为负样本。「561、483、6 倍多」是我们按 34 与 78 代入公式算的,书里没给这三个数。

  4. 出处:「第9章 图神经网络」第 967–969 段(text/10-ch09.txt:969,搜「挖掉」)与第 1078 段(text/10-ch09.txt:1078,搜「约 23 条」)。原文与代码:为了评估泛化能力,先从原图里「挖掉」一部分真实边作为测试集,剩下的边构成训练时可见的图(split_edges,test_ratio=0.3);正文明确:这里把约 30% 的边(约 23 条)留作测试。55 = 78−23 是我们按减法算的。

  5. 出处:「第9章 图神经网络」第 1043–1046 段(text/10-ch09.txt:1046,搜「test_AUC=0.7694」)。原文输出:epoch 50 loss=0.9081 test_AUC=0.5501;epoch 100 loss=0.9302 test_AUC=0.6238;epoch 150 loss=0.8176 test_AUC=0.5709;epoch 200 loss=0.8349 test_AUC=0.7694。

  6. 出处:「第9章 图神经网络」第 1078–1080 段(text/10-ch09.txt:1080,搜「重新采的负样本」)。原文:AUC 明显高于随机猜测的 0.5(这一次约 0.77),说明 GCN 编码器学到的节点表示能较好地把真实边排在不存在边前面;Karate 毕竟是小图,每个 epoch 重新采的负样本会让测试 AUC 上下波动,但留足测试边后整体已经稳定有意义。 2 3

  7. 出处:「第9章 图神经网络」第 1094–1095 段(text/10-ch09.txt:1094,搜「VGAE」)。笔记框原文:「GCN + 内积」组合最早出现在 2016 年的 VGAE(Variational Graph Auto-Encoder)论文里,后来也长期作为链接预测任务中的常见 baseline。 2

  8. 出处:「第9章 图神经网络」第 1052–1053 段(text/10-ch09.txt:1052,搜「准确率不太合适」)。原文:对链接预测来说,准确率不太合适——大多数「边」其实不存在,模型只要全部预测「不存在」就能拿到接近 1 的准确率。「全答无边可对 483/561」是我们代入本章数字的说法。

  9. 出处:「第9章 图神经网络」第 1055–1057 段(text/10-ch09.txt:1055,搜「ROC 曲线下面积」)。原文两个常用指标:AUC(ROC 曲线下面积)衡量正负样本之间的可分性;Hits@K 把全部测试正负样本按得分排序,前 K 个里有多少正样本,在大图上更接近「可能认识的人」推荐效果的人类感受。 2

  10. 出处:「第9章 图神经网络」第 1100–1102 段(text/10-ch09.txt:1100,搜「图级任务」)与第 1363–1365 段(text/10-ch09.txt:1364,搜「原子是节点」)。原文:GNN 的一个重要应用是图级任务——给一个完整的图,预测一个标量或类别,典型场景是分子性质预测(能量、毒性、溶解度等);化学药物生物领域常常面对大量小图——每个分子是一张图,原子是节点、化学键是边。

  11. 出处:「第9章 图神经网络」第 1102–1107 段(text/10-ch09.txt:1105,搜「READOUT」)。原文:图级任务相比节点级任务多了一步读出(Readout)——把所有节点表示聚合成一个图级表示 h_G = READOUT({h_i});READOUT 可以是 sum、mean、max 或者更复杂的 Set2Set。

  12. 出处:「第9章 图神经网络」第 1130–1137 段(text/10-ch09.txt:1133,搜「而非 mean readout」)。提醒框原文:图级任务有几个关键点——用 sum 而非 mean readout:sum 对节点数量敏感,能区分不同大小的图;多层 readout 拼接:不同深度的层捕捉不同尺度的子结构信息,GIN 原论文推荐这种做法;mini-batch 训练:真实数据集(如 QM9)上必须用 mini-batch,PyG 提供相应的 DataLoader。

  13. 出处:「第9章 图神经网络」第 1186–1195 段(text/10-ch09.txt:1191,搜「10556 条无向引用边」)。原文:Cora 是节点分类的 Hello World——机器学习领域论文引用网络;2 708 个节点(论文),每篇论文由 1 433 维词袋向量表示;10 556 条无向引用边;7 个类别;标准切分为 140 训练(每类 20)、500 验证、1 000 测试。

  14. 出处:「第9章 图神经网络」第 1150–1159 段(text/10-ch09.txt:1138,搜「学具」)。原文:前文「纯 PyTorch + 稠密邻接矩阵」的实现放 2 700 节点的 Cora 开始吃力,OGB 级别百万节点图直接爆显存;实战标准选择是 PyTorch Geometric:常见数据集一键加载、高效稀疏邻接表示(edge_index)、邻居采样与小批、异构图、scatter 聚合,以及 50 多种现成 GNN 层。

  15. 出处:「第9章 图神经网络」第 1181–1183 段(text/10-ch09.txt:1183,搜「按需做了对称归一化」)。原文:注意接口变化——forward 的第二个参数是 edge_index(稀疏边表)而非 Â(稠密归一化矩阵);GCNConv 内部按需做了对称归一化,不用手动算 D^{-1/2}ÂD^{-1/2}。

  16. 出处:「第9章 图神经网络」第 1221 段(text/10-ch09.txt:1221,搜「两层GCNConv」)与第 1273 段(text/10-ch09.txt:1273,搜「test_acc = 0.8120」)。原文与代码:直接复用 PyG 版两层 GCNConv,隐藏 16 维,dropout 0.5;Adam lr=0.01、weight_decay 5e-4,200 epoch,验证集最优权重做最终评估,输出 Best-val 模型 test_acc = 0.8120。

  17. 出处:「第9章 图神经网络」表 9.2(text/10-ch09.txt:1311,搜「参考值」)。表:MLP(只用特征 X)Test Acc 0.58;Label Propagation(只用 A)0.68;GCN 2 层(同时用 A 和 X)0.81;GAT(2 层 8 头)0.83。

  18. 出处:「第9章 图神经网络」第 1323 段(text/10-ch09.txt:1323,搜「缺一不可」)。原文:可见图结构和节点特征都缺一不可,把它们结合起来的 GNN 比单独使用任何一个都好不少。

  19. 出处:「第9章 图神经网络」第 1325–1328 段(text/10-ch09.txt:1328,搜「非常强的半监督」)。提醒框原文:「0.81」在 Cora 上听起来不算特别高,但要记得:训练只用了 140 个标签,做的是 2708 个节点的 7 分类;同样规模的训练数据做 MNIST 几乎是过拟合的,在 Cora 上能到 81% 已经是非常强的半监督结果。

  20. 出处:「第9章 图神经网络」第 1334–1353 段(text/10-ch09.txt:1349,搜「节点 1708」)。原文输出:节点 1708:预测 = RL(置信度 0.19),真实 = Rule Learning——这次预测是错的。「特征与邻居两条输入来源」是我们按模型结构的复述。

  21. 出处:「第9章 图神经网络」第 1351–1353 段(text/10-ch09.txt:1352,搜「边界论文」)。原文:把 node 换成其他测试节点多试几个,会发现置信度低的往往是引用关系横跨多个领域的「边界论文」——这类节点也正是 GNN 最容易判错的地方。

  22. 出处:「第9章 图神经网络」第 1361–1372 段(text/10-ch09.txt:1369,搜「TU Dortmund」)与第 1376 段(text/10-ch09.txt:1376,搜「1113 个图」)。原文:TUDataset/PROTEINS 来自 TU Dortmund 的分子图 benchmark,每个图是一种蛋白质的二级结构图:节点是氨基酸(带 3 维属性),边表示空间相邻或共价键,任务是判断这个蛋白质是否是「酶」(二分类);print 显示共 1113 个图。

  23. 出处:「第9章 图神经网络」第 1382–1390 段(text/10-ch09.txt:1384,搜「0.8 * n」)。代码注释:80% / 10% / 10% 切分;DataLoader batch_size=64 分别装载训练、验证、测试集。

  24. 出处:「第9章 图神经网络」第 1392–1396 段(text/10-ch09.txt:1393,搜「块对角的大图」)。原文:PyG 处理图 mini-batch 的方式很巧妙:把一个 batch 里所有图的邻接拼成一张块对角的大图(不同图之间没有边);这样批内所有图可以一起做消息传递;同时用 batch 向量(长度等于批内全部节点数)记录每个节点属于哪张图,readout 时按 batch 分组聚合即可。

  25. 出处:「第9章 图神经网络」第 10–12 段(text/11-ch10.txt:12,搜「0.680.78」)。原文代码注释:Best-val 模型 test_acc = final_test 的输出——典型 0.680.78。模型为 PyG 现成 GINConv 加 global_add_pool 组装的三层版本(hidden=64,lr=1e-3,weight_decay 5e-4,100 epoch;组装代码见 text/10-ch09.txt:1435(搜「GINGraphClassifier(」)。

  26. 出处:「第9章 图神经网络」第 33–34 段(text/11-ch10.txt:34,搜「区分酶/非酶」)与图 9.9(text/11-ch10.txt:49,搜「混淆矩阵与 ROC 曲线」)。原文:二分类最直观的诊断是混淆矩阵和 ROC 曲线;模型在两类上都有合理的召回,ROC 的 AUC 约 0.77,说明分类器具备一定的区分酶/非酶的能力;图中混淆矩阵数值:非酶行 43 / 25,酶行 10 / 34,曲线标注 AUC=0.768。

  27. 出处:「第9章 图神经网络」第 74–91 段(text/11-ch10.txt:88,搜「non-enzyme,真实」)。原文:取测试集第一张图判断「是不是酶」,输出预测 non-enzyme、真实 non-enzyme;把 test_set[0] 换成其他下标多试几张,结合混淆矩阵就能看清模型更容易在「酶」还是「非酶」上犯错。召回率 0.77、精确率 0.58、合计 0.69 是我们按矩阵算的,书里没直接给这三个数。

  28. 出处:「第9章 图神经网络」第 1355–1359 段(text/10-ch09.txt:1358,搜「移除 10% 的边」)。动手练习 9.6:在 Cora 上做链接预测——随机移除 10% 的边作为正测试样本,重新训练 GCN encoder,报告 AUC 和 Hits@20;书里正文只做了 Karate 上的完整流程。

  29. 出处:「第9章 图神经网络」第 400–405 段(text/10-ch09.txt:402,搜「爆显存」)。笔记框原文:[N,N,D] 稠密张量在小图没问题,百万节点大图上会爆显存;PyG 基于 edge_index 做稀疏分散(scatter_)聚合,原理一致、规模一致,只是内存友好得多;切换到大图直接换成 PyG 即可。

  30. 出处:「第9章 图神经网络」第 1087–1092 段(text/10-ch09.txt:1091,搜「DistMult」)。笔记框原文:链接预测的 encoder 和 decoder 是解耦的、可以自由组合——encoder 用 GCN、GraphSAGE、GAT 等;decoder 里内积最简单,更复杂的有 DistMult、ComplEx(知识图谱)和双线性层 z_iᵀWz_j。

  31. 出处:「第9章 图神经网络」第 59–66 段(text/11-ch10.txt:61,搜「ogbg-mol」)。笔记框原文:图分类是 GNN 的工业应用主战场之一——药物发现(DeepChem、Stanford OGB 的 ogbg-mol* 系列)、量子化学(QM9、PCQM4Mv2 上做能量与 HOMO-LUMO 间隙回归)、程序分析(代码 AST/CFG 当图预测漏洞)、生物分子(蛋白质对接、酶催化预测);共同特点是「每个样本是一张图」,必须有 readout。