图卷积网络(GCN)

一句话概述

图卷积网络(Graph Convolutional Network, GCN)是最经典和广泛使用的图神经网络之一。它将卷积操作从规则的图像网格推广到不规则的图结构上,核心思想是:每个节点的新特征是其自身特征和邻居特征的加权平均(带归一化),然后通过可学习的权重矩阵进行线性变换。GCN的每一层可以简洁地表示为 H^{(l+1)} = σ(D̃^{-1/2} Ã D̃^{-1/2} H^{(l)} W^{(l)}),其中Ã=A+I是添加自环的邻接矩阵,D̃是Ã的度矩阵,W是可学习权重,σ是激活函数。这个公式的推导源于图上的谱卷积(Spectral Convolution),但通过一阶近似简化为了高效的空间域实现。GCN以其简洁优雅的数学形式和良好的实验效果,成为图深度学习领域的基石模型。

💡 核心要点:①GCN将卷积操作推广到图结构,通过邻居特征聚合实现图上信息传播 ②核心公式H'=σ(D̃^{-1/2}ÃD̃^{-1/2}HW),对称归一化防止度大的节点主导 ③添加自环确保节点自身信息不丢失 ④GCN层实现了消息传递中的"平均聚合+线性变换+非线性激活"

教学与演示

一、GCN的数学推导:从谱卷积到空间域

是什么(定义):GCN(Graph Convolutional Network)是Thomas Kipf和Max Welling于2017年提出的图神经网络。其核心公式为 H^{(l+1)} = σ(D̃^{-1/2} Ã D̃^{-1/2} H^{(l)} W^{(l)}),其中Ã=A+I(带自环的邻接矩阵),D̃_{ii}=Σ_j Ã_{ij}(度矩阵),H^{(l)}是第l层的节点特征矩阵,W^{(l)}是可学习的权重矩阵,σ是激活函数(如ReLU)。这个公式实现了图上的卷积操作——每个节点的新特征是其邻居特征(包括自身)的加权平均。

大白话 GCN就像是"朋友圈影响力传播"。每个人(节点)的新观点(新特征)= 自己旧观点 + 朋友们的旧观点的加权平均,再经过一个"思考转换"(权重矩阵W)。这个加权平均不是简单的1/n(朋友数量),而是用了一种特殊的归一化,确保"有很多朋友的人"不会因为朋友多而影响力过大。就像在一个讨论组里,每个人发言的影响力应该被合理分配,而不是被"社交达人"垄断。

为什么(原理):GCN的公式来源于图上的谱卷积理论。谱卷积的核心是在傅里叶域(图拉普拉斯矩阵的特征空间)进行卷积,但计算特征分解在计算上不可行。GCN通过一阶切比雪夫多项式近似,将谱卷积简化为空间域的邻居聚合。具体的推导步骤:①图卷积定义为g_θ★x = Ug_θU^Tx(U是特征向量矩阵);②用切比雪夫多项式近似g_θ;③取一阶近似,得到简化公式;④通过重归一化技巧(renormalization trick)解决数值不稳定性。

import numpy as np

# GCN层的完整实现:从数学公式到代码
# 展示GCN如何从邻接矩阵和特征矩阵计算节点新表示

