跳到主要内容

数据截至 (上游 commit c187ef3271d5)

图神经网络 — 当「谁连着谁」本身就是信息

这一章讲三件事。第一件:有一类数据,前面六章的做法根本处理不了。 表格里每一行各管各、图片之间互不相干 —— 可社交网络里的人、互相引用的论文、 一个分子里的原子,它们之间的连接本身就是信息

第二件,是这一章的核心机制:一个节点怎么把邻居的信息收进来。 做法只有三步,而且每叠一层就多看一跳。

第三件,是一根伏笔:邻居不该一样重要。 给每个邻居学一个权重、重要的多听 —— 这一招你在第 11 章还会再见到一次,那时候它换了个名字,对象也从邻居换成了词。

在全书链条里的位置: 三个零件里,这一章换的是「数据摆成什么形状」—— 而且换得最彻底:它头一次打破了「样本之间互相独立」这个从第 02 章起就默认成立的前提。

1. 顶层全景:2708 篇论文,只有 140 篇带标注

这一章的主走查是一张引文网络:2708 篇计算机科学论文,谁引用了谁连成 10556 条边, 要判断每篇论文属于七个研究方向里的哪一个。难点在于只有 140 篇有人标过类别1

2708 篇论文 · 10556 条引用 · 每篇一份 1433 位的特征

├─① 图变成两张表 ────────→ 一张记谁连谁,一张记每篇论文自己什么样

├─② 每层向邻居收一圈消息 ─→ 每篇论文的表示里掺进了引用它/被它引用的论文

├─③ 邻居不是一样重要 ────→ 给每个邻居学一个权重

├─④ 叠两层 ─────────────→ 每篇论文看到两跳以外

├─⑤ 只拿那 140 篇算损失 ──→ 训 200 轮

└─⑥ 拿 1000 篇没见过的考它 → 82.10%,而瞎猜只有 31.90%

图说:这一章真正的新东西是 ②③④。 用 140 个标注去判 2708 篇论文 —— 这件事之所以成立,全靠边把信息传出去了。

2. 样本之间不是互不相干的 —— 图神经网络管的就是这一类数据

图神经网络就是专门吃这种「点和线」结构的网络。 先看现象: 第 02 章那张表,每一行是一个人,行与行之间没有关系; 第 04 章那些图片也一样,你把它们打乱顺序,结果一点不变。

可有一类数据不是这样。 书开门见山:传统模型一般把数据点看成孤立的单位, 而一旦数据点之间不再互相独立、而是彼此连接,这种做法就到头了 —— 完整的信息只有在把连接也考虑进来时才显露出来2

书举的三个例子都很实在:社交网络、交通流量预测、金融领域的欺诈识别3

处理这类数据的网络,叫图神经网络。 这里的「图」不是图片,是数学里那个「点和线」的图 —— 它只有两样东西4:

零件是什么在社交网络里
节点图里的那些对象一个个人
节点之间的连接两个人之间的关系

边还分方向。有向边像单行道:甲对乙感兴趣、而乙对甲不感兴趣, 就是一条从甲指向乙的边;两人互相有意,那就是一条无向边5

3. 图怎么变成两张表

先看现象: 图画出来给人看很直观,可模型只吃张量 —— 得先把它变成数。

答案是两张表,一张管连接,一张管属性。

第一张叫邻接矩阵。 行和列都是全部节点,行代表「从哪儿出发」、列代表「到哪儿去」; 格子里写 1 表示有边,写 0 表示没有6。书给的五节点例子,读法是这样的:

目标
A B C D E
A 0 0 0 0 0
B 1 0 1 1 0 ← B 这一行有三个 1:B 连到 A、C、D
C 0 0 0 1 0
D 0 0 1 0 1
E 1 0 0 1 0

图说:要查「B 有没有连到 C」,就到第二行(源节点 B)、第三列(目标节点 C)看一眼 —— 那里是 1,所以有一条从 B 指向 C 的边7

一条很有用的性质:无向图的邻接矩阵一定是对称的(A 连 B 等于 B 连 A); 而有向图的不对称 —— 上面那张表就不对称8

第二张叫节点特征矩阵。 一行一个节点,记这个节点自己什么样。 书给的例子是每个人的年龄和城市:A 是 25 岁、汉堡;B 是 33 岁、慕尼黑……9

两张表合起来,就是模型需要的全部输入:

edge_index(谁连谁) + x(每个点自己什么样) = 一张图

4. 消息传递:一个节点怎么把邻居收进来

这一节是全章的核心机制。

