陈老师是初二(3)班的班主任,新学期要摸清全班 50 个同学的物理掌握情况。可时间只够批改 5 本作业。幸运的是,每个同学都有入学测试的成绩单(节点特征),而且同学之间存在一张友谊网(图结构)——小张和小李是同桌,小李又和小王是球友。陈老师的思路很巧妙:只严格批改 5 本作业,然后让全班在课间互相讲题:每个人先看看自己的答案,再听听朋友们的答案,综合出一个新理解。这样讲两三轮之后,全班 50 个人的掌握情况就大致清楚了。哪怕只批改 5 本作业,靠着“少量标签 + 一张关系网 + 信息在网上的流动”,也能对全班做出判断。这就是半监督节点分类:图上只有少量节点有标签,却要对所有节点完成分类。

岗位关联

对 AI 从业者而言,掌握半监督节点分类,等于掌握了在标注成本高昂的工业界用图结构撬动全图标签的实战能力——这是图神经网络落地最经典、最有复用价值的一把钥匙。

目录
  1. 可视化演示
  2. 任务定义
  3. 邻接矩阵
  4. 消息传递
  5. 标签利用
  6. 损失函数
  7. 过平滑问题
  8. 实践应用
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

半监督节点分类任务 已标签节点A 已标签节点B 未标签节点 H^(l+1) = σ(D^(-1/2) A D^(-1/2) H^(l) W^(l)) Y^(t+1) = α S Y^(t) + (1-α) Y^(0) 半监督节点分类可视化:展示任务定义、信息传递...

任务定义

陈老师要摸清全班 50 个人的掌握情况,却只批改了 5 本作业。好消息是,这 5 本作业不是孤岛——每个学生都有入学成绩单(节点特征),学生之间还连着友谊网(图结构)。半监督节点分类要解决的,正是“少量标签 + 大量无标签 + 一张关系网”三者并存时,如何对全图节点完成分类。它图神经网络最经典的应用设定,也是 GNN 教材里第一个被讲透的任务。

在图论的术语里,这张友谊网叫图 \(G=(V,E)\):\(V\) 是节点集合(学生),\(E\) 是边集合(友谊)。每个节点携带特征向量 \(X\)(成绩单),只有 \(V_L\) 里的节点有标签(批改过的作业),剩下的 \(V_U\) 没有标签(没批改的作业)。模型要做的事情是学习一个映射,输入整张图和少量标签,输出所有节点的类别预测。这里的关键词是直推式:测试节点在训练时就“坐在教室里”,图结构完全可见,只是标签缺失。

f:(G,X,YL)→Y^V\displaystyle f: (G, X, Y_L) \rightarrow \hat{Y}_V

1. 图结构 \(G\):输入整张关系网,包含全部节点与边,是信息传播的舞台。

G=(V,E)G = (V, E)

2. 特征矩阵 \(X\):所有节点的属性特征,相当于每个学生的成绩单。

X∈R∣V∣×dX \in \mathbb{R}^{|V| \times d}

3. 少量标签 \(Y_L\):只有部分节点有真实标签,是监督信号的唯一来源。

YL={yi∣i∈VL},∣VL∣≪∣V∣Y_L = \{ y_i \mid i \in V_L \}, \quad |V_L| \ll |V|

4. 全图预测 \(\hat{Y}_V\):模型要对图中每个节点输出一个类别,而不仅仅是标签节点。

Y^V={y^i∣i∈V}\hat{Y}_V = \{ \hat{y}_i \mid i \in V \}

陈老师的“5 本作业”就是 \(Y_L\),全班 50 人的评语就是 \(\hat{Y}_V\)。半监督节点分类的精髓,在于让那 5 本作业的价值通过关系网放大 10 倍——这正是标注成本高昂的工业场景最需要的能力。

邻接矩阵