class GCNLayer:
    def __init__(self, d_in, d_out):
        np.random.seed(42)
        # 可学习的权重矩阵:将输入特征映射到输出特征
        self.W = np.random.randn(d_in, d_out) * 0.1
        # 偏置项
        self.b = np.zeros(d_out)

    def normalize_adjacency(self, A):
        """计算对称归一化的邻接矩阵:D^{-1/2} A D^{-1/2}"""
        # 步骤1:添加自环(A_tilde = A + I)
        # 确保节点自身的信息不会丢失
        A_tilde = A + np.eye(A.shape[0])

        # 步骤2:计算度矩阵D_tilde
        # D_tilde[i][i] = 节点i的度(包括自环)
        D_tilde = np.diag(np.sum(A_tilde, axis=1))

        # 步骤3:计算D^{-1/2}
        # 对对角线元素取-1/2次幂
        D_inv_sqrt = np.diag(1.0 / np.sqrt(np.diag(D_tilde)))

        # 步骤4:对称归一化:D^{-1/2} A_tilde D^{-1/2}
        A_norm = D_inv_sqrt @ A_tilde @ D_inv_sqrt

        return A_norm

    def forward(self, X, A):
        """
        GCN层的前向传播:H' = σ(A_norm @ H @ W)
        X: 节点特征矩阵 (n, d_in)
        A: 邻接矩阵 (n, n)
        """
        # 步骤1:归一化邻接矩阵
        A_norm = self.normalize_adjacency(A)

        # 步骤2:邻居聚合(消息传递):A_norm @ X
        # 每个节点的新表示 = 自身和邻居特征的加权平均
        aggregated = A_norm @ X  # (n, d_in)

        # 步骤3:线性变换(可学习的权重矩阵)
        transformed = aggregated @ self.W + self.b  # (n, d_out)

        # 步骤4:非线性激活
        output = np.maximum(0, transformed)  # ReLU激活

        return output, A_norm


# 创建示例图
A = np.array([
    [0, 1, 0, 1, 0],
    [1, 0, 1, 0, 1],
    [0, 1, 0, 0, 0],
    [1, 0, 0, 0, 1],
    [0, 1, 0, 1, 0],
])

X = np.array([
    [0.5, 0.2, 0.1, 0.8],
    [0.1, 0.9, 0.3, 0.2],
    [0.3, 0.1, 0.7, 0.1],
    [0.8, 0.1, 0.2, 0.5],
    [0.2, 0.6, 0.1, 0.3],
])

gcn = GCNLayer(d_in=4, d_out=3)
output, A_norm = gcn.forward(X, A)

print("=== GCN层:图卷积操作 ===\n")

print("原始邻接矩阵 A(无自环):")
print(A)

print(f"\n添加自环后 A_tilde = A + I:")
A_tilde = A + np.eye(5)
print(A_tilde)

print(f"\n归一化后 A_norm = D^{-1/2} A_tilde D^{-1/2}:")
print(np.round(A_norm, 4))

print("\n归一化矩阵的含义:")
print("- 对角元素:节点自身权重≈0.3-0.5")
print("- 非对角元素:邻居权重(与度有关)")
print("- 节点0的邻居1和3的权重不同,因为它们的度不同")

print(f"\n输入特征 X(5×4)→ 输出特征 H(5×3):")
for i in range(5):
    print(f"  节点{i}: {X[i]} → {np.round(output[i], 4)}")

print("\nGCN公式总结:H' = ReLU(D^{-1/2} (A+I) D^{-1/2} · H · W)")
GCN的核心公式\(H^{(l+1)} = \sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}\right)\)
大白话 GCN公式可以拆成三步理解。第一步:Ã = A + I——给图加上自环,就像每个人都"关注自己"(我自己的意见也很重要)。第二步:D̃^{-1/2} Ã D̃^{-1/2}——对称归一化,等价于"每个人的意见按照他的社交圈大小来加权"——朋友圈大的人,他对每个朋友的影响力被稀释;朋友圈小的人,他的意见更集中。第三步:×W——就像每个人听完朋友意见后,用自己的"思考方式"(W)来消化这些信息,形成新观点。

什么用(应用):GCN是最经典的图神经网络,广泛应用于节点分类(如Cora/CiteSeer/PubMed论文分类)、图分类、链接预测等任务。在Cora数据集上,2层GCN就能达到约81%的节点分类准确率。GCN也是许多后续GNN变体的基础——GAT(加注意力)、GraphSAGE(加采样)、GIN(加MLP)都可以看作GCN的扩展。

哪些坑(缺点):GCN的主要局限包括:①转导学习(transductive)——训练时需要看到整个图结构,无法直接泛化到未见过的节点或图;②全批次训练——每次更新需要计算整个图的邻接矩阵,无法处理大规模图;③层数限制——通常只用2层,超过3层性能急剧下降(过平滑);④对称归一化虽然有效,但丢失了有向图的方向信息。