它解决什么问题。 一个节点自己那一行特征往往不够用。 判断一个账号是不是骗子,光看它的注册信息可能看不出来 —— 但看它跟谁在往来,就看得出来。

怎么做,三步10:

① 找邻居 —— 目标节点 B 的直接邻居是 C、D、A
② 收消息 —— 把 C、D、A 各自那一行特征取过来,用一个汇总函数合成一份
(汇总函数可以是取平均、求和,也可以是更复杂的运算)
③ 和自己合并 —— 把汇总出来的那一份,和 B 自己原来那一行合起来,
得到 B 的一份**新的**表示

图说:三步之后,B 那一行里就掺进了邻居的信息。这个过程对图里每一个节点都做一遍。

为什么这么做有效 —— 关键在「叠层」这件事。 做完一层,每个节点里装的是「自己 + 直接邻居」; 再叠一层,由于邻居那一行此刻也已经装进了它的邻居,消息就又往外走了一跳11

第 1 层之后:B 知道 C、D、A
第 2 层之后:B 还知道了 C 的邻居、D 的邻居、A 的邻居 —— 也就是两跳以外

书把这个越来越丰富的表示叫作节点的嵌入 —— 和第 06 章那个词是同一件事: 一串训出来的、能拿来比距离的数。区别只在这里的数是从邻居那里汇总来的12

4.1 另起一条走查:五个人的小图,把这三步走给你看

这一处和主走查用的不是同一份数据,请当心。 书里另有一个五人的小例子, 每个人有三项兴趣分(读书、跑步、做饭),0 到 1 之间13:

读书跑步做饭
Bert0.80.20.2
Lea0.10.90.8
Elisa0.00.50.8
Kiki0.01.00.0
Steve0.20.30.5

连接是这样的:Bert、Lea、Elisa、Kiki 四个人互相都认识(四个人两两相连,共 6 条边), 另外只有 Bert 认识 Steve(1 条边)。合计 7 条边,和书打印出来的数一致14

现在把三步走在 Lea 身上。

第 ① 步,找邻居。 Lea 在那个四人小圈子里,所以她的直接邻居是 Bert、Elisa、Kiki —— 注意 Steve 不在其中

第 ② 步,收消息并汇总。 取三个邻居的特征,逐项取平均:

读书:(0.8 + 0.0 + 0.0) ÷ 3 = 0.267
跑步:(0.2 + 0.5 + 1.0) ÷ 3 = 0.567
做饭:(0.2 + 0.8 + 0.0) ÷ 3 = 0.333

第 ③ 步,和自己合并。 Lea 自己是 [0.1, 0.9, 0.8],和上面那份再逐项取平均:

Lea 的新表示 = [(0.1+0.267)÷2, (0.9+0.567)÷2, (0.8+0.333)÷2]
= [0.183, 0.733, 0.567]

读一下这个结果: Lea 本来是「不太读书、很爱跑步、很爱做饭」; 收完邻居之后,「跑步」这一项被拉低了一点(因为 Bert 不爱跑), 「读书」这一项被抬高了一点(因为 Bert 很爱读书)。 她那一行数里,现在带上了她的社交圈。

第 ④ 步,叠第二层,看两跳。 上面这一层里,Lea 完全没有收到 Steve 的任何信息。 但 Bert 收到了 —— Steve 是 Bert 的邻居。所以再叠一层、Lea 再从 Bert 那里收一次时, Steve 的信息就间接地进来了。

这几个数是我们按书给的特征和边算出来的,书本身没有做这次演算。 两处选择也要说明:汇总用「取平均」是书列出的选项之一; 而「和自己合并」那一步具体怎么合,书没有指定 —— 这里同样取平均, 只是为了把数走通。真实的图神经网络这两步里还各有一组可训练的权重。

5. 邻居不是一样重要

先看现象。 上一节第 ② 步取的是平均 —— 这等于说每个邻居一样重要。 可现实里显然不是:判断一个账号是不是骗子,和它有大额往来的那个邻居, 比一个只点过一次赞的邻居重要得多。

改法:给每个邻居学一个权重。 书的说法是,这种网络层 为每个节点的每一个邻居学出一个各自的权重,评估哪些邻居对更新这个节点最要紧; 更相关的邻居权重更高,对新的表示贡献更大15

这种「先给每个来源打个分,再按分数加权混合」的做法,有个统称叫注意力。 用了它的图网络叫 GAT。

它还并排跑好几套 —— 这叫多头注意力。 每一套各自学一组权重, 可以各管一种关系,最后把几套的结果拼起来。这一章用的是 8 套16

