8. 图对比学习与图预训练

8.1 为什么图上也需要自监督与预训练

8.1.1 图监督学习的困境

传统的图神经网络(GNN)依赖大量标注数据进行监督学习。然而,在实际场景中:

  • 标注成本高昂:节点分类、边预测等任务需要专业领域知识(如分子性质预测需要化学家标注)
  • 标注稀疏:真实图数据(如社交网络、知识图谱)中只有极少数节点/边有标签
  • 分布迁移严重:预训练图(如分子图)与下游任务图可能来自不同分布

8.1.2 图自监督的核心动机

图自监督学习的核心目标是:在没有人工标签的情况下,让模型学习到对下游任务有用的图结构表示

这与自然语言处理和计算机视觉中预训练的动机一致:

  • BERT通过掩码语言模型学习通用的语言表示
  • CLIP通过对比学习匹配图像和文本
  • 图对比学习通过正负样本对比学习图的结构特征

8.1.3 图预训练的必要条件

并非所有图都适合预训练,有效的图预训练需要满足:

  1. 结构一致性:预训练和下游任务中的图结构具有相似性(如都是分子图)
  2. 特征可迁移性:节点/边特征在预训练和下游任务中具有相同语义
  3. 任务相关性:预训练任务(如节点属性预测)与下游任务存在关联

8.2 图自监督的目标层级

图自监督学习可以在不同粒度上进行,涵盖从节点到整个图的各级别表示学习。

8.2.1 节点级自监督

目标:学习每个节点的表示,使其反映节点的局部结构特征。

典型任务

  • 属性掩码(Attribute Masking):随机掩码节点特征,模型预测被掩码的属性
  • 节点预测(Node Prediction):预测随机掩码节点的属性或类型

数学表达: 设节点 的原始特征为 ,掩码后为 ,则损失函数为:

其中 是节点表示, 是 sigmoid 函数。

8.2.2 边级自监督

目标:学习边的存在性或边类型的预测能力。

典型任务

  • 边预测(Edge Prediction):随机删除部分边,模型预测边是否存在
  • 边类型预测:在异质图中预测边的类型

数学表达: 设边 的预测概率为 ,则:

其中 表示边是否被保留。

8.2.3 子图级自监督

目标:学习局部结构模式,如社区结构或局部拓扑特征。

典型任务

  • 子图属性预测:预测子图的标签(如分子子结构的功能团)
  • 图匹配:判断两个子图是否同构

应用场景:在分子图中学习官能团表示,在社交网络中学习社区表示。

8.2.4 图级自监督

目标:学习整个图的全局表示,用于图分类、图生成等任务。

典型任务

  • 图级别的属性预测
  • 图对比学习(Graph-Level Contrastive Learning)

8.3 图对比学习的数学框架

8.3.1 图对比损失函数

图对比学习的基本思想是:相似的图(正样本)距离应近,不相似的图(负样本)距离应远

给定一个锚点图 ,其正样本 和负样本 ,对比损失(InfoNCE)定义为:

其中:

  • 是图 的表示
  • 是余弦相似度
  • 是温度系数(temperature)
  • 遍历所有正负样本

8.3.2 正样本构造的三种机制

8.3.2.1 增强视图(Augmentation Views)

通过对原始图进行数据增强,生成两个视图作为正样本对。

设原始图为 ,增强操作 生成视图 。对比学习最大化:

其中 是互信息。

关键洞察:图对比学习的本质是最大化原始图与其增强视图之间的互信息。

8.3.2.2 邻接保持(Adjacency Preservation)

正样本对需要保持原始图的邻接关系。在图对比学习中,这意味着:

  1. 结构保持:增强操作不应破坏节点间的连通性
  2. 局部一致性:相邻节点的表示应该相似

在原始图中相邻,即 ,增强后仍应保持某种邻接关系:

这引出了 图对比正则项

其中 是距离度量。

8.3.2.3 局部一致性(Local Consistency)

