想象一座名叫“图灵村”的小村庄,每户人家就是图中的一个节点,连接房屋的土路就是边。每户门口都挂着一块黑板(特征向量),写着自家最近的见闻。村民们想知道全村动态,光待在家里不行——他们得去邻居家串门,听邻居讲见闻,回家后把新收获写在自家黑板上。第二天,邻居的邻居的消息也顺着串门传了过来,黑板上的信息越来越丰富。 这就是消息传递框架(Message Passing)的朴素直觉:图神经网络(GNN)要做的事,就是让每个节点反复“串门”——从邻居收集消息,把消息汇总,再更新自己的状态。 无论 GCN、GAT 还是 GraphSAGE,本质都是这三步的变体。本文会用这个村庄故事,带你彻底看懂这套 GNN 世界的“村规民约”。

岗位关联

职业价值:掌握消息传递框架,等于拿到解读一切 GNN 论文的“万能钥匙”——任何新图神经网络,你都能通过“消息函数、聚合函数、更新函数”三个视角快速拆解,并设计属于自己的架构。

目录
  1. 可视化演示
  2. 核心思想:邻里串门
  3. 消息函数:写纸条的艺术
  4. 聚合函数:整理一桌纸条
  5. 更新函数:更新自家黑板
  6. 经典变体:三位村长
  7. 统一范式:一部村规民约
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示消息传递框架的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

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

消息传递框架:消息传递 消息传递框架的核心思想与统一性 消息函数的设计与特征变换 核心机制可视化 消息传递框架整体架构与关键组件

核心思想:邻里串门

图灵村的早晨是从串门开始的。张三想了解自家附近的动向,就问左边的李四、右边的王五;李四又把自己从赵六那儿听来的消息一并转述。一圈下来,张三的黑板上不仅多了邻居的见闻,还隐约有了整个片区的轮廓。消息传递框架的第一条原则,就是让节点通过边去“问邻居”——邻居特征通过边流动到当前节点,更新当前节点的状态。

那串门具体怎么在计算机里做呢?给定一张图 \(G=(V,E)\),每个节点 \(v\) 都有一个特征向量 \(h_v\)(黑板内容)。所谓一次消息传递,就是让每个节点同时完成三件事:给邻居发消息(MSG)、收齐邻居的消息(AGG)、结合自家旧状态写出新黑板(UPDATE)。

写成数学语言,第 \(l\) 层的节点表示更新如下:

村民们很快发现,只要每家都这样走访一轮,全村的黑板内容就集体“涨了一截”;多走访几轮,连村尾的消息也能传到村头。这正是消息传递框架的第一直觉:个体的智慧,来自与邻居的信息交换;交换的轮数,决定了你能听见多远的声音。

hv(l+1)=UPDATE(hv(l), AGG({MSG(hu(l))∣u∈N(v)}))\displaystyle h_v^{(l+1)} = \text{UPDATE}\left(h_v^{(l)},\ \text{AGG}\left(\left\{ \text{MSG}(h_u^{(l)}) \mid u \in \mathcal{N}(v) \right\}\right)\right)
这个公式是全部图神经网络思想的“总纲”:先让每个邻居 \(u\) 按 MSG 规则生成一条消息,AGG 把消息汇总成一份简报,最后 UPDATE 用简报和旧状态更新节点。
  1. 邻居集合 \(\mathcal{N}(v)\)与节点 \(v\) 有边直接相连的所有节点 \(u\),它们构成消息的唯一来源。
    N(v)={u∣(u,v)∈E}\mathcal{N}(v) = \{ u \mid (u, v) \in E \}
  2. 消息构造 MSG每个邻居 \(u\) 把自己的特征 \(h_u\) 包装成一条消息,相当于“写了一张纸条”。
    mu→v=MSG(hu)m_{u \to v} = \text{MSG}(h_u)
  3. 聚合汇总 AGG把收到的一堆消息压缩成一份固定维度的摘要向量 \(h_{\mathcal{N}(v)}\)。
    hN(v)=AGG({mu→v∣u∈N(v)})h_{\mathcal{N}(v)} = \text{AGG}\left( \{ m_{u \to v} \mid u \in \mathcal{N}(v) \} \right)
  4. 状态更新 UPDATE结合节点自己的旧特征 \(h_v\) 和摘要 \(h_{\mathcal{N}(v)}\),算出新特征 \(h_v^{(l+1)}\)。
    hv(l+1)=UPDATE(hv(l), hN(v))h_v^{(l+1)} = \text{UPDATE}\left( h_v^{(l)},\ h_{\mathcal{N}(v)} \right)