这一节是一根伏笔,请记住它。 第 11 章讲一句话怎么在语言模型里走的时候, 你会看到一模一样的动作:先给每个词打分,再按分数把它们混合起来。 区别只在打分的对象:这里是邻居,那里是同一句话里的其他词。 书从不点破这件事,是我们把它们连起来的 —— 第 11 章还会把第 04 章那条也一起连上。

判断(我们的,不是书里的):书把 GAT 的全称写错了,而且顺带给了一个误导性的说法。 书写的是「graph attention transformer」,正确的是 graph attention Network(图注意力网络)17。 紧接着那句「这种层用 transformer 式的方法实现消息传递」也容易误导: GAT 的注意力只在直接邻居这个小范围里做,而不是让每个节点去看图里所有别的节点。 它仍然是上一节那种消息传递,只是把「取平均」换成了「按学出来的权重加权」。 如果错,会错在: 如果作者的意思只是「借用了同一种打分再加权的思路」, 那么「transformer 式的」这个形容还算说得过去 —— 但全称写成 transformer 是硬错。 判据:这个模型在框架里的类名是 GATConv,而 GAT 就是 Graph Attention Network 的缩写。

6. 三类任务:判点、判边、判整张图

同一套机制,按「要判什么」分成三类18:

任务判什么书给的用例
节点分类给单个节点判一个类别社交网络里揪出骗子和机器人账号;资金往来网络里找可疑账户
链接预测判断两个还没连上的节点之间会不会有边推荐(这个人会不会买这个东西)、交友平台的配对、补全知识图谱(把「某公司—总部在—某国」这类事实存成的一张图)、预测蛋白质之间的相互作用
图分类给整张图判一个类别化学里把分子画成图(原子当节点、化学键当边),判断这个分子有没有毒

第二行里那件事值得说清:知识图谱存的是「谁是谁的什么」, 而链接预测在这里的用途是把缺掉的事实补出来 —— 比如推出某家公司属于哪个国家19

这一章的实战做的是第一类。 但第二类值得多留意一句: 它和第 06 章那个推荐问题是同一件事的两种说法 —— 那一章的「把大表里的空格填出来」, 换成图的说法就是「预测一条还不存在的边」。(这一句是我们连的,书没说。)

7. 主走查:140 个标注,判 2708 篇论文

下面每个数都来自书。

第 ① 步,认识数据。 Cora 是一张论文引用网络:2708 篇科学文献当节点, 10556 条引用关系当边,每篇被归入七个研究方向之一 —— 神经网络、概率方法、 遗传算法(一类模仿生物进化、靠「变异 + 择优」来搜索解的方法)、理论、 基于案例、强化学习、规则学习20

第 ② 步,每篇论文自己那一行是什么。 1433 个 0 或 1, 每一位对应词典里的一个特定词:这篇论文里出现过这个词就记 1,没出现记 0。 这种表示法只数「有没有出现」,完全不管词序,叫词袋21

第 ③ 步,只有很少的标注。 全图 2708 个节点里,训练只用 140 个、 验证 500 个、测试 1000 个22

140 ÷ 2708 = 5.2% —— 这才是这一章最值得记的一个数: 九成半的节点没有答案,靠边把那 140 个答案「传」出去。

第 ④ 步,先算基线。 七个类的节点数是 351 / 217 / 418 / 818 / 426 / 298 / 180, 最大的那一类占 818 个;「永远猜最多的那一类」在测试集上拿到 31.90%23。 (第 03 章那条规矩,这一章执行了。)

第 ⑤ 步,搭网络。 两层24:

输入 x:[2708, 1433] ,edge_index:[2, 10556]
→ 先随机丢掉 60% 的输入(dropout 0.6)
→ 第一层:8 套注意力 × 每套 8 维 → [2708, 64] ← 8×8 拼起来
→ ELU
→ 再丢一次 60%
→ 第二层:1 套注意力,直接输出 7 个数 → [2708, 7]
→ 取对数的 softmax

这里有两个细节值得停一下。

其一,dropout 高达 0.6 —— 第 04 章那个例子用的是 0.25 和 0.5。 在只有 140 个标注的情况下,过拟合的压力极大,所以下手很重。

其二,激活用的是 ELU,不是 ReLU。差别只在负数那一侧: ReLU 把负数直接压成 0(第 01 章说过,压成 0 意味着梯度也是 0、这个神经元可能再也醒不过来), 而 ELU 给负数留一条指数衰减的曲线,避开了这个「神经元死亡」的问题25

第 ⑥ 步,损失。 最后一层做的是「取对数的 softmax」,配的损失叫 NLLLoss这正是第 04 章列出的那两个等价选项里的第二个 —— 另一个是「输出层什么都不加、配 CrossEntropyLoss」。书说前者数值上更稳定26