在图的流形假设下,附近节点(在图上距离近)应该有相似的表示。

跳邻居,局部一致性损失为:

其中 是基于图距离的权重, 跳邻居。

8.3.3 负样本与温度系数

8.3.3.1 负样本的重要性

图对比学习需要负样本防止表示崩溃(collapse)。如果没有负样本,模型可能将所有节点映射到同一表示。

负样本来源:

  1. 跨图负样本:同一batch中不同图的节点对
  2. 图中负样本:同一图中相距较远的节点对

8.3.3.2 温度系数的影响

温度系数 控制对比损失的锐度:

效果适用场景
高 (e.g., 1.0)软化分布,关注相对顺序粗粒度任务
低 (e.g., 0.1)锐化分布,关注hard negatives细粒度任务
极低 (e.g., 0.01)接近one-hot,可能导致训练不稳定需要高度区分性

数学上, 控制相似度分布的熵:

越小,分布越尖锐(低熵); 越大,分布越平滑(高熵)。

8.3.3.3 Collapse 风险与对策

Collapse 是指模型学到一种平凡表示,所有节点映射到同一空间点或微小簇。

风险来源

  1. 负样本不足:负样本数量太少或区分度不够
  2. 温度过低:导致过度关注hard negatives
  3. 正样本过强:增强操作破坏结构信息

解决方案

  1. 对比正则

其中 防止collapse,如:

  1. Dropout正则:在表示层使用dropout增加鲁棒性

  2. 动量更新:使用EMA更新key encoder,避免快速崩塌


8.4 图增强方法详解

图数据增强是图对比学习成功的关键因素。与图像增强不同,图增强需要保持图的结构和语义完整性。

8.4.1 Edge Dropout(边丢弃)

操作:随机删除图中一定比例的边。

数学表达: 设原始邻接矩阵为 ,边丢弃率为 ,则增强后的邻接矩阵:

作用

  • 增加模型对边扰动的鲁棒性
  • 防止过拟合于特定边结构
  • 模拟缺失边的场景

注意:边丢弃率通常在 0.1-0.5 之间,过高会破坏图的结构连通性。

8.4.2 Feature Masking(特征掩码)

操作:随机掩码节点或边的特征。

节点特征掩码: 设节点特征矩阵为 ,掩码率为 ,则:

边特征掩码:类似地掩码边的属性。

作用

  • 让模型学习基于邻域信息恢复被掩码的特征
  • 提高对特征噪声的鲁棒性
  • 类似于BERT的掩码语言模型

8.4.3 Subgraph Sampling(子图采样)

操作:从原始图中采样子图作为增强视图。

方法

  1. 随机游走采样:从种子节点出发进行随机游走,收集游走路径上的节点和边

  2. k-hop子图采样:以节点 为中心,采样 跳内的所有节点和边

  3. BFS采样:广度优先搜索采样

子图采样后的处理

  • 需要重新归一化拉普拉斯矩阵
  • 需要重新计算节点度数统计量

8.4.4 其他增强方法

方法操作适用场景
Node Dropout随机删除节点及其连边需要学习节点重要性的场景
AdaRing自适应边丢弃率需要平衡结构和特征学习的场景
GraphCropping裁剪图的局部区域图级对比学习
SpectralAug在谱域扰动图保留全局结构信息

8.4.5 为什么图对比学习对数据增强特别敏感

图对比学习对增强方法敏感的原因:

  1. 结构依赖性:图的结构信息存在于邻接矩阵中,增强操作可能破坏关键的拓扑结构

  2. 语义完整性:图中的节点/边通常有明确的语义(如分子中的原子键),增强需要保持这种语义

  3. 非置换不变性:与图像不同,图的节点没有自然的空间位置,增强操作的边界不清晰

  4. 小世界效应:真实图(如社交网络)通常是稀疏的,删除少量边可能导致结构剧烈变化