消息函数:写纸条的艺术

串门有个规矩:跟邻居介绍情况时,要把自家见闻写在纸条上。可同样一件事,李四写得简洁,王五写得详细,赵六专挑别人没听过的讲。消息函数 MSG 就是决定“纸条怎么写”的规则——它把邻居节点的原始特征,转换成一个有待被聚合的消息向量。

最简单的写法是原样照抄:\(m_{u \to v} = h_u\)。但这样所有维度都同等重要,相当于把黑板上的每个字都用同样的音量念出来,显然不够聪明。更常用的写法是给纸条加一层“处理”——线性变换:

纸条怎么写,决定了邻居从你这里能听到什么。在真实应用中,消息函数还能把边特征(比如两个用户间的亲密度、分子中两个原子的键类型)一并写进纸条,让消息携带更丰富的上下文。设计好消息函数,就是替模型决定“该传递哪些信号”。

MSG(hu)=Wm hu+bm\displaystyle \text{MSG}(h_u) = \mathbf{W}_m\ h_u + b_m
这里的 \(\mathbf{W}_m\) 是一个可学习的权重矩阵,就像给特征各维度装上“音量旋钮”:对当前任务重要的信息调大声,无关紧要的调小声。
  1. 权重矩阵 \(\mathbf{W}_m\)大小 \(d' \times d\) 的可学习矩阵,把原始特征从 \(d\) 维映射到 \(d'\) 维,并重新组合各维度的信息。
    m=Wm hu(Rd→Rd′)m = \mathbf{W}_m\ h_u \quad (\mathbb{R}^d \to \mathbb{R}^{d'})
  2. 偏置项 \(b_m\)可学习的向量,给消息注入与节点特征无关的固定倾向。
    m=Wm hu+bmm = \mathbf{W}_m\ h_u + b_m
  3. 方向感知变体在有向边中,给源节点和目标节点各配一套 \(\mathbf{W}\),使消息能区分“谁在说”和“对谁说”。
    mu→v=Wsrc hu,mv→u=Wdst hvm_{u \to v} = \mathbf{W}_{\text{src}}\ h_u, \qquad m_{v \to u} = \mathbf{W}_{\text{dst}}\ h_v

聚合函数:整理一桌纸条

串门回来,桌上摊着四张纸条。怎么把它们整理成一份简报?有人习惯“数总数”:把每张纸条的数值都加起来,总数越大代表支持越多;有人习惯“取平均”:人人平等,求个均值;还有人“只看最强”:哪个意见最响亮就信哪个;更讲究的会“看人下菜碟”:平时说得准的邻居,他的话多算几分权重。聚合函数 AGG 就是整理纸条的策略,它把若干条消息映射成一个摘要向量。

三种基础策略各有性格,可直接用集合运算符表示:

整理纸条的方式没有绝对好坏:找“大多数意见”用平均,找“最强证据”用最大,需要区分亲疏就用注意力加权。聚合函数的选择,是 GNN 变体最核心的分岔口之一。

hN(v)=AGG({mu})={∑u∈N(v)mu求和1∣N(v)∣∑u∈N(v)mu平均max⁡u∈N(v)mu取最大\displaystyle h_{\mathcal{N}(v)} = \text{AGG}\left( \{m_u\} \right) = \begin{cases} \displaystyle \sum_{u \in \mathcal{N}(v)} m_u & \text{求和} \\[6pt] \displaystyle \frac{1}{|\mathcal{N}(v)|} \sum_{u \in \mathcal{N}(v)} m_u & \text{平均} \\[6pt] \displaystyle \max_{u \in \mathcal{N}(v)} m_u & \text{取最大} \end{cases}
求和保留消息的总量,平均保留平均强度,取最大保留最强的证据。GCN 使用的正是“归一化平均”——既平均又按节点度数打折,防止热门节点数值过大。
  1. 求和聚合(SUM)把每个邻居的消息逐元素相加,保留“总共有多少信息”。
    hN(v)=∑u∈N(v)muh_{\mathcal{N}(v)} = \sum_{u \in \mathcal{N}(v)} m_u
  2. 平均聚合(MEAN)先求和再除以邻居数量,归一化尺度,避免大度数节点主导。
    hN(v)=1∣N(v)∣∑u∈N(v)muh_{\mathcal{N}(v)} = \frac{1}{|\mathcal{N}(v)|} \sum_{u \in \mathcal{N}(v)} m_u
  3. 最大聚合(MAX)对每个维度取最大值,保留“最突出的信号”,适合找显著特征。
    [hN(v)]i=max⁡u∈N(v)[mu]i\left[ h_{\mathcal{N}(v)} \right]_i = \max_{u \in \mathcal{N}(v)} [m_u]_i

更新函数:更新自家黑板

简报整理好了,但张三不会把简报原封不动抄上自家黑板——自家黑板记着多年积累的旧见闻,直接擦掉太可惜。聪明的村民会这样想:以自家旧观点为基础,把邻居简报当作重要参考,两者一融合,形成新判断。 更新函数 UPDATE 干的就是这件事:把一个节点的旧特征和聚合摘要,组合成新特征。

最经典的配方是“拼接 + 线性变换 + 激活”:

还可以加上残差连接:\(h_v^{(l+1)} = h_v^{(l)} + \sigma(y)\),让梯度传播更顺畅,支撑更深的网络。有了更新函数,一轮消息传递才算真正闭环——只听别人说话不算成长,把别人的话消化成自己的判断,才是更新函数的意义。

hv(l+1)=σ(Wu⋅[hv(l) ∥ hN(v)]+bu)\displaystyle h_v^{(l+1)} = \sigma\left( \mathbf{W}_u \cdot \left[ h_v^{(l)} \ \big\Vert \ h_{\mathcal{N}(v)} \right] + b_u \right)
拼接 \([h_v \| h_{\mathcal{N}(v)}]\) 相当于把旧黑板和简报并排放在一起,让权重矩阵自由决定“该信自己多少、信邻居多少”;\(\sigma\) 是非线性激活函数,让模型有能力表达更复杂的判断。
  1. 特征拼接把旧特征和聚合摘要沿维度方向拼接成一个更长的向量,两者信息都不丢失。
    x=[hv(l) ∥ hN(v)]∈R2d′x = \left[ h_v^{(l)} \ \big\Vert \ h_{\mathcal{N}(v)} \right] \in \mathbb{R}^{2d'}
  2. 线性变换用可学习矩阵 \(\mathbf{W}_u\) 将拼接向量压缩回目标维度,学习两路信息的组合权重。
    y=Wu x+buy = \mathbf{W}_u\ x + b_u
  3. 非线性激活对结果施加 \(\sigma\)(如 ReLU、Tanh),引入非线性,否则多层堆叠会退化成一层线性变换。
    hv(l+1)=σ(y)h_v^{(l+1)} = \sigma(y)

经典变体:三位村长

图灵村先后经历过三位村长,风格迥异,但都恪守“写纸条—整理纸条—换黑板”的村规。

  • 第一任 GCN 村长:一视同仁。所有邻居的消息取归一化平均,权重只由节点的“人缘”(度数)决定。优点是稳定、参数少,适合关系相对同质的网络。
  • 第二任 GAT 村长:谁靠谱听谁的。给每条边算一个注意力权重 \(\alpha\),把黑板上与自家更相关的内容放得更大声。
  • 第三任 GraphSAGE 村长:不全部问,问几家。每轮随机采样固定数量的邻居再聚合,大大降低大图的计算开销。

以 GAT 的注意力聚合为例,它是三种变体中最“精致”的写法:

把三个变体放进消息传递框架一对比,差异一目了然:GCN 的聚合是固定的归一化平均,GAT 是学出来的注意力加权,GraphSAGE 是采样后的 Mean/Max/LSTM。三位村长看似迥异,实则只是三步骤中某一步的配置不同。 看懂了这一点,你就能自己做第四任村长了。

αvu=exp⁡(LeakyReLU(aT[Whv ∥ Whu]))∑u′∈N(v)exp⁡(LeakyReLU(aT[Whv ∥ Whu′]))\displaystyle \alpha_{vu} = \frac{\exp\left( \text{LeakyReLU}\left( a^T \left[ \mathbf{W} h_v \ \big\Vert \ \mathbf{W} h_u \right] \right) \right)}{\displaystyle \sum_{u' \in \mathcal{N}(v)} \exp\left( \text{LeakyReLU}\left( a^T \left[ \mathbf{W} h_v \ \big\Vert \ \mathbf{W} h_{u'} \right] \right) \right)}
这条公式描述了“节点 \(v\) 有多重视邻居 \(u\) 的消息”:先把双方特征变换并拼接,用一个可学习向量 \(a\) 打分,再用 softmax 把所有邻居的分数归一化成权重。
  1. 特征变换与拼接把目标节点 \(v\) 和邻居 \(u\) 的特征各自乘上 \(\mathbf{W}\),再拼在一起,得到打分用的原始材料。
    score(u,v)=aT[Whv ∥ Whu]\text{score}(u, v) = a^T \left[ \mathbf{W} h_v \ \big\Vert \ \mathbf{W} h_u \right]
  2. 非线性打分用 LeakyReLU 对原始分数做非线性变换,得到这条边上的注意力原始分。
    evu=LeakyReLU(score(u,v))e_{vu} = \text{LeakyReLU}\left( \text{score}(u, v) \right)
  3. softmax 归一化对节点 \(v\) 的所有邻居的 \(e_{vu}\) 做指数归一,使权重和为 1,方便加权求和。
    αvu=exp⁡(evu)∑u′∈N(v)exp⁡(evu′)\alpha_{vu} = \frac{\exp(e_{vu})}{\sum_{u' \in \mathcal{N}(v)} \exp(e_{vu'})}

