跳转至

第12章 · 图神经网络 · 阶段测试题答案


一 · 单选 (8 题)

1.1 B - GCN 是图卷积网络。

1.2 A - GAT 用注意力聚合邻居。

1.3 C - GraphSAGE 邻居采样。

1.4 B - 节点嵌入维度可设置。

1.5 A - 过平滑是深层 GNN 的问题。

1.6 C - TransE 是知识图谱嵌入。

1.7 B - 分子是常见的图数据。

1.8 A - 归纳式学习支持新节点。


二 · 多选 (4 题)

2.1 ABCD - 都是 GNN 任务。

2.2 ABD - C 错: GraphSAGE 邻居采样。

2.3 ABC - 都是图嵌入方法。

2.4 ABD - 都是 GNN 应用场景。


三 · 简答 (5 题)

3.1 GCN 公式

核心: H^(l+1) = σ(D^(-1/2) A D^(-1/2) H^(l) W^(l)) - A: 邻接矩阵 + 自环 - D: 度矩阵 - W: 可学习权重 - 含义: 聚合邻居特征

3.2 GAT 注意力

优势: - 不同邻居不同权重 - 不需要度归一化 - 归纳式学习

公式: α_{ij} = softmax(LeakyReLU(a^T [Wh_i || Wh_j])) 多头: 拼接多组注意力

3.3 TransE

核心: h + r ≈ t (头实体 + 关系 ≈ 尾实体) 损失: margin-based (正样本 < 负样本 - margin) 应用: 知识图谱补全

3.4 异质图

类型: 不同节点/边类型 (作者-论文-会议) 方法: HAN / HGT / MAGNN 应用: 学术网络 / 推荐系统

3.5 GNN 应用

领域 应用
推荐 社交网络 / 知识图谱
化学 分子性质 / 药物
交通 路网预测
风控 反欺诈团伙
知识图谱 补全 / 推理

四 · 编程 (2 题)

4.1 GCN 层

import torch
import torch.nn as nn
import torch.nn.functional as F

class GCNLayer(nn.Module):
    def __init__(self, in_features, out_features):
        super().__init__()
        self.linear = nn.Linear(in_features, out_features)

    def forward(self, H, A_hat, D_hat):
        # A_hat: 邻接 + 自环
        # D_hat: 度矩阵
        H = D_hat.pow(-0.5) @ A_hat @ D_hat.pow(-0.5) @ H
        H = self.linear(H)
        return F.relu(H)

4.2 GAT 层

class GATLayer(nn.Module):
    def __init__(self, in_features, out_features, n_heads=4):
        super().__init__()
        self.n_heads = n_heads
        self.W = nn.Linear(in_features, out_features * n_heads)
        self.a = nn.Parameter(torch.zeros(size=(2 * out_features, 1)))
        self.leaky = nn.LeakyReLU(0.2)

    def forward(self, H, adj):
        B, N, _ = H.shape
        H = self.W(H).view(B, N, self.n_heads, -1)  # (B, N, heads, out)
        # 注意力
        a_input = torch.cat([H, H], dim=-1)  # 简化
        e = self.leaky(a_input @ self.a).squeeze(-1)
        # mask
        mask = -1e9 * (1.0 - adj)
        attention = F.softmax(e + mask.unsqueeze(-1), dim=1)
        return (attention.unsqueeze(-1) * H).sum(dim=1)