敏感性表现

  • 边丢弃率过高会破坏连通性,导致信息传递受阻
  • 节点删除可能改变图的密度分布
  • 不恰当的子图采样可能丢失全局信息

8.5 图预训练到下游任务的迁移

8.5.1 迁移学习的基本框架

图预训练的迁移遵循标准范式:

预训练阶段:
    图数据 → 预训练任务(如掩码属性预测)→ 预训练模型

微调阶段:
    下游图数据 → 预训练模型(加载权重)→ 微调任务头 → 下游预测

关键步骤

  1. 在大规模无标注图上预训练
  2. 迁移预训练模型的参数作为下游任务的初始化
  3. 使用下游任务的少量标注数据微调

8.5.2 节点分类任务的迁移

场景:给定一个新的图,只有少量节点有标签,需要预测剩余节点的标签。

迁移方式

  1. 冻结编码器:预训练GNN编码器参数冻结,只训练任务头
  2. 微调:端到端微调所有参数

数学表达: 设预训练编码器为 ,下游任务标签为

冻结模式:

微调模式:

8.5.3 分子性质预测的迁移

场景:预测分子的化学性质(如溶解度、毒性)。

分子图表示

  • 节点:原子(特征:原子类型、电负性等)
  • 边:化学键(特征:键类型、键长等)

预训练任务

  1. 原子属性预测:掩码原子类型,让模型学习化学环境
  2. 化学键预测:掩码键类型,预测键的存在
  3. 分子性质预测:预测分子的整体性质

迁移要点

  • 预训练和下游使用相同的原子/键特征空间
  • 分子性质预测通常需要整图级别的表示( readout 函数)

8.5.4 推荐系统的迁移

场景:在用户-物品交互图上进行推荐。

图结构

  • 节点:用户和物品
  • 边:交互行为(如点击、购买)

预训练任务

  1. 边预测:预测用户-物品交互
  2. 协同过滤:学习用户和物品的嵌入

迁移方式

  • 预训练用户/物品嵌入
  • 在下游推荐任务中fine-tune嵌入和GNN参数

8.6 工程流程详解

8.6.1 图增强的构造流程

Step 1:定义增强操作集合

augmentations = {
    'edge_dropout': lambda G: edge_dropout(G, p=0.2),
    'feature_mask': lambda G: feature_mask(G, p=0.1),
    'subgraph_sample': lambda G: subgraph_sample(G, k=2),
}

Step 2:采样增强视图

def generate_views(G, n_views=2):
    views = []
    for _ in range(n_views):
        aug = random.choice(list(augmentations.values()))
        views.append(aug(G))
    return views

Step 3:计算增强后的图表示

h1 = encoder(view1)
h2 = encoder(view2)

8.6.2 批处理与负样本池设计

8.6.2.1 Batch Construction

随机分组策略

  • 将多个图打包成一个batch
  • 每个图生成多个增强视图
batch_size = 32
graphs_per_batch = 8  # 每batch 8个图,每个图4个视图
 
for batch in dataloader:
    # batch: [G1, G2, ..., G8]
    views = []
    for G in batch:
        v1, v2 = generate_views(G, n_views=2)
        views.extend([v1, v2])  # 16个视图
    # 计算对比损失

8.6.2.2 负样本池设计

内存银行(Memory Bank)策略

class MemoryBank:
    def __init__(self, size, dim):
        self.bank = torch.randn(size, dim)
        self.ptr = 0
 
    def update(self, features):
        batch_size = features.shape[0]
        self.bank[self.ptr:self.ptr+batch_size] = features
        self.ptr = (self.ptr + batch_size) % size
 
    def sample(self, k):
        return self.bank[random.sample(range(len(self.bank)), k)]

在线对比策略

  • 维护一个大的负样本队列
  • 队列长度通常为数千到数万
  • 每个batch更新部分负样本

8.6.3 预训练和微调的衔接

8.6.3.1 预训练阶段