统一范式:一部村规民约

经历了三任村长后,图灵村把经验写成了一部《村规民约》:无论谁执政,都必须遵守“三步走”——发消息、收消息、改黑板。用数学语言把这套流程固定下来,就是消息传递框架的完整形态。注意第 \(l\) 层的三函数可以各不相同,就像每个时期的村规可以微调:

有了部村规,再看到任何 GNN 论文,你都只需追问三个问题:它的消息函数是什么?聚合函数是什么?更新函数是什么? 答完三问,模型的底牌就摊在桌面上了。但村规也提醒我们注意一个隐患:串门太多、每人说话越来越像,最后全村黑板都变成一样的——这就是过度平滑。频繁交流是好事,但也别忘了保留每个村民的个性。

hv(l+1)=UPDATE(l)(hv(l), AGG(l)({MSG(l)(hu(l))∣u∈N(v)}))\displaystyle h_v^{(l+1)} = \text{UPDATE}^{(l)}\left( h_v^{(l)},\ \text{AGG}^{(l)}\left( \left\{ \text{MSG}^{(l)}\left( h_u^{(l)} \right) \mid u \in \mathcal{N}(v) \right\} \right) \right)
这个带层号上标的公式,是消息传递框架的“最终形态”:它表明不同层可以使用不同的 MSG、AGG、UPDATE,而整个模型就是把这个算子反复套用多次。所有主流 GNN 都只是它的一类实例化。
  1. 层号上标 \((l)\)表示第 \(l\) 层的三函数与参数,层与层之间可以不同,体现分层的特征抽象能力。
    hv(l+1)=F(l)(hv(l),{hu(l)}u∈N(v))h_v^{(l+1)} = F^{(l)}\left( h_v^{(l)}, \left\{ h_u^{(l)} \right\}_{u \in \mathcal{N}(v)} \right)
  2. 同层参数共享同一层内所有节点共用同一套 MSG/AGG/UPDATE,因此模型参数量与图规模无关,可泛化到任意大小的图。
    同一层内: MSG(l),AGG(l),UPDATE(l) 全局共享\text{同一层内: } \text{MSG}^{(l)}, \text{AGG}^{(l)}, \text{UPDATE}^{(l)} \text{ 全局共享}
  3. 多层堆叠的意义每堆叠一层,节点能感知的范围向外扩一跳;堆 \(L\) 层,感受野就是 \(L\) 跳邻居。
    感知范围: N(L)(v)={u∣dist(u,v)≤L}\text{感知范围: } \mathcal{N}^{(L)}(v) = \{ u \mid \text{dist}(u, v) \le L \}

