8. 图对比学习与图预训练
8.1 为什么图上也需要自监督与预训练
8.1.1 图监督学习的困境
传统的图神经网络(GNN)依赖大量标注数据进行监督学习。然而,在实际场景中:
- 标注成本高昂:节点分类、边预测等任务需要专业领域知识(如分子性质预测需要化学家标注)
- 标注稀疏:真实图数据(如社交网络、知识图谱)中只有极少数节点/边有标签
- 分布迁移严重:预训练图(如分子图)与下游任务图可能来自不同分布
8.1.2 图自监督的核心动机
图自监督学习的核心目标是:在没有人工标签的情况下,让模型学习到对下游任务有用的图结构表示。
这与自然语言处理和计算机视觉中预训练的动机一致:
- BERT通过掩码语言模型学习通用的语言表示
- CLIP通过对比学习匹配图像和文本
- 图对比学习通过正负样本对比学习图的结构特征
8.1.3 图预训练的必要条件
并非所有图都适合预训练,有效的图预训练需要满足:
- 结构一致性:预训练和下游任务中的图结构具有相似性(如都是分子图)
- 特征可迁移性:节点/边特征在预训练和下游任务中具有相同语义
- 任务相关性:预训练任务(如节点属性预测)与下游任务存在关联
8.2 图自监督的目标层级
图自监督学习可以在不同粒度上进行,涵盖从节点到整个图的各级别表示学习。
8.2.1 节点级自监督
目标:学习每个节点的表示,使其反映节点的局部结构特征。
典型任务:
- 属性掩码(Attribute Masking):随机掩码节点特征,模型预测被掩码的属性
- 节点预测(Node Prediction):预测随机掩码节点的属性或类型
数学表达:
设节点
其中
8.2.2 边级自监督
目标:学习边的存在性或边类型的预测能力。
典型任务:
- 边预测(Edge Prediction):随机删除部分边,模型预测边是否存在
- 边类型预测:在异质图中预测边的类型
数学表达:
设边
其中
8.2.3 子图级自监督
目标:学习局部结构模式,如社区结构或局部拓扑特征。
典型任务:
- 子图属性预测:预测子图的标签(如分子子结构的功能团)
- 图匹配:判断两个子图是否同构
应用场景:在分子图中学习官能团表示,在社交网络中学习社区表示。
8.2.4 图级自监督
目标:学习整个图的全局表示,用于图分类、图生成等任务。
典型任务:
- 图级别的属性预测
- 图对比学习(Graph-Level Contrastive Learning)
8.3 图对比学习的数学框架
8.3.1 图对比损失函数
图对比学习的基本思想是:相似的图(正样本)距离应近,不相似的图(负样本)距离应远。
给定一个锚点图
其中:
是图 的表示 是余弦相似度 是温度系数(temperature) 遍历所有正负样本
8.3.2 正样本构造的三种机制
8.3.2.1 增强视图(Augmentation Views)
通过对原始图进行数据增强,生成两个视图作为正样本对。
设原始图为
其中
关键洞察:图对比学习的本质是最大化原始图与其增强视图之间的互信息。
8.3.2.2 邻接保持(Adjacency Preservation)
正样本对需要保持原始图的邻接关系。在图对比学习中,这意味着:
- 结构保持:增强操作不应破坏节点间的连通性
- 局部一致性:相邻节点的表示应该相似
设
这引出了 图对比正则项:
其中
8.3.2.3 局部一致性(Local Consistency)
在图的流形假设下,附近节点(在图上距离近)应该有相似的表示。
设
其中
8.3.3 负样本与温度系数
8.3.3.1 负样本的重要性
图对比学习需要负样本防止表示崩溃(collapse)。如果没有负样本,模型可能将所有节点映射到同一表示。
负样本来源:
- 跨图负样本:同一batch中不同图的节点对
- 图中负样本:同一图中相距较远的节点对
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 是指模型学到一种平凡表示,所有节点映射到同一空间点或微小簇。
风险来源:
- 负样本不足:负样本数量太少或区分度不够
- 温度过低:导致过度关注hard negatives
- 正样本过强:增强操作破坏结构信息
解决方案:
- 对比正则:
其中
-
Dropout正则:在表示层使用dropout增加鲁棒性
-
动量更新:使用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(子图采样)
操作:从原始图中采样子图作为增强视图。
方法:
-
随机游走采样:从种子节点出发进行随机游走,收集游走路径上的节点和边
-
k-hop子图采样:以节点
为中心,采样 跳内的所有节点和边 -
BFS采样:广度优先搜索采样
子图采样后的处理:
- 需要重新归一化拉普拉斯矩阵
- 需要重新计算节点度数统计量
8.4.4 其他增强方法
| 方法 | 操作 | 适用场景 |
|---|---|---|
| Node Dropout | 随机删除节点及其连边 | 需要学习节点重要性的场景 |
| AdaRing | 自适应边丢弃率 | 需要平衡结构和特征学习的场景 |
| GraphCropping | 裁剪图的局部区域 | 图级对比学习 |
| SpectralAug | 在谱域扰动图 | 保留全局结构信息 |
8.4.5 为什么图对比学习对数据增强特别敏感
图对比学习对增强方法敏感的原因:
-
结构依赖性:图的结构信息存在于邻接矩阵中,增强操作可能破坏关键的拓扑结构
-
语义完整性:图中的节点/边通常有明确的语义(如分子中的原子键),增强需要保持这种语义
-
非置换不变性:与图像不同,图的节点没有自然的空间位置,增强操作的边界不清晰
-
小世界效应:真实图(如社交网络)通常是稀疏的,删除少量边可能导致结构剧烈变化
敏感性表现:
- 边丢弃率过高会破坏连通性,导致信息传递受阻
- 节点删除可能改变图的密度分布
- 不恰当的子图采样可能丢失全局信息
8.5 图预训练到下游任务的迁移
8.5.1 迁移学习的基本框架
图预训练的迁移遵循标准范式:
预训练阶段:
图数据 → 预训练任务(如掩码属性预测)→ 预训练模型
微调阶段:
下游图数据 → 预训练模型(加载权重)→ 微调任务头 → 下游预测
关键步骤:
- 在大规模无标注图上预训练
- 迁移预训练模型的参数作为下游任务的初始化
- 使用下游任务的少量标注数据微调
8.5.2 节点分类任务的迁移
场景:给定一个新的图,只有少量节点有标签,需要预测剩余节点的标签。
迁移方式:
- 冻结编码器:预训练GNN编码器参数冻结,只训练任务头
- 微调:端到端微调所有参数
数学表达:
设预训练编码器为
冻结模式:
微调模式:
8.5.3 分子性质预测的迁移
场景:预测分子的化学性质(如溶解度、毒性)。
分子图表示:
- 节点:原子(特征:原子类型、电负性等)
- 边:化学键(特征:键类型、键长等)
预训练任务:
- 原子属性预测:掩码原子类型,让模型学习化学环境
- 化学键预测:掩码键类型,预测键的存在
- 分子性质预测:预测分子的整体性质
迁移要点:
- 预训练和下游使用相同的原子/键特征空间
- 分子性质预测通常需要整图级别的表示( readout 函数)
8.5.4 推荐系统的迁移
场景:在用户-物品交互图上进行推荐。
图结构:
- 节点:用户和物品
- 边:交互行为(如点击、购买)
预训练任务:
- 边预测:预测用户-物品交互
- 协同过滤:学习用户和物品的嵌入
迁移方式:
- 预训练用户/物品嵌入
- 在下游推荐任务中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 viewsStep 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种)
- 边:化学键类型(单键、双键、三键等)
- 结构约束:化学价键约束
预训练任务:
- 原子掩码预测:掩码原子类型,预测原子属性
- 化学键预测:掩码边类型,预测键属性
- 分子层面预测:预测分子性质(如能量)
代表工作:MolBERT、GROVER
注意事项:
- 需要遵守化学价键约束
- 原子特征需要包含电负性、杂化状态等化学信息
- 子图采样需要保持化学合理性
8.8.2 社交网络预训练
特点:
- 节点:用户(特征可能稀疏)
- 边:社交关系(可能动态变化)
- 结构特点:小世界性、社群性
预训练任务:
- 用户属性预测:预测用户profile
- 社交关系预测:预测可能的好友关系
- 社区检测:学习社区结构
代表工作:DeepWalk、Node2Vec(基于随机游走的预训练)
注意事项:
- 用户特征可能缺失,需要设计无监督结构学习任务
- 需要处理新用户(冷启动)问题
- 社交关系可能随时间变化
8.8.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 数据质量与预处理
-
图清洗:
- 移除孤立节点(无邻居的节点)
- 处理自环(self-loops)
- 检测和处理重复边
-
特征标准化:
- 节点/边特征需要进行标准化
- 处理缺失特征(填补或掩码)
-
结构验证:
- 确保图连通性
- 验证邻接矩阵的对称性(无向图)
8.10.2 训练稳定性
-
学习率调度:
- 使用warm-up策略避免早期震荡
- 推荐使用cosine annealing
-
梯度裁剪:
- 防止梯度爆炸
- 推荐阈值:1.0
-
参数初始化:
- Xavier初始化适用于GNN
- 避免过大的初始权重
8.10.3 超参数选择
| 超参数 | 建议范围 | 说明 |
|---|---|---|
| 边丢弃率 | 0.1-0.5 | 过高破坏结构,过低无增强效果 |
| 特征掩码率 | 0.1-0.3 | 保持语义完整性 |
| 温度系数 | 0.05-0.2 | 需要根据任务调整 |
| 负样本数量 | 256-4096 | 越大越鲁棒,但增加内存 |
| 批大小 | 256-4096 | 根据图规模调整 |
8.10.4 评估与监控
-
监控指标:
- Loss曲线(对比损失是否下降)
- 表示范数(监控collapse)
- 梯度范数
-
线性探针:
- 冻结编码器,只训练线性分类器
- 快速验证预训练表示质量
-
早停策略:
- 监控验证集指标
- 避免过拟合于预训练任务
8.10.5 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 表示Collapse | 负样本不足/温度过低 | 增加负样本数量,提高温度系数 |
| 训练不收敛 | 学习率过大 | 降低学习率,使用warm-up |
| 下游任务迁移差 | 预训练任务与下游不匹配 | 调整预训练任务,选择合适的迁移策略 |
| 内存不足 | 图规模过大/负样本过多 | 减小负样本池,使用图采样 |
8.11 小结
图对比学习和图预训练的核心挑战在于 正负样本的构造:
-
正样本构造:
- 通过图增强生成多个视图
- 保持邻接关系和局部一致性
- 视图之间应该共享语义信息
-
负样本构造:
- 需要足够多的负样本防止collapse
- 负样本质量影响表示的区分度
- 温度系数控制对比的锐度
-
图增强的特殊性:
- 需要保持图的结构完整性
- 增强操作对训练效果影响显著
- 不同任务需要不同的增强策略
-
预训练迁移:
- 选择与下游任务相关的预训练任务
- 根据下游数据量选择合适的微调策略
- 层间学习率衰减可以保护预训练知识
图自监督学习的关键在于理解 图结构信息的保持,这与文本和视觉的自监督有着本质的不同。随着图学习应用的扩展,图预训练技术将在更多领域发挥重要作用。