# 预训练
model = GraphEncoder()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
 
for epoch in range(100):
    for batch in dataloader:
        views = generate_views(batch)
        z = model(views)
        loss = contrastive_loss(z)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

8.6.3.2 微调阶段

# 加载预训练权重
model = GraphEncoder()
model.load_state_dict(torch.load('pretrain_checkpoint.pt'))
 
# 冻结底层参数(可选)
for name, param in model.named_parameters():
    if 'encoder' in name:
        param.requires_grad = False
 
# 添加任务头
task_head = NodeClassifier(num_classes=10)
 
for epoch in range(50):
    for batch in dataloader:
        labels = batch.y
        logits = task_head(model(batch.x, batch.edge_index))
        loss = F.cross_entropy(logits, labels)
        loss.backward()

8.6.3.3 衔接策略

策略描述适用场景
Full Fine-tune微调所有参数下游数据量充足
Freeze Encoder冻结编码器下游数据量少
Layer-wise LR Decay底层学习率低需要保持预训练知识
Linear Probing只训练任务头快速迁移

8.7 图自监督与文本/视觉自监督的对比

8.7.1 与文本自监督的对比

维度文本自监督图自监督
基本单元Token(离散的)节点/边(可连续的)
上下文序列依赖(1D)图结构依赖(高维)
掩码策略随机token掩码节点/边/子图掩码
正样本构造预测下一个token保持邻接关系
语义完整性句子语义明确图语义依赖结构

关键差异

  • 文本是置换不变量(permutation invariant),但有固定顺序
  • 图的节点没有自然顺序,需要依赖结构信息

8.7.2 与视觉自监督的对比

维度视觉自监督图自监督
数据结构规则网格(图像)不规则图结构
增强操作裁剪、旋转、颜色扰动边丢弃、节点掩码、子图采样
空间对应局部patch对应关系节点邻域对应关系
对比粒度图像级/区域级节点级/子图级/图级
敏感度相对鲁棒对增强敏感

关键差异

  • 图像的增强有直观的空间意义(图块的位置对应)
  • 图增强可能破坏关键的拓扑结构

8.8 图预训练在不同场景中的落地差异

8.8.1 分子图预训练

特点

  • 节点:原子类型(有限种类,约100种)
  • 边:化学键类型(单键、双键、三键等)
  • 结构约束:化学价键约束

预训练任务

  1. 原子掩码预测:掩码原子类型,预测原子属性
  2. 化学键预测:掩码边类型,预测键属性
  3. 分子层面预测:预测分子性质(如能量)

代表工作:MolBERT、GROVER

注意事项

  • 需要遵守化学价键约束
  • 原子特征需要包含电负性、杂化状态等化学信息
  • 子图采样需要保持化学合理性

8.8.2 社交网络预训练

特点

  • 节点:用户(特征可能稀疏)
  • 边:社交关系(可能动态变化)
  • 结构特点:小世界性、社群性

预训练任务

  1. 用户属性预测:预测用户profile
  2. 社交关系预测:预测可能的好友关系
  3. 社区检测:学习社区结构

代表工作:DeepWalk、Node2Vec(基于随机游走的预训练)

注意事项

  • 用户特征可能缺失,需要设计无监督结构学习任务
  • 需要处理新用户(冷启动)问题
  • 社交关系可能随时间变化

8.8.3 推荐图预训练

特点

  • 节点:用户和物品(异质)
  • 边:交互行为(点击、购买、评分)
  • 反馈类型:显式反馈、隐式反馈

预训练任务

  1. 交互预测:预测用户-物品交互
  2. 序列建模:建模用户行为序列
  3. 协同过滤:学习用户/物品嵌入

代表工作:GCC(Graph Contrastive Coding)

注意事项

  • 需要处理用户-物品交互的稀疏性
  • 需要区分不同类型的交互(点击 vs 购买)
  • 需要考虑时间上下文

8.9 图对比学习方法对比表