陈老师的抽屉里有一本“友谊册”,每一页记录一对好朋友的名字。如果把友谊册画成一张大表格:横轴是全班 50 人的名字,纵轴也是,第 \(i\) 行第 \(j\) 列打一个勾,表示 \(i\) 和 \(j\) 是朋友——这张表格的数学名字就叫邻接矩阵。它是图结构在计算机里的存在形式,也是所有图算法开始的地方。

邻接矩阵 \(A\) 中 \(A_{ij}=1\) 表示节点 \(i\) 与 \(j\) 之间有边,对角线通常为 0(自己不和自己交朋友)。但在传播信息时,我们会给每个节点加上“自环”:\(\tilde{A} = A + I\),相当于每个人讲题时先复述自己的答案,再听朋友的。光有矩阵还不够——如果直接取平均,人缘好(度数高)的同学会淹没所有人的声音。所以 GCN 采用对称归一化:

A^=D~−1/2A~D~−1/2,A~=A+IN\displaystyle \hat{A} = \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2}, \quad \tilde{A} = A + I_N

1. 原始邻接矩阵 \(A\):记录节点间的连边关系,第 \(i\) 行第 \(j\) 列为 1 表示有边。

Aij={1,(i,j)∈E0,otherwiseA_{ij} = \begin{cases} 1, & (i,j) \in E \\ 0, & \text{otherwise} \end{cases}

2. 加自环 \(\tilde{A} = A + I_N\):对角线补上 1,让节点聚合时包含自身信息。

A~=A+IN\tilde{A} = A + I_N

3. 度矩阵 \(\tilde{D}\):对角的每个元素是节点(含自环)的连接数,是“人缘指数”。

D~ii=∑jA~ij\tilde{D}_{ii} = \sum_j \tilde{A}_{ij}

4. 对称归一化 \(\tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2}\):左右各乘一个 \(-1/2\) 次幂矩阵,同时平衡出度与入度的影响,保证数值稳定。

A^=D~−1/2A~D~−1/2\hat{A} = \tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2}

友谊册经过归一化处理,就像老师定了一条规则:“朋友多的同学发言要简练,朋友少的同学给予更多倾听权重,最后每个人先说自己答案再综合朋友。” 邻接矩阵从此不再是冷冰冰的 0 和 1,而是一张承载公平传播的通道地图。

消息传递

课间讲题的场景是这样的:每个同学先把自己作业本上的答案写在笔记本上,然后问问周围几个好朋友的答案,最后综合出一份新笔记。下一节课间,再拿着新笔记和朋友们交换一次。这就是图神经网络的灵魂——消息传递:每一轮,节点收集邻居的表征,融合成自己的新表征。

GCN 的一层完整地做了三件事:收集(通过 \(\hat{A}\) 把邻居表征加权聚合过来)、变换(乘以权重矩阵 \(W\) 做线性映射)、激活(用 \(\sigma\) 引入非线性)。层数就是讲题轮数:一层只看直接朋友,两层就能看到朋友的朋友。把多个 GCN 层堆叠起来,就得到一个多跳的信息传播网络。第 \(l\) 层到第 \(l+1\) 层的更新公式是:

H(l+1)=σ(A^ H(l) W(l))\displaystyle H^{(l+1)} = \sigma\left( \hat{A} \, H^{(l)} \, W^{(l)} \right)

1. 节点表征矩阵 \(H^{(l)}\):第 \(l\) 层所有节点的特征向量集合,每一行是一个节点。

H(l)∈RN×dlH^{(l)} \in \mathbb{R}^{N \times d_l}

2. 归一化邻接矩阵 \(\hat{A}\):决定“谁向谁聚合”,乘法把邻居的表征加权求和到中心节点。

A^ H(l)\hat{A} \, H^{(l)}

3. 权重矩阵 \(W^{(l)}\):第 \(l\) 层可学习的线性变换参数,通过反向传播更新,相当于“怎么消化听到的答案”。

W(l)∈Rdl×dl+1W^{(l)} \in \mathbb{R}^{d_l \times d_{l+1}}

4. 激活函数 \(\sigma\):引入非线性(常用 ReLU),让模型能表达复杂模式,而不是简单叠加。