AI 应用场景

社交网络好友推荐

阶段:图表示学习 / 特征工程

解决的问题:传统协同过滤只看用户和物品的交互矩阵,完全忽略“朋友喜欢什么也会影响你”这一社交规律。用消息传递框架,把每个用户当作节点、关注关系当作边,用户的兴趣特征沿着社交关系反复“串门”,就能自动学到带社交语境的用户向量。

具体案例:某短视频 App 构建“用户—用户”关注图,用两层 GCN 做消息传递。用户的兴趣标签向量经过一层聚合后融入好友偏好,再经过第二层融入好友的好友偏好。离线评测显示,Top-K 推荐命中率提升约 12%,新用户冷启动效果改善尤为明显。

分子性质预测

阶段:图级预测 / 药物筛选

解决的问题:药物分子是天然的图结构(原子是节点、化学键是边),传统分子指纹方法把结构压平成比特串,丢失了原子的局部化学环境。消息传递让每个原子“听见”周围原子的电子状态,聚合出反映局部结构的表示,再对整张图做池化得到分子级预测。

具体案例:某 AI 制药团队用 GAT 对 10 万个候选分子做消息传递,原子的特征经 3 层注意力聚合,预测化合物的水溶性和毒性。相比传统指纹 + XGBoost 方案,回归误差降低约 18%,并将进入湿实验验证的候选分子数量压缩了 40%。