第 ⑦ 步,训练。 Adam、学习率 0.01,外加一个把权重往小里拽的正则项;转 200 轮27。 路标是这样的28:

损失训练准确率验证准确率
第 20 轮1.587194.29%75.40%
第 200 轮0.6110100.00%79.60%

第 ⑧ 步,考试。 拿 1000 个从没参与过训练的节点测:82.10%29。 对照基线 31.90%,领先 50 个百分点 —— 这个模型确实学到了东西。

第 ⑨ 步,看它的表示学成了什么样。 把每个节点最后那一份表示压到二维画出来, 按真实类别上色:同一类的点明显聚成一簇,不同簇之间分得开30。 这是「消息传递确实把同类节点拉到一起了」的直观证据。

判断(我们的,不是书里的):第 ⑦ 步那张表里藏着一个书没点破的信号。 训练准确率 100%、验证准确率 79.6%,两者差了 20 个百分点 —— 按第 02 章那条判据,这是明显的过拟合迹象:模型把那 140 个标注背下来了。 书对这张表的评语是「损失下降得很好,训练和验证准确率都稳定在很高的水平」, 没有提这个 20 个百分点的缺口。 在只有 140 个标注的情况下这几乎不可避免,也正是它把 dropout 开到 0.6 的原因; 但照实说出来,读者才知道 82.10% 这个数是在什么条件下拿到的。 如果错,会错在: 如果验证集的难度本身就明显高于训练集(比如那 500 个节点 恰好集中在图的稀疏区域),那么这个缺口有一部分来自数据而不是过拟合。 判据是:训练准确率是 100%(不是 95%),一个能把训练集全做对的模型, 几乎一定已经在背答案了。

8. 书里的立场与证据

书里给了证据的:

  • 图 → 两张表 —— 给了可以逐格对照的邻接矩阵,读法讲得很清楚;
  • 消息传递三步 —— 给了流程图和文字说明,准确;
  • 82.10% vs 31.90% —— 真实跑出来的数,而且配了基线(第 03 章那条规矩执行了);
  • 表示的二维可视化 —— 图为证。

作者的经验判断(书里没给证据):

  • 「8 套注意力、每套 8 维」「dropout 0.6」「200 轮」 —— 都没解释为什么;
  • 「用 ELU 避免神经元死亡」 —— 定性正确,但没有对比实验。

书里没交代来历的: GAT 这套做法出自哪一年、哪一篇,全书一字未提。 我们补在了脚注里31

书里说错的: GAT 的全称,以及「transformer 式」这个形容 —— 见第 5 节末的判断块。

9. 边界与局限

这本书对的地方先说清: 这一章的铺垫顺序很正:先讲图是什么、 再讲它怎么变成两张表、再讲消息传递、最后才上模型。 邻接矩阵那一节尤其干净,读完就能自己写一张出来。

但有三处要当心:

  1. GAT 全称写错 —— 见第 5 节末的判断块;
  2. 过拟合迹象没被指出 —— 见第 7 节末的判断块;
  3. 两个五节点的图容易混。 原书 §7.1.1 那张 A–E 的图(用来讲邻接矩阵和消息传递) 和原书 §7.2 那张五个人的图(用来演示怎么建图)不是同一张, 但书没有提醒,读者很容易以为消息传递那三步是在五人图上走的。 我们在本章第 4.1 节把这两者分开了。 (下同:凡指原书的节号一律写成「原书 §N」,只写「第 N 节」的都是指我们自己这一章。)

这一章没覆盖的:

  • 注意力权重具体怎么算,一个字没讲。 书只说「学出一个各自的权重」, 但打分的算式全书都没有 —— 这正是第 11 章要补的那个缺口;
  • 消息传递里那些可训练的权重在哪,书没说。 它只描述了「找邻居、汇总、合并」三步, 没说清哪一步带参数;
  • 叠很多层会出什么问题,一字未提。 补充(不在书里,依据我们的 ai-book-reference 书架):层数叠多了会出现「过度平滑」—— 所有节点的表示越来越像,最后分不开32;
  • 图很大时怎么训(全图一次算不下)没讲;
  • 实战只做了节点分类,链接预测和图分类只有概念;
  • 公式是图片。 邻接矩阵那三条规则在原文里对应的符号是图,提取出来是空的, 第 3 节那三条是我们按文字描述补写的。

10. 可带走的