σ(x)=max⁡(0,x)\sigma(x) = \max(0, x)

每一层 GCN 就是一次“课间讲题”:把朋友的笔记拿来,提炼,更新自己的笔记。两层之后,小张的笔记里既有同桌小李的观点,也有小李球友小王的影响——信息沿着友谊链越传越远。但要小心,讲题轮数太多,全班也许会变成同一个复读机,这就是后话的“过平滑”。

标签利用

5 本批改好的作业,是整个班级知识传播的“火种”。火种如何点燃全班?答案是让火种顺着友谊链烧过去。经典的标签传播算法给出了一个直观模型:每轮迭代,节点把自己的标签“广播”给邻居,同时“听取”邻居们当前的标签分布,然后更新自己的分布。如此反复,标签就像墨水一样,沿着边一点点渗开。

用数学表示,设 \(P^{(t)}\) 是第 \(t\) 轮所有节点的标签软分布矩阵,行归一化的邻接矩阵 \(D^{-1}A\) 负责把邻居的标签平均过来:

P(t+1)=D−1A P(t)\displaystyle P^{(t+1)} = D^{-1} A \, P^{(t)}

1. 标签分布矩阵 \(P^{(t)}\):第 \(t\) 轮每个节点的类别概率分布,行和为 1。

P(t)∈RN×CP^{(t)} \in \mathbb{R}^{N \times C}

2. 邻接矩阵 \(A\):提供标签流动的通道,只有相连的节点才互相影响。

A P(t)A \, P^{(t)}

3. 行归一化 \(D^{-1}\):对每行求和归一化,确保传播后分布仍是合法的概率分布。

(D−1A)ij=Aij∑kAik(D^{-1}A)_{ij} = \frac{A_{ij}}{\sum_k A_{ik}}

4. 迭代轮数 \(t\):每迭代一轮,标签沿边扩散一跳;轮数越多影响范围越广。

t→t+1t \rightarrow t+1

GNN 的标签利用策略比朴素传播更聪明:不是直接复制标签,而是把“少量标签的监督”与“图结构的信息传播”放进同一个训练过程。实际操作中用掩码训练:前向传播让所有节点参与,反向传播时损失只从有标签节点回传,无标签节点当好“传话筒”。直推式模型(固定图上学到的传播)与归纳式模型(学会传播规则后用于新图)的区别,正在于这 5 个火种点燃的是“这一班”还是“以后每一班”。

损失函数

全班都在热火朝天地讲题,但陈老师评价自己教得怎么样,唯一依据还是那 5 本批改过的作业——他只关心这 5 本的对错,其余 45 本不评分。这就是半监督里“监督”二字的真意:损失函数只在有标签节点上计算。

模型输出 \(Z_{ic}\) 表示节点 \(i\) 属于类别 \(c\) 的预测概率;真实标签用 one-hot 编码 \(Y_{ic}\)(属于该类取 1,否则取 0)。半监督节点分类最常用的损失是交叉熵,求和范围被刻意限制在 \(V_L\) 上:

L=−∑i∈VL∑c=1CYic ln⁡Zic\displaystyle L = -\sum_{i \in V_L} \sum_{c=1}^{C} Y_{ic} \, \ln Z_{ic}

1. 有标签节点集合 \(V_L\):损失只在这批节点上计算,其他节点不提供监督信号。

VL⊂V,∣VL∣≪∣V∣V_L \subset V, \quad |V_L| \ll |V|

2. 真实标签 \(Y_{ic}\):第 \(i\) 个节点的第 \(c\) 类 one-hot 取值,非 0 即 1。

Yic={1,yi=c0,otherwiseY_{ic} = \begin{cases} 1, & y_i = c \\ 0, & \text{otherwise} \end{cases}

3. 预测概率 \(Z_{ic}\):模型输出经 softmax 后的概率,衡量“模型有多相信 i 属于 c”。

Zic=exp⁡(logitic)∑c′exp⁡(logitic′)Z_{ic} = \frac{\exp(\text{logit}_{ic})}{\sum_{c'} \exp(\text{logit}_{ic'})}