二、GCN的归一化策略:为什么需要D^{-1/2}

是什么(定义):GCN使用对称归一化D̃^{-1/2}ÃD̃^{-1/2},而不是简单的平均(除以邻居数)或求和。对称归一化对每条边(i,j)赋予权重1/√(d_i·d_j),其中d_i和d_j分别是节点i和j的度(包括自环)。这种归一化确保了:①特征值范围在[0,1]之间,数值稳定;②高度节点(社交达人)的影响力被适当稀释;③保持了邻接矩阵的对称性。

大白话 对称归一化就像是"公平投票"。在社交网络中,大V(有很多粉丝)的发言影响力不应该和普通人一样大——如果只是简单求和,大V的发言会被无数次放大。对称归一化就像给每条边分配一个"衰减系数"——大V对每个粉丝的影响力是1/√(大V的粉丝数×粉丝的朋友数),这样大V的总影响力被稀释,普通人的声音也能被听到。

为什么(原理):对称归一化有严格的数学依据。从谱图理论来看,归一化图拉普拉斯矩阵L_norm = I - D^{-1/2}AD^{-1/2}的特征值在[0,2]之间,与图的大小无关,这保证了卷积操作的数值稳定性。从信息传播角度,对称归一化等价于"随机游走的平稳分布"——信息在图上长期传播后,每个节点的信息量与其度成正比,归一化抵消了这种偏差。

import numpy as np

# 深入理解GCN归一化策略
# 对比不同归一化方式的差异

class NormalizationComparison:
    def __init__(self):
        pass

    def no_normalization(self, A):
        """无归一化:直接使用A(不含自环)"""
        return A

    def mean_normalization(self, A):
        """平均归一化:除以每个节点的度"""
        D_inv = np.diag(1.0 / np.sum(A, axis=1))
        D_inv[np.isinf(D_inv)] = 0  # 处理度为0的节点
        return D_inv @ A

    def symmetric_normalization(self, A):
        """对称归一化(GCN标准):D^{-1/2} (A+I) D^{-1/2}"""
        A_tilde = A + np.eye(A.shape[0])
        D_tilde = np.diag(np.sum(A_tilde, axis=1))
        D_inv_sqrt = np.diag(1.0 / np.sqrt(np.diag(D_tilde)))
        return D_inv_sqrt @ A_tilde @ D_inv_sqrt

    def demonstrate(self, A):
        print("=== GCN归一化策略对比 ===\n")

        print("原始邻接矩阵 A:")
        print(A)

        print(f"\n1. 无归一化:")
        A_none = self.no_normalization(A)
        print(A_none)
        print(f"   缺点:特征值可能很大,训练不稳定")

        print(f"\n2. 平均归一化 (D^{-1}A):")
        A_mean = self.mean_normalization(A)
        print(np.round(A_mean, 4))
        print(f"   每行和为1(概率矩阵),但不保留对称性")

        print(f"\n3. 对称归一化 (D^{-1/2}(A+I)D^{-1/2}):")
        A_sym = self.symmetric_normalization(A)
        print(np.round(A_sym, 4))
        print(f"   保留对称性,数值稳定,GCN标准选择")

        # 数值稳定性验证
        print(f"\n\n=== 数值稳定性验证 ===")

        # 模拟一个度很大的节点(社交网络大V)
        A_big = np.array([
            [0, 1, 1, 1, 1, 1, 1, 1, 1, 1],  # 节点0连接9个节点
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        ])

        print("高度节点示例:节点0连接9个节点,其他节点只连接节点0")
        A_norm = self.symmetric_normalization(A_big)
        print(f"节点0与节点1之间的边权重: {A_norm[0, 1]:.4f}")
        print(f"  1/√(10×2) = 1/√20 = {1/np.sqrt(20):.4f}")
        print("→ 高度节点的边权重被显著稀释,防止信息传播被大V垄断")