主走查一行写完: Cora 引文网络 2708 篇论文 / 10556 条边 / 每篇 1433 位词袋特征 / 7 类 → 只有 140 篇带标注(5.2%)→ 两层 GAT(第一层 8 套注意力各 8 维、dropout 0.6、ELU) → 取对数的 softmax 配 NLLLoss、Adam 0.01、200 轮 → 训练 100% / 验证 79.6%(过拟合迹象)→ 测试 82.10%,基线 31.90%

  1. 这一章打破了「样本之间互相独立」这个从第 02 章起的默认前提;
  2. 图只有两样东西:节点和边;边分有向和无向;
  3. 图变成两张表:邻接矩阵记谁连谁,节点特征矩阵记每个点自己什么样;
  4. 无向图的邻接矩阵一定对称,有向图的不对称 —— 这是一条随手可查的性质;
  5. 消息传递三步:找邻居 → 汇总邻居的特征 → 和自己合并;
  6. 叠一层多看一跳 —— 两层之后,一个节点就看到了邻居的邻居;
  7. 收消息取平均等于「每个邻居一样重要」,而现实里不是;
  8. 给每个邻居学一个权重,这一招叫注意力;并排跑好几套叫多头;
  9. 第 11 章会看到同一招用在词上 —— 打分、加权、混合,动作完全一样;
  10. 三类任务:判点(欺诈)、判边(推荐、补全知识图谱)、判整张图(分子毒性);
  11. 判边和第 06 章那个「把大表的空格填出来」是同一件事;
  12. ELU 和 ReLU 只差负数那一侧 —— 它给负数留一条衰减曲线,避开神经元死亡;
  13. 140 个标注判 2708 篇论文之所以成立,全靠边把答案传出去了;
  14. 训练 100% 而验证 79.6%,差 20 个百分点 —— 那是在背答案,书没说。

11. 原文地图