4. 自然对数 \(\ln\):对概率取对数作为惩罚尺度——预测越错,惩罚越大。

−ln⁡Zic-\ln Z_{ic}

5. 双重求和:先遍历每个有标签节点,再对该节点的所有类别求和,汇总成总损失。

∑i∈VL∑c=1C\sum_{i \in V_L} \sum_{c=1}^{C}

无标签节点虽然没有损失项,但它们通过消息传递把标签信息“搬运”到了自己的表征里,从而间接影响模型的参数更新——这就是半监督的隐式正则。老师只批改 5 本作业,全班却都听了讲题,所以这 5 本作业的质量就是全班的“晴雨表”:用极少的反馈,驱动一张极大的网络。

过平滑问题

假如课间讲题无限循环下去,会发生什么?第一轮,小张听到小李的观点;第二轮,小李的观点里已经混入小王;五十轮之后,全班每个人的笔记都变成“全班观点的平均数”——大家的笔记几乎一模一样,个性全无。这就是图神经网络的过平滑问题:随着层数加深,节点的表征向量趋向一致,节点之间不再可分。

过平滑是 GCN 的天生缺陷。每一层传播都是一次“加权平均”,反复平均会把信息磨平。数学上,两个节点的表征距离随层数增加急剧衰减:

Δ(l)=∥Hi(l)−Hj(l)∥2→0\displaystyle \Delta^{(l)} = \left\| H_i^{(l)} - H_j^{(l)} \right\|_2 \rightarrow 0

1. 表征差异 \(\Delta^{(l)}\):第 \(l\) 层两个节点表征向量的距离,衡量它们“有多不同”。

Δ(l)=∥Hi(l)−Hj(l)∥2\Delta^{(l)} = \| H_i^{(l)} - H_j^{(l)} \|_2

2. 第 \(l\) 层表征 \(H_i^{(l)}\):经过 \(l\) 轮传播后节点 \(i\) 的特征向量。

Hi(l)∈RdH_i^{(l)} \in \mathbb{R}^{d}

3. 欧氏范数 \(\|\cdot\|_2\):向量差的长度的平方和开根号,值是标量距离。

∑k(Hik(l)−Hjk(l))2\sqrt{\sum_k (H_{ik}^{(l)} - H_{jk}^{(l)})^2}

4. 趋近于零 \(\rightarrow 0\):层数加深时距离不断缩小,最后所有节点挤成一团。

lim⁡l→∞Δ(l)=0\lim_{l \to \infty} \Delta^{(l)} = 0

缓解过平滑的主流手段有三:残差连接——把浅层的“个性”直接加到深层表征上,走捷径保住自我;DropEdge——训练时随机丢弃一部分边,打乱“温水煮青蛙”式的平滑过程;以及 PairNorm 等表征归一化技巧。它们的本质都是在“信息充分传播”和“保留节点个性”之间找平衡。陈老师绝不会让讲题无限循环——讲两三轮,让知识扩散到位就收,再讲下去全班就变成同一个复读机了。

实践应用

陈老师这套“少批改、多讲题”的方法,后来被推广到整个年级:只批改少量作业,靠学生互助网络评估全年级的掌握情况。图神经网络的半监督节点分类,在真实世界里正是这个逻辑的大规模复刻。

最经典的应用是引文网络分类:论文是节点,引用关系是边,标签是研究领域。在 Cora 数据集上,2708 篇论文、5429 条引用边、7 个领域,GCN 只需每类标注 20 篇(共 140 篇),就能对全部论文达到 81% 以上的分类准确率。同样的套路还出现在社交网络(用户是节点,关注是边,预测兴趣人群)、学术搜索(冷启动论文的领域推荐)、金融风控(转账网络中的欺诈团伙识别)。衡量效果的标准指标是准确率:

Acc=1∣Vtest∣∑i∈Vtest1(y^i=yi)\displaystyle \text{Acc} = \frac{1}{|V_{\text{test}}|} \sum_{i \in V_{\text{test}}} \mathbb{1}(\hat{y}_i = y_i)

1. 测试节点集合 \(V_{\text{test}}\):没有标签、等待被预测的节点。

Vtest⊆VUV_{\text{test}} \subseteq V_U

2. 预测标签 \(\hat{y}_i\):模型对节点 \(i\) 输出的类别。

y^i=arg⁡max⁡cZic\hat{y}_i = \arg\max_c Z_{ic}

3. 指示函数 \(\mathbb{1}(\cdot)\):括号内等式成立记 1,否则记 0,用于数“猜对了几道题”。

1(y^i=yi)={1,相等0,不等\mathbb{1}(\hat{y}_i = y_i) = \begin{cases} 1, & \text{相等} \\ 0, & \text{不等} \end{cases}

4. 求平均:把猜对的个数除以测试总数,得到正确率。

1∣Vtest∣∑i∈Vtest⋯\frac{1}{|V_{\text{test}}|} \sum_{i \in V_{\text{test}}} \cdots

从一间教室到一个年级,从 50 个同学到几百万篇论文,本质从未改变:只批改几本作业,让信息沿着关系网流动,最后全班全年级都学会了。半监督节点分类不是炫技,而是在“标注太贵”的现实约束下,用图结构换来的最朴素的杠杆。

AI 应用场景

学术搜索引擎的论文领域标注

阶段:模型训练与评估

解决的问题:每年新增论文数以百万计,人工标注研究领域成本极高、时效性差。传统文本分类方法需要大量标注语料,而引用关系——这篇论文引用了谁、被谁引用——是现成且廉价的信号。

具体案例:在 Cora 引文网络上,以论文为节点、引用关系为边,只标注每类 20 篇论文(共 140 篇),用两层 GCN 做半监督节点分类,即可对全部 2708 篇论文给出领域预测,准确率超 81%。微软学术、语义学者等搜索引擎可直接用此方案加速新论文的领域归类。

社交平台冷启动兴趣预测

阶段:特征工程与在线推断

解决的问题:新注册用户没有任何行为历史,传统推荐系统无法判断其兴趣。但如果知道“他关注了谁”,就能借助关注关系网,从少量已标注兴趣的老用户身上把兴趣标签“传播”给新用户。

具体案例:把用户作为节点、关注关系作为边;一小部分用户主动填写了兴趣标签(如游戏、数码、健身),其余用户无标签。训练一个半监督 GNN 分类器,对新用户的兴趣做全量预测,冷启动推荐的点击率可提升 30% 以上。

金融风控的欺诈团伙识别

阶段:数据挖掘与风险建模

解决的问题:已知欺诈账号在全部账户中占比极低,监督信号稀疏;但欺诈行为常以团伙形式出现——同一团伙的账户之间存在密集的转账、代付关系。半监督节点分类能利用转账网络把“少量已知欺诈标签”扩散到可疑团伙全貌。

具体案例:以银行卡号或账户为节点、转账流水为边构建交易图,把已确认的欺诈账户作为标签种子,用 GCN 预测全部账户的风险分。模型能在召回率不下降的前提下,比规则引擎多识别约 40% 的可疑团伙成员。

Python 演示

python63 行
import numpy as np np.random.seed(0)N = 40adj = np.zeros((N, N), dtype=float)for i in range(N):    adj[i, (i + 1) % N] = 1.0    adj[i, (i + 2) % N] = 1.0    adj[(i + 1) % N, i] = 1.0    adj[(i + 2) % N, i] = 1.0for i in range(N):    for j in range(i + 1, N):        if np.random.rand() < 0.08:            adj[i, j] = adj[j, i] = 1.0 rng = np.random.RandomState(1)X = rng.randn(N, 2)labels = np.zeros(N, dtype=int)for i in range(N):    if X[i, 0] + X[i, 1] > 0.5:        labels[i] = 2    elif X[i, 0] < 0:        labels[i] = 0    else:        labels[i] = 1 A_hat = adj + np.eye(N)D_inv = np.diag(1.0 / np.sqrt(A_hat.sum(axis=1)))A_norm = D_inv @ A_hat @ D_inv def relu(x):    return np.maximum(x, 0) Y = np.eye(3)[labels]train_idx = np.array([0, 15, 30])train_mask = np.zeros(N, dtype=bool)train_mask[train_idx] = True W1 = rng.randn(2, 16) * 0.3W2 = rng.randn(16, 3) * 0.3lr = 0.2 for epoch in range(300):    P1 = A_norm @ X @ W1    H1 = relu(P1)    Z = A_norm @ H1 @ W2    E = np.exp(Z - Z.max(axis=1, keepdims=True))    S = E / E.sum(axis=1, keepdims=True)    loss = -np.sum(Y[train_idx] * np.log(S[train_idx] + 1e-12)) / len(train_idx)     dZ = (S - Y) * train_mask[:, None] / train_mask.sum()    dW2 = H1.T @ (A_norm @ dZ)    dH1 = (A_norm @ dZ) @ W2.T    dH1[P1 <= 0] = 0.0    dW1 = X.T @ (A_norm @ dH1)    W1 -= lr * dW1    W2 -= lr * dW2 pred = Z.argmax(axis=1)acc = (pred == labels).mean()print("训练损失:", round(loss, 4))print("全图准确率:", round(acc, 4))print("有标签节点预测:", pred[train_idx].tolist())
目的:用 NumPy 从零实现一个两层 GCN,在随机生成的图结构上演示半监督节点分类——只有 3 个节点有标签,却能预测全图 40 个节点的类别。
  1. A_hat = adj + np.eye(N)给邻接矩阵加自环,让传播时保留自身信息。
  2. D_inv = np.diag(1.0 / np.sqrt(A_hat.sum(axis=1)))由度矩阵构造 \(-1/2\) 次幂,为归一化做准备。
  3. A_norm = D_inv @ A_hat @ D_inv对称归一化邻接矩阵,GCN 传播的“通道地图”。
  4. P1 = A_norm @ X @ W1第一层消息传递:聚合邻居特征后做线性变换。
  5. H1 = relu(P1)ReLU 激活,引入非线性。
  6. Z = A_norm @ H1 @ W2第二层消息传递,输出每个节点的分类 logits。
  7. loss = -np.sum(Y[train_idx] * np.log(S[train_idx] + 1e-12)) / len(train_idx)半监督交叉熵:只对 3 个有标签节点计算损失。
  8. dZ = (S - Y) * train_mask[:, None] / train_mask.sum()梯度掩码:只回传有标签节点的误差,无标签节点当好“传话筒”。
  9. dH1[P1 <= 0] = 0.0ReLU 的梯度门控,负数区间梯度置零。
  10. pred = Z.argmax(axis=1)对全图节点取概率最大的类别,完成半监督分类。

常见误区

误区“半监督节点分类就是普通半监督学习,把节点特征丢进分类器就行。图结构嘛,属于锦上添花,用不用都行。”

正解图结构是半监督节点分类的命脉。消息传递让标签和特征沿着边扩散,无标签节点通过邻居关系间接参与表征学习——丢掉图结构后,这个问题退化成孤立节点分类,在标签极少时准确率会断崖式下跌。正如陈老师的 5 本作业,如果学生之间没有友谊网,就永远不可能变成全班 50 人的判断依据。

为何常见:习惯了表格数据的从业者天然把特征当成唯一信息源,低估了关系网络在标签稀疏时的杠杆作用。

误区“无标签节点也有信息,为什么不对它们也算损失?干脆把所有节点的预测都拿去算交叉熵,这样才叫充分利用数据。”

正解无标签节点没有真实标签,交叉熵无从算起。半监督的损失只对有标签节点计算;无标签节点通过消息传递在前向传播中“搬运”信息,在表征层面深度参与训练。强行给无标签节点套伪标签算损失,等于让老师把没批改的作业也当标准答案,只会引入噪声。

为何常见:全监督训练的心智模型根深蒂固,容易忽略“半监督”三个字背后的设定差异。

误区“深度学习不是越深越强吗?GCN 多叠几层,就能看到朋友的朋友的朋友,信息更丰富,效果肯定更好。”

正解GCN 超过 2-3 层后,反复的加权平均导致过平滑——节点表征趋向一致,分类边界消失,准确率急剧下降。实际调参时,加深模型不如加残差连接、DropEdge 或跳连接。陈老师不会让讲题无限循环,因为最后全班都会变成同一个复读机。

为何常见:CNN/Transformer 的“深度红利”直觉被迁移到 GNN,忽略了图卷积中的平均操作会主动抹平信息。

误区“模型在训练图上取得了好效果,直接拿去预测另一张图、另一批新节点,应该没问题吧?”

正解直推式学习(transductive)在训练时已经见过目标图的所有节点(包括无标签节点),模型学到的是“这张图上的传播结果”,换一张图就失效。归纳式学习(inductive)学的是传播规则本身,才能泛化到全新图与新节点。好比陈老师摸清了 3 班每个人的性格,换个班就得重新摸底;但如果他总结出的是“如何通过友谊网判断学生”,那去哪个班都管用。

为何常见:传统监督学习中训练/测试独立同分布的假设被默认套用,忽略了直推式“在固定图上推理”的特殊性。

误区“归一化不就是把矩阵缩放一下吗?代码里省掉这一步,模型照样能跑。”

正解归一化直接决定传播的数值稳定性。不归一化时,度数高的节点(大 V)信息会淹没度数低的节点(小透明),梯度也容易爆炸或消失。\(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}\) 让传播权重与节点度数解耦,是 GCN 能稳定训练的关键一步,而不是可选的工程优化。就像讲题规则必须先定“每个人发言机会均等”,否则全程只听班长一个人说。