NormalizationComparison().demonstrate(A=np.array([
    [0, 1, 0, 1, 0],
    [1, 0, 1, 0, 1],
    [0, 1, 0, 0, 0],
    [1, 0, 0, 0, 1],
    [0, 1, 0, 1, 0],
]))
对称归一化的数学原理\(\tilde{A}_{ij} = \frac{\tilde{A}_{ij}}{\sqrt{\tilde{d}_i \cdot \tilde{d}_j}}, \quad \tilde{d}_i = \sum_j \tilde{A}_{ij}\)
大白话 对称归一化的权重公式是 1/√(d_i × d_j)。想象节点i有100个朋友,节点j有10个朋友——i对j的影响力是1/√(100×10)≈0.032,而如果i和j都只有2个朋友,影响力是1/√(2×2)=0.5。这就是"朋友多的人,他对每个人的影响力被稀释"的数学表达。这种设计让GCN在社交网络、论文引用网络等度分布极不均匀的图上也能稳定工作。

什么用(应用):对称归一化是GCN成功的关键技术之一。在Cora等论文引用网络中,论文的被引次数差异很大(有的被引100次,有的只有1次),对称归一化确保了引用多的论文不会"淹没"引用少的论文信息。这一归一化策略也被后续的GAT、GIN等模型继承,成为图神经网络的标配操作。

哪些坑(缺点):对称归一化假设图是无向的(A对称),对于有向图需要不同的处理。此外,归一化虽然数值稳定,但丢失了节点的绝对度信息——两个具有相同归一化特征但不同度的节点在GCN中可能无法区分。GIN论文指出,GCN的归一化聚合(平均)表达能力不如求和聚合,因为在某些图中无法区分不同的局部结构。

三、GCN的训练与半监督节点分类

是什么(定义):GCN在节点分类任务中的典型训练流程是:使用2层GCN(输入→隐藏→输出),在少量标注节点上计算交叉熵损失,通过反向传播更新权重矩阵W^{(0)}和W^{(1)}。GCN是转导(transductive)模型——训练时需要整个图的邻接矩阵和所有节点的特征(包括未标注节点),但只使用标注节点的标签计算损失。这种半监督学习方式使得GCN能利用未标注节点的图结构信息来提升分类效果。

大白话 GCN的训练就像"在社交网络中给少数人贴标签,然后推断所有人的标签"。假设你只知道10%的人的兴趣爱好(标注节点),你要推断其余90%的人的兴趣。GCN的做法是:让整个社交网络中的信息流动(通过图卷积),然后只看那10%标注的人预测得对不对,以这个为"考试分数"来调整模型。因为信息在图上流动,未标注的90%的人也能帮助模型理解图结构,从而提升对标注节点的预测准确率。

为什么(原理):GCN之所以能利用未标注节点,是因为图卷积操作同时作用于所有节点(标注和未标注)。未标注节点的特征通过消息传递影响标注节点的表示,从而提供了额外的结构信息。这类似于"近朱者赤,近墨者黑"——如果一个未标注节点连接了两个标注节点,它的特征可以间接帮助模型理解这两个标注节点之间的关系。

import numpy as np

# GCN训练演示:半监督节点分类
# 展示2层GCN如何利用图结构进行分类