交通流量预测

阶段:时空图预测

解决的问题:城市路网中,一个路口的拥堵会沿道路传播给相邻路口。把传感器当作节点、道路当作边,用消息传递把“我这儿堵了”的信号逐路口扩散,模型就能预测未来 15 分钟到 1 小时的流量变化。

具体案例:某智慧城市项目在北京二环内 200 余个路口部署流量传感器,构建路网图后使用 GraphSAGE(随机采样邻居 + 平均聚合)降低计算量,实现了对早高峰拥堵传播方向的准确预测,提前预警准确率比纯时序模型高约 15%。

Python 演示

python54 行
import numpy as np  class MessagePassingLayer:    """一个简单的消息传递层: MSG -> AGG -> UPDATE"""     def __init__(self, in_dim, out_dim, agg='mean'):        self.W_msg = np.random.randn(in_dim, out_dim) * 0.1        self.W_upd = np.random.randn(in_dim + out_dim, out_dim) * 0.1        self.bias = np.zeros(out_dim)        self.agg = agg     def message(self, h):        """消息函数: 线性变换封装特征"""        return h @ self.W_msg     def aggregate(self, msgs, mask):        """聚合函数: 按策略汇总邻居消息"""        if self.agg == 'sum':            return (msgs * mask[:, :, None]).sum(axis=1)        if self.agg == 'mean':            cnt = np.maximum(mask.sum(axis=1, keepdims=True), 1)            return (msgs * mask[:, :, None]).sum(axis=1) / cnt        if self.agg == 'max':            masked = np.where(mask[:, :, None], msgs, -1e9)            return masked.max(axis=1)        raise ValueError('未知聚合: ' + self.agg)     def update(self, h_v, h_agg):        """更新函数: 拼接旧特征与聚合结果, 过线性层 + tanh"""        concat = np.concatenate([h_v, h_agg], axis=1)        return np.tanh(concat @ self.W_upd + self.bias)     def forward(self, h, adj):        """一次消息传递: n 个节点 (n,d) + 邻接矩阵 (n,n)"""        msgs = self.message(h)        mask = adj > 0        h_agg = self.aggregate(msgs, mask)        return self.update(h, h_agg)  if __name__ == '__main__':    np.random.seed(42)    adj = np.array([[0, 1, 0, 0],                    [1, 0, 1, 1],                    [0, 1, 0, 0],                    [0, 1, 0, 0]], dtype=float)    h = np.random.randn(4, 8)    layer = MessagePassingLayer(8, 16, agg='mean')    out = layer.forward(h, adj)    print('输入特征形状:', h.shape)    print('输出特征形状:', out.shape)    print('节点 1 的输出(融合了邻居 0/2/3):')    print(out[1])
目的:用 NumPy 从零实现一个消息传递层,演示“消息函数 → 聚合函数 → 更新函数”三步骤在一个 4 节点小图上的完整执行过程。
  1. msgs = self.message(h)每个节点先产出一条“想告诉邻居的话”,即对特征做线性变换。
  2. mask = adj > 0把邻接矩阵变成一张“谁是邻居”的 0/1 蒙版,只让真邻居的消息参与聚合。
  3. h_agg = self.aggregate(msgs, mask)按策略把邻居消息汇总成一份摘要向量,这是整个框架的核心枢纽。
  4. return self.update(h, h_agg)拼接旧特征与摘要,再过线性层和 Tanh 激活,得到新特征。
  5. return h @ self.W_msg消息函数就是一次矩阵乘法,\(W\) 在训练中会被优化成“会挑重点的写信人”。
  6. self.W_msg = np.random.randn(in_dim, out_dim) * 0.1小随机量初始化权重,避免起始输出过大导致训练不稳定。
  7. raise ValueError('未知聚合: ' + self.agg)对未定义的聚合方式显式报错,方便扩展新聚合策略。