为何常见:归一化看起来像“数据预处理”,容易被当成锦上添花的细节,实际上它是算法定义的一部分。

面试题

Q1. 半监督节点分类的核心任务设定是什么?

单选题 · easy

  • A.全部节点都具备完整标注信息
  • B.仅少量节点具备完整标注信息← 正确答案
  • C.隐藏所有节点标注仅靠特征
  • D.标签信息与图结构完全无关

答案:B。半监督节点分类的关键是“少量标签 + 全图预测”。B 准确描述了这一设定。A 是全监督,C 是纯无监督,D 否定了图结构的价值,均与半监督节点分类的定义不符。

Q2. 邻接矩阵 A 中元素值为 1 的含义:

单选题 · easy

  • A.两个节点之间存在连边关系← 正确答案
  • B.两个节点具有完全相同的特征
  • C.两个节点拥有完全相同的标签
  • D.两个节点处于不同层级关系

答案:A。邻接矩阵的每一行每一列对应节点,\(A_{ij}=1\) 表示节点 \(i\) 与 \(j\) 之间有边相连。B、C 描述的是特征与标签的相似性,D 描述层级关系,均记录在别处而非邻接矩阵中。

Q3. GCN 层中邻居信息聚合的方式:

单选题 · easy

  • A.对邻居特征进行加权平均聚合← 正确答案
  • B.随机丢弃部分邻居的特征信息
  • C.直接复制拥有标签节点的特征
  • D.忽略邻居直接使用自身特征信息