方法负样本来源增强策略适用场景关键创新
DGI图内负样本特征掩码节点分类互信息最大化
GRACE跨图负样本边丢弃+特征掩码节点分类双增强视图
GCA跨图负样本自适应增强节点分类结构感知的增强
BGRL跨图负样本+动量边丢弃+特征掩码节点分类无负样本的对比
MVGRL跨图负样本子图采样+图扩散节点分类/图分类多视图对比
SUBG-CON跨图负样本子图对比节点分类子图级对比
GraphCL跨图负样本增强组合图分类自动化增强选择

8.9.1 方法详解

DGI(Deep Graph Infomax)

  • 使用随机特征掩码作为负样本
  • 通过鉴别器判断表示是否来自原始图
  • 适用于节点级表示学习

GRACE(Graph Contrastive Learning with Adaptive Augmentation)

  • 同时使用边丢弃和特征掩码
  • 自适应调整增强强度
  • 关注结构和特征的双重保真度

BGRL(Bilateral Graph Rewiring)

  • 使用两个不同增强视图
  • 无需负样本,通过视图间对比避免collapse
  • 使用动量更新避免表示快速崩塌

8.10 图预训练训练注意事项

8.10.1 数据质量与预处理

  1. 图清洗

    • 移除孤立节点(无邻居的节点)
    • 处理自环(self-loops)
    • 检测和处理重复边
  2. 特征标准化

    • 节点/边特征需要进行标准化
    • 处理缺失特征(填补或掩码)
  3. 结构验证

    • 确保图连通性
    • 验证邻接矩阵的对称性(无向图)

8.10.2 训练稳定性

  1. 学习率调度

    • 使用warm-up策略避免早期震荡
    • 推荐使用cosine annealing
  2. 梯度裁剪

    • 防止梯度爆炸
    • 推荐阈值:1.0
  3. 参数初始化

    • Xavier初始化适用于GNN
    • 避免过大的初始权重

8.10.3 超参数选择

超参数建议范围说明
边丢弃率0.1-0.5过高破坏结构,过低无增强效果
特征掩码率0.1-0.3保持语义完整性
温度系数0.05-0.2需要根据任务调整
负样本数量256-4096越大越鲁棒,但增加内存
批大小256-4096根据图规模调整

8.10.4 评估与监控

  1. 监控指标

    • Loss曲线(对比损失是否下降)
    • 表示范数(监控collapse)
    • 梯度范数
  2. 线性探针

    • 冻结编码器,只训练线性分类器
    • 快速验证预训练表示质量
  3. 早停策略

    • 监控验证集指标
    • 避免过拟合于预训练任务

8.10.5 常见问题与解决方案

问题原因解决方案
表示Collapse负样本不足/温度过低增加负样本数量,提高温度系数
训练不收敛学习率过大降低学习率,使用warm-up
下游任务迁移差预训练任务与下游不匹配调整预训练任务,选择合适的迁移策略
内存不足图规模过大/负样本过多减小负样本池,使用图采样

8.11 小结

图对比学习和图预训练的核心挑战在于 正负样本的构造

  1. 正样本构造

    • 通过图增强生成多个视图
    • 保持邻接关系和局部一致性
    • 视图之间应该共享语义信息
  2. 负样本构造

    • 需要足够多的负样本防止collapse
    • 负样本质量影响表示的区分度
    • 温度系数控制对比的锐度
  3. 图增强的特殊性

    • 需要保持图的结构完整性
    • 增强操作对训练效果影响显著
    • 不同任务需要不同的增强策略
  4. 预训练迁移

    • 选择与下游任务相关的预训练任务
    • 根据下游数据量选择合适的微调策略
    • 层间学习率衰减可以保护预训练知识

图自监督学习的关键在于理解 图结构信息的保持,这与文本和视觉的自监督有着本质的不同。随着图学习应用的扩展,图预训练技术将在更多领域发挥重要作用。