常见误区

误区GNN 做一次消息传递,节点不就拿到邻居信息了吗?那叠很多层有什么意义?我学 GCN 时总觉得一层已经够用了。

正解一次消息传递只能让节点听到“直接邻居”的声音。真实图里(比如社交网络)你想知道朋友的朋友在聊什么,就得串两轮门。堆叠 \(L\) 层,感受野才扩大到 \(L\) 跳邻居。但层数太多又会过度平滑,因此层数需要在任务上权衡。

为何常见:直觉上“问一次邻居”就够了,忽略了图结构里信息需要多跳传播;而教程中常用的示例图恰好只有一跳邻域,容易造成错觉。

误区聚合不就是把邻居消息加起来吗?GCN、GAT 的区别应该只在更新函数吧?我写代码时从来不关心选哪种聚合。

正解求和不做归一化时,邻居多的节点特征天然数值大,会主导下游任务。平均聚合只保留平均强度,最大聚合只保留最强信号,注意力聚合则让模型学出“谁更该被听见”。不同任务需要不同的聚合归纳偏置,这是 GNN 设计的重要自由度。

为何常见:很多入门教科书以 Sum 聚合作为默认示例,让读者误以为聚合策略是固定不变的,忽略了它是和消息函数同等重要的设计维度。

误区GCN 是最经典的图神经网络,我把它搞明白了,市面上其他 GNN 应该都是它的换皮版本吧?