答案:A。GCN 的消息传递本质上是对邻居表征做加权平均(经归一化邻接矩阵后求和再变换)。DropEdge 是训练时的技巧而非聚合方式,复制标签与忽略邻居都不属于 GCN 的聚合机制。

Q4. 半监督节点分类的损失函数计算范围:

单选题 · mid

  • A.对所有节点预测结果计算损失
  • B.仅对有标注的节点计算交叉熵← 正确答案
  • C.仅对无标注的节点计算交叉熵
  • D.对边的两端节点分别计算损失

答案:B。半监督的“监督”部分只在有标签节点上计算交叉熵,无标签节点通过消息传递参与前向传播但不贡献损失。A 是全监督做法,C 无标签节点没有真实标签无法算损失,D 混淆了边与节点的概念。

Q5. 过平滑问题在深层网络中的表现:

单选题 · mid

  • A.不同节点的表征向量逐渐趋同一致← 正确答案
  • B.不同节点的表征向量越发分化独立
  • C.模型的训练收敛速度显著加快过程
  • D.无标签节点数量在训练中自动增多

答案:A。每层 GCN 都是一次加权平均,层数过多时所有节点反复平均,表征向量彼此趋同,节点不再可分——这正是“全班讲题变成复读机”的数学刻画。B 与过平滑相反,C、D 与过平滑现象无关。