class TwoLayerGCN:
    def __init__(self, d_in=4, d_hidden=3, d_out=2, lr=0.1):
        np.random.seed(42)
        # 第一层权重:输入→隐藏
        self.W1 = np.random.randn(d_in, d_hidden) * 0.3
        # 第二层权重:隐藏→输出(类别数)
        self.W2 = np.random.randn(d_hidden, d_out) * 0.3
        self.lr = lr

    def gcn_layer(self, X, A, W):
        """GCN层:H = ReLU(D^{-1/2}(A+I)D^{-1/2} · X · W)"""
        A_tilde = A + np.eye(A.shape[0])
        D_tilde = np.diag(np.sum(A_tilde, axis=1))
        D_inv_sqrt = np.diag(1.0 / np.sqrt(np.diag(D_tilde)))
        A_norm = D_inv_sqrt @ A_tilde @ D_inv_sqrt
        return np.maximum(0, A_norm @ X @ W)

    def forward(self, X, A):
        """2层GCN前向传播"""
        # 第一层:ReLU激活
        H1 = self.gcn_layer(X, A, self.W1)
        # 第二层:无激活(输出logits)
        A_tilde = A + np.eye(A.shape[0])
        D_tilde = np.diag(np.sum(A_tilde, axis=1))
        D_inv_sqrt = np.diag(1.0 / np.sqrt(np.diag(D_tilde)))
        A_norm = D_inv_sqrt @ A_tilde @ D_inv_sqrt
        H2 = A_norm @ H1 @ self.W2
        return H2

    def train_step(self, X, A, y, train_mask):
        """一步训练:计算损失并更新权重"""
        # 前向传播
        logits = self.forward(X, A)

        # Softmax得到概率
        logits = logits - np.max(logits, axis=1, keepdims=True)
        probs = np.exp(logits) / np.sum(np.exp(logits), axis=1, keepdims=True)

        # 交叉熵损失(仅计算标注节点)
        loss = -np.sum(np.log(probs[train_mask] + 1e-8) * y[train_mask]) / np.sum(train_mask)

        # 简化梯度更新(仅演示,实际需要完整反向传播)
        # 这里只更新W2
        error = probs - y  # 简化的梯度
        self.W2 -= self.lr * H1.T @ (error * train_mask.reshape(-1, 1)) / np.sum(train_mask)

        # 预测准确率
        pred = np.argmax(probs, axis=1)
        true = np.argmax(y, axis=1)
        acc = np.mean(pred[train_mask] == true[train_mask])

        return loss, acc


# 创建示例
A = np.array([
    [0, 1, 0, 1, 0, 0],
    [1, 0, 1, 0, 1, 0],
    [0, 1, 0, 0, 0, 1],
    [1, 0, 0, 0, 1, 0],
    [0, 1, 0, 1, 0, 1],
    [0, 0, 1, 0, 1, 0],
])

X = np.random.randn(6, 4) * 0.5

# 标签:节点0-2为类别0,节点3-5为类别1
y = np.array([
    [1, 0], [1, 0], [1, 0],
    [0, 1], [0, 1], [0, 1],
])

# 半监督:只标注节点0和节点3
train_mask = np.array([True, False, False, True, False, False])

gcn_model = TwoLayerGCN(d_in=4, d_hidden=3, d_out=2, lr=0.1)

print("=== GCN半监督节点分类训练 ===\n")
print(f"总节点数: 6,标注节点数: {np.sum(train_mask)}")
print(f"训练前:")

for epoch in range(5):
    loss, acc = gcn_model.train_step(X, A, y, train_mask)
    print(f"轮次 {epoch+1}: 损失={loss:.4f}, 标注节点准确率={acc:.2%}")

print("\n→ GCN利用图结构,仅用2个标注节点就能学习分类")
print("→ 未标注节点的特征通过图卷积影响标注节点的表示")
print("→ 这就是半监督学习的威力!")
GCN的二层分类模型\(Z = \text{softmax}\left(\hat{A} \cdot \text{ReLU}\left(\hat{A} X W^{(0)}\right) W^{(1)}\right), \quad \hat{A} = \tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}}\)
大白话 2层GCN就是"两次朋友圈讨论"。第一次讨论后,每个人形成了初步意见(隐藏层);第二次讨论后,每个人形成了最终判断(分类结果)。这两次讨论的"思考方式"(W^{(0)}和W^{(1)})是通过标注数据学习到的。只标注了少数节点,但因为信息在图上的流动,所有人的判断都会受到影响——这就是半监督学习。

什么用(应用):GCN的半监督节点分类在学术论文分类(Cora、CiteSeer、PubMed)中取得了里程碑式的结果。在Cora数据集上,仅用5%的标注节点(约140个),GCN就能达到约81%的准确率。这种半监督能力在标注成本高的场景中特别有价值——如医学文献分类、社交网络中的异常检测、推荐系统中的用户画像等。

哪些坑(缺点):GCN的转导学习限制意味着它不能直接泛化到训练时未见过的图(inductive learning)。如果新增节点或新图,需要重新训练。此外,GCN的全批次训练需要将整个图加载到内存中,对于大图(百万节点级别)不可行。这些限制推动了GraphSAGE(归纳学习+采样)等后续工作。