正解GCN 只是消息传递框架的一个特例(邻居归一化平均 + 线性消息)。GAT 引入了注意力权重,GraphSAGE 引入了邻居采样和多种聚合器,GIN 则为图同构判别设计了专门的求和聚合。每个变体在不同场景有不同优势,只掌握 GCN 会限制你对模型选型的判断。

为何常见:GCN 资料最多、上手最容易,学习路径上会形成“先入为主”的认知遮蔽,让人误以为它就是全部。

误区节点 A 向 B 发消息和 B 向 A 发消息,不都是传特征吗?有向图是不是只要把边当成无向的就行?

正解方向编码了重要的因果或依赖语义。在关注关系图中,A 关注 B 不代表 B 关注 A,消息的影响力不应等权。消息函数可以分别使用 \(\mathbf{W}_{\text{src}}\) 和 \(\mathbf{W}_{\text{dst}}\) 区分源/目标角色,聚合时也可以只汇总“入边邻居”,才能合理建模有向结构。

为何常见:大量入门示例使用无向图(如分子、引文网络),导致学习者没有意识到方向是消息构造中必须显式处理的变量。

误区既然是深度学习,模型越深能力越强,那我把 GNN 叠到 20 层是不是就能学到全局信息,效果一定更好?

正解超过一定层数后,所有节点的特征会因反复平均而趋于一致,称为过度平滑,节点间的区分度消失,分类/回归效果反而急剧下降。实践中常配合残差、归一化或跳连(Jumping Knowledge)来缓解,层数通常控制在 2~5 层。

为何常见:深度学习的成功经验(ResNet 叠几百层)被机械类比到 GNN 上,忽略了消息传递本质上是一种“反复平滑”的迭代过程,并非越深越好。

面试题

Q1. 在消息传递框架中,“消息”指的是什么?

单选题 · easy

  • A.图中每条边的权重值
  • B.邻居特征变换后的向量← 正确答案
  • C.全局损失函数的梯度
  • D.节点自身的标签信息

答案:B。消息由消息函数对邻居特征做变换后产生,本质是“邻居想告诉我的内容”。边权重只是图的静态属性,梯度是训练信号,标签是监督信息,它们都不是节点之间流动的消息。

Q2. 聚合函数的输入通常是什么?

单选题 · easy

  • A.全部节点的原始特征
  • B.目标节点自身的特征
  • C.邻居产生的消息集合← 正确答案
  • D.图的邻接矩阵数值

答案:C。聚合函数负责把目标节点收到的一堆邻居消息压缩成摘要。若输入全部节点特征,则聚合运算恰好等于“把所有邻居消息收集起来”这一步的输入来源;邻接矩阵只用于判断哪些节点是邻居,不直接参与数值聚合。

Q3. 以下哪一项是 GCN 使用的聚合策略?

单选题 · mid

  • A.按注意力权重加权求和
  • B.归一化后取加权平均← 正确答案
  • C.采样邻居后做最大池化
  • D.随机丢弃部分邻居消息

答案:B。GCN 对邻居消息按度归一化后取加权平均,权重由 \(\hat{d}_v \hat{d}_u\) 决定,属于固定权重平均。注意力加权是 GAT 的策略,采样池化是 GraphSAGE 的策略,随机丢弃是 Dropout 思想在图上的变体。

Q4. GAT 与 GCN 的核心区别是什么?