主题原书章原文位置
孤立数据点的局限与三个应用Chapter 7text/09-ch07-chapter-7.txt:5(搜「isolated units」) · text/09-ch07-chapter-7.txt:7(搜「forecasting traffic」)
节点与边、有向与无向Chapter 7text/09-ch07-chapter-7.txt:17(搜「two basic components」) · text/09-ch07-chapter-7.txt:25(搜「directional and nondirectional」)
邻接矩阵的定义与读法Chapter 7text/09-ch07-chapter-7.txt:53(搜「square matrix that represents the connections」) · text/09-ch07-chapter-7.txt:58(搜「connection points from node B to node C」) · text/09-ch07-chapter-7.txt:71(搜「A 0 0」)
对称性Chapter 7text/09-ch07-chapter-7.txt:80(搜「always symmetrical」)
节点特征矩阵Chapter 7text/09-ch07-chapter-7.txt:84(搜「certain characteristics」) · text/09-ch07-chapter-7.txt:90(搜「Hamburg」)
消息传递三步与叠层Chapter 7text/09-ch07-chapter-7.txt:122(搜「direct neighbors of B」) · text/09-ch07-chapter-7.txt:125(搜「aggregation function」) · text/09-ch07-chapter-7.txt:133(搜「neighbors of the neighbors」)
表示叫嵌入Chapter 7text/09-ch07-chapter-7.txt:134(搜「embedding) that reflects」)
五人图的特征与边Chapter 7text/09-ch07-chapter-7.txt:255(搜「person_interests = {」) · text/09-ch07-chapter-7.txt:224(搜「Clique among Bert」) · text/09-ch07-chapter-7.txt:287(搜「Number of nodes (people): 5」)
三项兴趣的名字Chapter 7text/09-ch07-chapter-7.txt:331(搜「Lesen」)
给邻居学权重Chapter 7text/09-ch07-chapter-7.txt:486(搜「learns an individual weighting」)
勘误 GAT 全称Chapter 7text/09-ch07-chapter-7.txt:482(搜「graph attention transformer」)
三类任务Chapter 7text/09-ch07-chapter-7.txt:156(搜「Node classification」) · text/09-ch07-chapter-7.txt:164(搜「Link prediction」) · text/09-ch07-chapter-7.txt:176(搜「Graph classification」)
Cora 数据集与词袋Chapter 7text/09-ch07-chapter-7.txt:366(搜「Cora Dataset」) · text/09-ch07-chapter-7.txt:372(搜「bag-of-words」)
数据规模与三份划分Chapter 7text/09-ch07-chapter-7.txt:430(搜「Number of graphs: 1」) · text/09-ch07-chapter-7.txt:438(搜「Number of training nodes: 140」)
七个类与基线Chapter 7text/09-ch07-chapter-7.txt:448(搜「Probabilistic methods」) · text/09-ch07-chapter-7.txt:469(搜「Class 0: 351 nodes」) · text/09-ch07-chapter-7.txt:476(搜「Dummy Classifier: 0.3190」)
模型结构、dropout、ELU、log_softmaxChapter 7text/09-ch07-chapter-7.txt:491(搜「exponential linear unit」) · text/09-ch07-chapter-7.txt:496(搜「log_softmax」) · text/09-ch07-chapter-7.txt:499(搜「class GAT」)
优化器与训练路标Chapter 7text/09-ch07-chapter-7.txt:522(搜「weight_decay=5e-4」) · text/09-ch07-chapter-7.txt:582(搜「Epoch: 020」)
测试成绩与表示可视化Chapter 7text/09-ch07-chapter-7.txt:627(搜「Final Test Accuracy: 0.8210」) · text/09-ch07-chapter-7.txt:660(搜「clearly separated from each other」)

Footnotes

  1. 出处:「Chapter 7 Graph Neural Networks」第 366-376 段的信息框(text/09-ch07-chapter-7.txt:366,搜「Cora Dataset」)与第 430-441 段(text/09-ch07-chapter-7.txt:438,搜「Number of training nodes: 140」)。原文:Cora 是一张科学出版物的引用网络,每篇被归入七个研究类别之一,比如「神经网络」或「概率方法」;我们要训一个节点分类模型,目标是结合一篇论文自己的特征和它在网络中的连接来预测它的类别。

  2. 出处:「Chapter 7」第 5-9 段(text/09-ch07-chapter-7.txt:5,搜「isolated units」)。原文:常规模型一般把数据点看成孤立的单位,而一旦数据点不再彼此独立、而是互相连接,这种做法就到了极限;图神经网络认识到,只有把数据点之间的连接考虑进来,完整的信息内容才不再被隐藏。

  3. 出处:「Chapter 7」第 7 段(text/09-ch07-chapter-7.txt:7,搜「forecasting traffic」)。原文三个例子:分析社交网络、预测交通、以及在金融领域识别欺诈模式。原文还说图能建模生物网络、交通路线和论文之间的引用(text/09-ch07-chapter-7.txt:30,搜「biological networks」)。

  4. 出处:「Chapter 7」第 17-23 段(text/09-ch07-chapter-7.txt:17,搜「two basic components」)。原文:图是一种表示一组对象以及这些对象之间关系的数学结构,总是由两个基本部分组成 —— 节点(图里的对象,比如社交网络里的人)和边(节点之间的连接,比如两个人之间的朋友关系)。

  5. 出处:「Chapter 7」第 25-29 段(text/09-ch07-chapter-7.txt:25,搜「directional and nondirectional」)。原文:有向边像单行道;在社交网络的例子里,一条有向边可以表示甲对乙的兴趣 —— 如果甲喜欢乙而乙不喜欢甲,那就是有向边;如果两人互相喜欢,那就是无向边(或者说双向边)。

  6. 出处:「Chapter 7」第 52-56 段(text/09-ch07-chapter-7.txt:53,搜「square matrix that represents the connections」)与第 63-67 段。原文:邻接矩阵是一个方阵,行和列都代表节点,行可以代表源节点、列代表目标节点,矩阵里的值表示两个节点之间有没有连接。原文那三条规则的符号在书里是图片,提取出来是空的,所以上面那三条是按文字描述补写的。

  7. 出处:「Chapter 7」第 57-61 段(text/09-ch07-chapter-7.txt:58,搜「connection points from node B to node C」)与第 69-78 段的矩阵(text/09-ch07-chapter-7.txt:71,搜「A 0 0」)。原文的读法示范:有一条边从 B 指向 C,在矩阵里找第二行(源节点 B)和第三列(目标节点 C),交叉处是 1。

  8. 出处:「Chapter 7」第 80-81 段(text/09-ch07-chapter-7.txt:80,搜「always symmetrical」)。原文:无向图的邻接矩阵总是对称的,因为 A 与 B 之间的连接和 B 与 A 之间的连接是同一件事;有向图则不对称,例子里就是这样。

  9. 出处:「Chapter 7」第 83-96 段(text/09-ch07-chapter-7.txt:84,搜「certain characteristics」与 text/09-ch07-chapter-7.txt:90,搜「Hamburg」)。原文:节点也可以带有特定的属性;如果节点代表人,这些属性就代表这些人的具体性质,图 7.3 给出的是五个节点的特征矩阵 —— 年龄与城市。

  10. 出处:「Chapter 7」第 121-130 段(text/09-ch07-chapter-7.txt:122,搜「direct neighbors of B」)。原文三步:识别出 B 的直接邻居 —— 这里是 C、D、A;图网络层收集这些邻居节点的属性(称为消息),也就是它们的特征向量,图里每个褐色方块代表一个处理邻居特征的聚合函数,这个函数可以是平均、求和,或者更复杂的运算;把汇总来的邻居信息与目标节点 B 原有的特征结合起来,结果是 B 的一份新的、更新过的特征表示,里面包含了它邻居的知识。

  11. 出处:「Chapter 7」第 132-137 段(text/09-ch07-chapter-7.txt:133,搜「neighbors of the neighbors」)。原文:这个过程对图里每个节点重复;信息通过图网络的若干层流向更远的距离,于是一个节点会纳入它「邻居的邻居」的特征,依此类推;每多一层,一个节点的表示就变得更丰富,因为它吸收了越来越远的邻居的信息。

  12. 出处:「Chapter 7」第 133-137 段(text/09-ch07-chapter-7.txt:134,搜「embedding) that reflects」)。原文:这创造出一种被称为嵌入的表示,它不仅反映局部结构,也反映图的更全局的结构;到最后,这些嵌入把整张图的结构编码在里面,对分类这类下游任务非常有用。

  13. 出处:「Chapter 7」第 255-263 段(text/09-ch07-chapter-7.txt:255,搜「person_interests = {」)与第 331 段(text/09-ch07-chapter-7.txt:331,搜「Lesen」)。三项兴趣在原书的可视化代码里写的是德语 Lesen / Laufen / Kochen,也就是读书 / 跑步 / 做饭。

  14. 出处:「Chapter 7」第 221-241 段(text/09-ch07-chapter-7.txt:224,搜「Clique among Bert」)与第 287-295 段(text/09-ch07-chapter-7.txt:287,搜「Number of nodes (people): 5」)。原文的建图函数先把 Bert、Lea、Elisa、Kiki 四人两两连边,再单独加一条 Bert–Steve;打印结果是 5 个节点、3 个节点特征、7 条边。

  15. 出处:「Chapter 7」第 484-489 段(text/09-ch07-chapter-7.txt:486,搜「learns an individual weighting」)。原文:这种层为每个节点的每一个邻居学出一个各自的权重,评估哪些邻居对更新该节点的特征最重要;它给对目标节点的分类更相关的邻居更高的权重,使其对新的节点表示贡献更多。

  16. 出处:「Chapter 7」第 499-514 段的模型代码(text/09-ch07-chapter-7.txt:502,搜「heads=heads」)与第 521 段(text/09-ch07-chapter-7.txt:521,搜「num_hidden=8, num_classes」)。第一层 heads=8、每套 8 维,拼起来是 64;第二层 heads=1 且不拼接,直接输出类别数。

  17. 出处:「Chapter 7」第 482-483 段(text/09-ch07-chapter-7.txt:482,搜「graph attention transformer」)与第 484-485 段(text/09-ch07-chapter-7.txt:485,搜「transformer-based approach」)。原文:「我们在搭一个 graph attention transformer(GAT)网络」,以及「GATConv 层……用一种基于 transformer 的方法实现消息传递机制」。补充(不在书里,依据我们的 ai-book-reference 书架):GAT 的注意力只在局部邻域内做。 依据: book=nndl-2e §24-classic-gnn 事实=该章明确划界 —— GAT 的注意力仍局限在局部邻域内,不是 Transformer 那种全节点自注意力,它仍然是消息传递式模型。

  18. 出处:「Chapter 7」第 140-183 段(text/09-ch07-chapter-7.txt:156,搜「Node classification」、text/09-ch07-chapter-7.txt:164,搜「Link prediction」、text/09-ch07-chapter-7.txt:176,搜「Graph classification」)。原文的用例:节点分类用来在社交网络里检测骗子和垃圾机器人、在资金流网络里发现可疑或欺诈账户;链接预测用于推荐系统、社交与交友平台的配对建议、知识图谱补全、以及基因研究里预测新的蛋白质相互作用;图分类常用于化学 —— 把分子表示成图(原子为节点、化学键为边),预测这个分子是否有毒或具有某种性质。

  19. 出处:「Chapter 7」第 171-175 段(text/09-ch07-chapter-7.txt:172,搜「graphs to complete missing facts」)。原文:链接预测在知识图谱里被大量用于补全缺失的事实(例如预测某家公司的所属国家),从而丰富和验证大型数据库。

  20. 出处:「Chapter 7」第 418-441 段(text/09-ch07-chapter-7.txt:430,搜「Number of graphs: 1」)与第 446-453 段(text/09-ch07-chapter-7.txt:448,搜「Probabilistic methods」)。打印结果:1 张图、1433 个特征、7 个类、2708 个节点、10556 条边,而且这张图是无向的。

  21. 出处:「Chapter 7」第 372-376 段(text/09-ch07-chapter-7.txt:372,搜「bag-of-words」)。原文:特征采用词袋方法 —— 把节点的文本(比如一篇文档或一段简介)转成一个向量,只统计某些词出现的情况、忽略词序;特征向量的每一维对应词典里一个特定的词,值为 1 表示这个词出现过,为 0 表示没出现。

  22. 出处:「Chapter 7」第 438-440 段(text/09-ch07-chapter-7.txt:438,搜「Number of training nodes: 140」)。三个数:训练 140、验证 500、测试 1000。

  23. 出处:「Chapter 7」第 458-480 段(text/09-ch07-chapter-7.txt:469,搜「Class 0: 351 nodes」与 text/09-ch07-chapter-7.txt:476,搜「Dummy Classifier: 0.3190」)。七类的节点数依次是 351、217、418、818、426、298、180;永远预测多数类的基线在测试集上是 31.90%。

  24. 出处:「Chapter 7」第 499-514 段(text/09-ch07-chapter-7.txt:499,搜「class GAT」)。代码里两层 GATConv,dropout 都是 0.6,forward 里在两层之前各做一次 F.dropout(p=0.6)

  25. 出处:「Chapter 7」第 490-495 段(text/09-ch07-chapter-7.txt:491,搜「exponential linear unit」)。原文:除了核心部件之外还用了 dropout 层来避免过拟合,并用指数线性单元(ELU)做激活;ELU 是 ReLU 的一个变体,正值部分与输入相同、和普通 ReLU 一致,但负值部分不输出 0,而是输出一条指数衰减的曲线,这避开了神经元死亡的问题。

  26. 出处:「Chapter 7」第 496-497 段(text/09-ch07-chapter-7.txt:496,搜「log_softmax」)与第 523 段(text/09-ch07-chapter-7.txt:523,搜「NLLLoss」)。原文:模型最后一层用 log_softmax 激活,因为它在数值上比 softmax 与 log 的组合更稳定。这一对搭配就是第 04 章列出的两个选项之一(text/06-ch04-chapter-4.txt:1149,搜「LogSoftmax」)。

  27. 出处:「Chapter 7」第 521-523 段(text/09-ch07-chapter-7.txt:522,搜「weight_decay=5e-4」)与第 562 段(text/09-ch07-chapter-7.txt:562,搜「num_epochs = 200」)。weight_decay 是一种防过拟合的手段,书没有展开解释。

  28. 出处:「Chapter 7」第 581-585 段(text/09-ch07-chapter-7.txt:582,搜「Epoch: 020」)。原文两行:第 20 轮损失 1.5871、训练准确率 0.9429、验证 0.7540;第 200 轮损失 0.6110、训练 1.0000、验证 0.7960。书对这张表的评语见第 618-619 段(text/09-ch07-chapter-7.txt:618,搜「approach an asymptotic value」):训练损失下降得很好并逼近一个渐近值,同时训练与验证准确率都稳定在很高的水平。

  29. 出处:「Chapter 7」第 620-627 段(text/09-ch07-chapter-7.txt:627,搜「Final Test Accuracy: 0.8210」)。原文:这个数超过 82%,因此远高于基线,说明模型给出了非常好的结果。

  30. 出处:「Chapter 7」第 631-661 段(text/09-ch07-chapter-7.txt:660,搜「clearly separated from each other」)。原文用的降维方法叫 t-SNE,把高维数据变成二维或三维来看相似性和聚簇(text/09-ch07-chapter-7.txt:379,搜「dimension reduction」);可视化的结果是各个类别在很大程度上能被清楚地分开,说明模型把同类数据聚成了簇、不同簇彼此远离。

  31. 补充(不在书里,依据我们的 ai-book-reference 书架):全书没有提到 GAT 出自哪一年、哪一篇工作。依据: book=nndl-2e §24-classic-gnn 事实=该章把 GAT 列为四个经典图网络模型之一,讲清它补的是「GCN 的邻居权重固定」这个短板,并给出后续 GATv2 对原版静态注意力表达限制的改进。

  32. 补充(不在书里,依据我们的 ai-book-reference 书架):书没有提图网络叠层的代价。依据: book=nndl-2e §24-classic-gnn 事实=该章把「过度平滑」列为图网络绕不开的三道坎之一,现象是层数一多、所有节点的表示越来越像,并给出了缓解手段(加长程边或重连、残差、更强的读出机制)。