概念关系图谱

概念核心含义与AI的关系关联概念
图卷积(Graph Convolution)将卷积操作推广到不规则图结构GCN的核心操作,图上的信息传播谱卷积、空间域卷积
对称归一化使用D^{-1/2}AD^{-1/2}防止度偏差保证GCN数值稳定和公平聚合度矩阵、拉普拉斯矩阵
自环(Self-loop)A+I,保留节点自身信息防止节点在卷积中丢失自身特征恒等映射、残差连接
半监督学习利用少量标注+大量未标注数据训练GCN在节点分类中的训练范式转导学习、标签传播
谱图理论基于图拉普拉斯矩阵特征分解的理论GCN的数学基础傅里叶变换、特征值
过平滑多层GCN后节点特征趋于相同GCN深度限制的核心原因表示坍缩

重点答疑

Q1: GCN为什么通常只用2层?

实验表明,GCN在2层时效果最好,超过3层性能急剧下降。原因是"过平滑"(over-smoothing)——每层图卷积相当于对节点特征做一次平滑(邻居平均),多层后所有节点的特征趋于相同,失去区分度。数学上,多层GCN等价于图拉普拉斯矩阵的幂迭代,最终收敛到图的平稳分布。这也是为什么GCN论文中W^{(0)}和W^{(1)}的大小不同(输入→隐藏→输出),而非简单的堆叠相同层。

Q2: GCN的"卷积"和CNN的卷积有什么本质区别?

CNN的卷积有固定的卷积核大小(如3×3),在所有位置共享权重,提取的是"局部模式"。GCN的"卷积"其实是邻居聚合——每个节点聚合所有邻居(数量不固定),没有共享的卷积核(W是全局的,但聚合模式由图的局部结构决定)。严格来说,GCN的"卷积"更接近"图上的平均操作+线性变换",而非传统意义上的卷积。

Q3: GCN如何处理有向图?

标准GCN假设图是无向的(A对称),对称归一化D^{-1/2}AD^{-1/2}也要求A对称。对于有向图,可以有两种处理方式:①将A+A^T转为无向图(丢失方向信息);②使用非对称归一化D^{-1}A(保留方向,但丢失对称性)。在实践中,如果方向信息重要(如"论文A引用论文B"),需要专门的GCN变体来处理有向图。

章节单词汇总

英文音标术语/释义
Graph Convolutional Network (GCN)/ɡræf ˌkɑːnvəˈluːʃənəl ˈnetwɜːrk/图卷积网络,最经典的图神经网络
Spectral Convolution/ˈspektrəl ˌkɑːnvəˈluːʃən/谱卷积,基于图傅里叶变换的卷积定义
Symmetric Normalization/sɪˈmetrɪk ˌnɔːrməlaɪˈzeɪʃən/对称归一化,D^{-1/2}AD^{-1/2}
Self-loop/self luːp/自环,A+I,添加自身连接
Renormalization Trick/riːˌnɔːrməlaɪˈzeɪʃən trɪk/重归一化技巧,解决数值不稳定性
Transductive Learning/trænzˈdʌktɪv ˈlɜːrnɪŋ/转导学习,训练时需要看到测试数据的结构
Semi-supervised/ˌsemi ˈsuːpərvaɪzd/半监督,部分标注+部分未标注的训练方式
Over-smoothing/ˈoʊvər ˈsmuːðɪŋ/过平滑,多层后节点特征趋于相同
Chebyshev Polynomial/tʃɪˈbɪʃɒf ˌpɒlɪˈnoʊmiəl/切比雪夫多项式,用于近似谱卷积
Laplacian Matrix/ləˈpleɪʃən ˈmeɪtrɪks/拉普拉斯矩阵,L = D - A

面试练习

Q1 [单选] GCN的核心公式中,Ã = A + I的作用是什么?

  • A. 增加图的密度
  • B. 对邻接矩阵归一化
  • C. 添加自环,保留节点自身信息
  • D. 增加模型参数量