单选题 · mid

  • A.消息函数采用不同的非线性
  • B.聚合时学习边的注意力权重← 正确答案
  • C.GAT 完全不需要更新函数
  • D.GAT 只适用于有向图数据

答案:B。GAT 的聚合不是固定平均,而是用 attention 机制为每条边学一个权重 \(\alpha_{vu}\),再对消息加权求和,使模型能区分邻居的重要性。GCN 的权重是度归一化常数,与内容无关;GAT 同样需要更新函数,也适用于无向图。

Q5. 将 GNN 堆叠过多层通常会导致什么?

单选题 · mid

  • A.模型参数量指数式爆炸
  • B.感受野增大但易过度平滑← 正确答案
  • C.训练收敛速度急剧下降
  • D.节点特征维度自动扩展

答案:B。每层让节点多感知一跳邻居,感受野确实扩大,但反复聚合平均会使同连通分量内节点特征趋同,丧失判别力,即过度平滑。参数不会指数爆炸,维度由层设计决定,与层数无必然关系。

Q6. 关于消息传递框架的统一性,哪项说法正确?

单选题 · hard

  • A.只有 GCN 和 GAT 适用该框架
  • B.所有聚合方式必须可微可导
  • C.三函数可定制可统一各类 GNN← 正确答案
  • D.消息只能沿无向边进行传递

答案:C。消息传递框架的精髓在于 MSG/AGG/UPDATE 三个函数可自由定制,GCN、GAT、GraphSAGE、GIN 等都只是特定配置,因此它能作为统一视角描述几乎所有 GNN。聚合虽常用可微操作,但并非硬性约束;有向图同样支持消息传递。

Q7. GraphSAGE 相对 GCN 的关键创新是什么?

单选题 · hard

  • A.引入基于全局的自注意力机制
  • B.采样邻居并拼接聚合结果后变换← 正确答案
  • C.使用图拉普拉斯矩阵做归一化
  • D.将每条边作为独立参数学习

答案:B。GraphSAGE 为应对超大图,每轮随机采样固定数量的邻居,并把聚合结果与自身特征拼接后过 MLP,训练时无需看到全部邻居。自注意力是 GAT 的创新,拉普拉斯归一化是 GCN 的经典做法,逐边参数学习不是 GraphSAGE 的设计。

Q8. 哪些操作属于聚合函数的可选设计?

多选题 · mid

  • A.对邻居消息做求和汇总← 正确答案
  • B.按注意力权重进行加权← 正确答案
  • C.对邻居消息做最大池化← 正确答案
  • D.求解邻接矩阵的逆矩阵

答案:ABC。求和、注意力加权、最大池化都是消息传递框架中合法的聚合策略,分别对应 GIN、GAT 和 GraphSAGE 的聚合器风格。求解邻接矩阵逆矩阵属于图信号处理中的谱操作,不是常规的邻居消息聚合方法。

Q9. 更新函数通常可以包含哪些运算?

多选题 · hard

  • A.拼接自身特征与聚合结果← 正确答案
  • B.通过非线性激活函数变换← 正确答案
  • C.引入残差连接加速训练← 正确答案
  • D.对邻居特征做傅里叶变换

答案:ABC。更新函数的核心配方是拼接旧特征与聚合摘要、做线性变换、加非线性激活;残差连接是增强梯度传播的常见改进。傅里叶变换是谱图理论中的工具,属于图信号处理范畴,不属于更新函数的常规运算。

Q10. 以下哪些是消息传递框架的核心组件?

多选题 · easy

  • A.消息函数用于封装邻居信息← 正确答案
  • B.聚合函数汇总多方消息← 正确答案
  • C.更新函数融合自身与邻域← 正确答案
  • D.损失函数计算预测偏差

答案:ABC。消息传递框架由三个核心组件构成:MSG 负责把邻居特征包装成消息,AGG 负责汇总消息,UPDATE 负责结合自身状态输出新特征。损失函数属于模型训练阶段的设计,不属于消息传递框架本身。