Q6. 直推式学习与归纳式学习最核心的差异:

单选题 · mid

  • A.训练语料数据的整体规模大小不同
  • B.学习过程是否依赖固定的图结构← 正确答案
  • C.损失函数采用交叉熵还是均方误差
  • D.模型中激活函数选择的不同类型

答案:B。直推式模型在固定图上训练与预测,测试节点训练时就可见;归纳式模型学习传播规则,可泛化到全新图。区别不在数据量、损失函数或激活函数,而在是否绑定这张特定的图。

Q7. 邻接矩阵加入自连接的主要目的是:

单选题 · mid

  • A.使每个节点的度数完全一致相同
  • B.聚合时保留节点自身的特征信息← 正确答案
  • C.减少图中全部边的总数以简化计算
  • D.将节点特征矩阵进行转置处理操作

答案:B。\(\tilde{A}=A+I\) 在邻接矩阵对角线加 1,使聚合操作把自己的一阶表示也纳入加权平均,防止节点“只听邻居、忘了自己”。它不改变度数的绝对一致,不减少边数,也与矩阵转置无关。

Q8. 缓解图神经网络过平滑问题的有效措施:

多选题 · hard

  • A.训练时随机丢弃图的一部分连边关系← 正确答案
  • B.在层之间引入残差连接保留自身特征← 正确答案
  • C.无限加深网络层数以扩大感受野的范围
  • D.删除所有无标签节点只用有标签节点训练

答案:AB。DropEdge 随机丢边能打乱反复平均的过程,残差连接把浅层表征直接接到深层、保留节点个性,两者都是对抗过平滑的主流手段。无限加深会加重过平滑,删除无标签节点则抛弃了图结构的核心价值。

Q9. 关于半监督节点分类机制的正确描述有哪些:

多选题 · hard

  • A.图结构充当标签在节点间的传播桥梁← 正确答案
  • B.监督损失仅计算带有标签的标注节点← 正确答案
  • C.无标签节点完全不参与模型的训练过程
  • D.节点特征与图结构信息被协同地利用起来← 正确答案

答案:ABD。消息传递让标签沿边扩散,是图结构的核心价值;损失只在有标签节点上计算;节点特征与图结构通过聚合操作协同工作。C 错误——无标签节点虽然不算损失,但在前向传播中参与信息传递,影响模型学习。

Q10. GCN 归一化 \(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}\) 的本质作用:

单选题 · extreme

  • A.消除节点特征矩阵中存在的数值噪声干扰
  • B.平衡高度数与低度数节点的传播影响权重← 正确答案
  • C.将任意图结构强制转换为完全连通图的结构
  • D.令邻接矩阵满足可逆条件的数学变换操作

答案:B。对称归一化让传播权重与节点度数解耦——高度数节点的信息被适度压低,低度数节点不被淹没,保证传播公平且数值稳定。它不处理特征噪声,不改变图拓扑,也不以可逆性为目的。就像讲题规则要求“朋友多的让着点朋友少的”,每个人都能被听见。