解答:Ã = A + I在每个节点上添加自环,确保节点自身特征在聚合中不被丢失。没有自环,节点的新特征仅来自邻居,自身信息可能丢失。

Q2 [单选] GCN的对称归一化中,边(i,j)的权重是多少?

  • A. 1/d_i
  • B. 1/d_j
  • C. 1/√(d_i·d_j)
  • D. 1/(d_i+d_j)
解答:对称归一化后,边(i,j)的权重为1/√(d_i·d_j),其中d_i和d_j分别是两个节点的度。这种归一化确保了数值稳定性和对称性。

Q3 [单选] GCN通常使用几层?

  • A. 1层
  • B. 2层
  • C. 5-10层
  • D. 50层以上
解答:GCN通常在2层时效果最好。超过3层会导致过平滑(所有节点特征趋于相同),性能急剧下降。这是GCN的一个主要局限。

Q4 [多选] 关于GCN,以下哪些说法是正确的?

  • A. GCN将卷积操作从图像推广到图结构
  • B. GCN使用对称归一化防止度大的节点主导
  • C. GCN可以堆叠任意深度而不损失性能
  • D. GCN是转导模型,训练时需要看到整个图结构
  • E. GCN不需要激活函数
解答:GCN将卷积推广到图、使用对称归一化、是转导模型。但GCN不能堆叠太多层(过平滑),且需要ReLU等激活函数提供非线性。

Q5 [单选] 在GCN中,如果节点A有100个邻居,节点B有2个邻居,对称归一化如何影响边(A,B)的权重?

  • A. 权重增加,因为A的度大
  • B. 权重被稀释,因为1/√(100×2)≈0.07
  • C. 权重不变,与度无关
  • D. 权重取决于A和B的特征
解答:对称归一化后权重为1/√(100×2)≈0.07,相比如果两节点度都是2(权重1/2=0.5),权重被显著稀释。这防止了高度节点垄断信息传播。

Q6 [单选] GCN的"卷积"与传统CNN卷积的本质区别是什么?

  • A. GCN不使用权重
  • B. GCN的邻居数量不固定,不像CNN有固定大小的卷积核
  • C. GCN不需要激活函数
  • D. GCN没有区别
解答:CNN的卷积核大小固定(如3×3),在所有位置共享。GCN的"卷积"其实是邻居聚合,每个节点的邻居数量不同,没有固定的卷积核大小。

Q7 [多选] 以下哪些是GCN的局限性?

  • A. 转导学习——无法直接泛化到新节点
  • B. 全批次训练——无法处理大规模图
  • C. 过平滑——不能堆叠太多层
  • D. 假设图是无向的,对有向图处理有限
  • E. 无法处理节点特征
解答:GCN是转导模型(需要看到整个图)、全批次训练(大图受限)、过平滑(层数限制)、假设无向图。GCN可以处理节点特征,这是其输入之一。

Q8 [单选] GCN的谱卷积推导中,使用了几阶切比雪夫多项式近似?

  • A. 0阶
  • B. 1阶
  • C. 2阶
  • D. 3阶
解答:GCN使用一阶切比雪夫多项式近似,将谱卷积简化为空间域的邻居聚合。这大大简化了计算,避免了昂贵的特征分解。

Q9 [多选] 关于GCN中的半监督学习,以下哪些是正确的?

  • A. 训练时使用整个图的邻接矩阵和所有节点特征
  • B. 损失函数只在标注节点上计算
  • C. 未标注节点的特征不参与计算
  • D. 未标注节点通过图卷积间接影响标注节点的表示
  • E. 需要标注所有节点才能训练
解答:GCN半监督训练使用全图结构和所有节点特征,但损失只计算标注节点。未标注节点通过消息传递影响标注节点,提供额外的结构信息。这就是半监督学习的核心。

Q10 [单选] 在Cora数据集上,2层GCN能达到约多少准确率?

  • A. 50%
  • B. 65%
  • C. 81%
  • D. 95%
解答:GCN在Cora数据集上(半监督,5%标注)能达到约81%的准确率。这在当时是state-of-the-art的结果,证明了GCN的有效性。