4、对比学习基础:对比学习的基本思想、正负样本定义、损失函数(如 InfoNCE)与核心组件(编码器、投影头、负样本队列)

对比学习(Contrastive Learning)是自监督预训练中最具影响力的范式之一,其核心目标是在无标注数据上学习到具有判别力的特征表示。与生成式自监督(如掩码重建)不同,对比学习不要求模型重建原始输入,而是通过“拉近相似样本、推开不相似样本”的方式,直接优化特征空间中的距离关系。本章将系统梳理对比学习的基本思想、正负样本的构造逻辑、InfoNCE 损失函数的数学原理,以及编码器、投影头、负样本队列三大核心组件的设计与协作方式。

对比学习核心框架与组件协作关系 输入样本 x (图像/文本/音频) 增强 T₁(·) 裁剪/翻转/噪声 增强 T₂(·) 裁剪/翻转/噪声 正样本 x⁺ T₁(x) 与 T₂(x) 负样本 {x⁻} 队列/批次内其他样本 编码器 f_θ ResNet / ViT / BERT 投影头 g_φ MLP (2-3层) 特征空间 z z⁺ z⁻ InfoNCE 损失函数 L = -log [ exp(sim(z,z⁺)/τ) / (exp(sim(z,z⁺)/τ) + Σ exp(sim(z,z⁻)/τ)) ] 梯度回传更新 f_θ 与 g_φ 队列先进先出更新

上图展示了对比学习的基本框架:输入样本经过两种不同的数据增强得到正样本对,负样本则来自队列或同批次中的其他样本;所有样本通过编码器与投影头映射到特征空间,最终由 InfoNCE 损失驱动模型优化。下面逐一展开各模块的细节。

4.1 对比学习的基本思想

对比学习的核心假设是:好的特征表示应当使语义相似的样本在特征空间中靠近,使语义不相似的样本远离。这一思想源于度量学习(Metric Learning),但对比学习通过自监督方式自动构造训练信号,无需人工标注。

从信息论视角看,对比学习可以理解为最大化正样本对之间的互信息下界。给定输入 x 与其增强视图 x⁺,我们希望学习到的特征 z 能够保留 x 与 x⁺ 共享的语义信息,同时丢弃与任务无关的细节(如背景噪声、颜色扰动等)。InfoNCE 损失正是对这种互信息下界的一种有效估计。

对比学习的一个关键优势在于其灵活性:它不依赖于特定的数据模态,可以统一应用于图像、文本、音频、视频甚至跨模态数据。这使得它成为多模态自监督预训练的基础组件。

核心理解:对比学习本质上是在做“实例判别”(Instance Discrimination)——把每个样本自身的不同增强视图视为正类,把其他所有样本视为负类。模型需要学会区分“同一个东西的不同样子”和“不同的东西”,从而迫使特征提取器捕捉到具有判别力的语义信息。

4.2 正负样本的定义与构造策略

正负样本的构造方式直接决定了对比学习的上限。如果正样本对构造不当(例如增强过强导致语义改变),模型会学到错误的不变性;如果负样本质量不高(例如与正样本语义相近),模型则难以学到有区分度的特征。

4.2.1 正样本对

正样本对通常由同一输入样本经过两种不同的随机数据增强得到。以图像为例,常见的增强操作包括:

  • 几何变换:随机裁剪、缩放、翻转、旋转、扭曲
  • 色彩扰动:亮度、对比度、饱和度、色相调整
  • 噪声注入:高斯噪声、模糊、随机擦除
  • 多视角:对于视频或3D数据,不同帧或不同视角可作为正样本

对于文本,正样本可以通过回译、随机掩码、同义词替换等方式构造;对于多模态数据,同一语义内容的不同模态(如图像-文本对)天然构成正样本。

4.2.2 负样本

负样本是特征空间中需要被“推开”的样本。常见的负样本来源包括:

负样本类型 构造方式 优点 缺点
批次内负样本 同批次中其他样本 实现简单,计算高效 批次大小受限时负样本数量不足
队列负样本 维护一个动态队列,存储历史批次的特征 负样本数量大且稳定 队列中的特征可能过时(与当前编码器不一致)
动量编码器负样本 使用动量更新的编码器生成负样本特征 特征一致性更好 需要额外的编码器副本,增加显存开销
困难负样本 选择与正样本特征距离较近的样本 训练效率高,判别力强 构造复杂,可能引入噪声
注意:负样本并非越多越好。如果负样本中混入了与正样本语义相同的样本(即“假阴性”),会严重干扰训练。例如在图像数据集中,同一张猫的照片经过不同增强后,如果另一张猫的照片被当作负样本,模型会被错误地引导去分离语义相同的样本。因此,在大规模预训练中,需要结合聚类或语义过滤来降低假阴性率。

4.3 InfoNCE 损失函数

InfoNCE(Information Noise-Contrastive Estimation)是对比学习中最常用的损失函数。其数学形式如下:

L_InfoNCE = -log [ exp(sim(z_i, z_i⁺) / τ) / Σ_{j=0}^{K} exp(sim(z_i, z_j) / τ) ]

其中:

  • z_i 为锚点样本的特征表示
  • z_i⁺ 为正样本的特征表示
  • z_j 为负样本的特征表示(j=0 时即正样本,共 K+1 个样本参与计算)
  • sim(·,·) 为相似度函数,通常使用余弦相似度
  • τ 为温度系数,控制分布的锐利程度

从直觉上理解,InfoNCE 相当于一个 K+1 类的 softmax 分类问题:模型需要从 K+1 个候选样本中正确识别出那一个正样本。当温度系数 τ 较小时,分布更加锐利,模型对困难负样本更加敏感;当 τ 较大时,分布更加平滑,训练更稳定但判别力可能下降。

InfoNCE 与交叉熵损失有密切联系。当负样本数量 K 趋近于无穷大时,InfoNCE 逼近于互信息的估计。实际训练中,K 通常取 256~65536 不等,取决于显存和队列设计。

温度系数的调参经验:在 SimCLR 原中,τ=0.1 在 ImageNet 上表现最佳。τ 过小(如 0.01)会导致训练不稳定,梯度爆炸;τ 过大(如 1.0)会削弱对困难样本的惩罚,特征判别力下降。建议在 0.05~0.2 之间网格搜索。

4.4 三大核心组件

4.4.1 编码器 f_θ

编码器负责将原始输入映射为特征向量。在视觉任务中,常用 ResNet-50、ViT 等作为编码器;在文本任务中,常用 BERT、RoBERTa 等 Transformer 模型。编码器的输出通常是一个高维向量(如 2048 维),这个向量应当包含输入样本的语义信息。

编码器的设计选择直接影响预训练效果:

  • 网络深度与宽度:更深的网络能捕捉更抽象的特征,但训练成本更高
  • 输出维度:过高的维度会增加计算量,过低则可能信息不足
  • 是否使用预训练权重:在对比学习预训练之前,可以使用有监督预训练或随机初始化

4.4.2 投影头 g_φ

投影头是连接编码器与损失函数的关键模块,通常是一个 2~3 层的 MLP。它的作用是将编码器输出的高维特征映射到一个低维空间(如 128 维),在这个低维空间中计算对比损失。

为什么需要投影头?SimCLR 的实验表明:去掉投影头会显著降低下游任务性能。原因在于,编码器输出的特征中既包含与任务相关的语义信息,也包含与增强方式相关的噪声信息(如颜色、纹理等)。投影头通过非线性变换,能够过滤掉这些与增强相关的信息,使对比损失在更“干净”的语义空间中优化。

投影头的典型结构如下:

投影头 g_φ:
  Linear(2048 → 2048) → ReLU → Linear(2048 → 128)

在预训练完成后,投影头通常被丢弃,只保留编码器用于下游任务的特征提取。

4.4.3 负样本队列

负样本队列是 MoCo(Momentum Contrast)系列方法的核心创新。其基本思想是:维护一个先进先出(FIFO)的队列,存储历史批次中样本的特征表示。当前批次的样本与队列中的所有特征计算对比损失。

队列设计的关键参数包括:

参数 典型值 影响
队列长度 K 4096 ~ 65536 K 越大,负样本越丰富,但特征过时问题越严重
动量系数 m 0.99 ~ 0.999 m 越大,编码器更新越慢,特征一致性越好
批次大小 B 256 ~ 1024 影响队列更新速度和训练稳定性

MoCo 使用动量编码器来解决队列特征过时的问题:

f_θ_momentum = m * f_θ_momentum + (1 - m) * f_θ

动量编码器的参数更新缓慢,使得队列中的特征与当前编码器的输出保持较高的一致性。这种设计使得 MoCo 可以在较小的批次大小下获得大量负样本,突破了 SimCLR 对大批次的依赖。

4.5 案例拆解:SimCLR 与 MoCo 的对比分析

为了更直观地理解上述组件如何协同工作,我们以 SimCLR 和 MoCo 两个经典框架为例进行对比分析。

SimCLR(2020)采用批次内负样本策略,依赖大批次(如 8192)来提供足够的负样本。其流程为:

  1. 对批次中每个样本 x_i 生成两个增强视图 x_i¹ 和 x_i²
  2. 编码器 f_θ 提取特征 h_i¹、h_i²
  3. 投影头 g_φ 映射到低维空间 z_i¹、z_i²
  4. 对每个锚点 z_i¹,正样本为 z_i²,负样本为批次中其他所有样本的增强视图
  5. 计算 InfoNCE 损失并反向传播

MoCo(2020)则采用队列+动量编码器策略:

  1. 对锚点样本 x_q 生成一个增强视图 x_q
  2. 对正样本 x_k 生成另一个增强视图 x_k
  3. 编码器 f_q 处理锚点,动量编码器 f_k 处理正样本
  4. 正样本特征 z_k 与队列中 K 个负样本特征拼接
  5. 计算 InfoNCE 损失,更新 f_q 和投影头
  6. 将 z_k 入队,队首特征出队
对比维度 SimCLR MoCo
负样本来源 批次内其他样本 动态队列(跨批次)
所需批次大小 大(8192) 小(256~512)
特征一致性 高(同一批次编码器相同) 中(动量编码器滞后)
显存占用 高(需要同时处理大批次) 中(队列存储特征而非梯度)
适用场景 大规模并行训练 单卡或小规模集群

从实际训练效果看,SimCLR 在 ImageNet 上 Top-1 准确率略高于 MoCo,但 MoCo 在计算资源受限时表现更稳定。两者在迁移学习中的表现差异不大,说明对比学习框架的鲁棒性较强。

4.6 常见误区与总结复盘

在对比学习的实践过程中,以下几个误区值得特别注意:

误区一:盲目增大负样本数量。虽然理论上负样本越多越好,但实际中当负样本数量超过一定阈值(如 65536)后,性能提升趋于饱和,而计算开销线性增长。此外,过多的负样本可能引入更多假阴性,反而损害特征质量。
误区二:忽略投影头的作用。有些实践者为了简化模型而直接去掉投影头,导致下游任务性能下降 5%~10%。投影头是过滤增强噪声的关键模块,不应省略。
误区三:温度系数设置不当。温度系数 τ 对训练影响极大。τ 过小会导致训练发散,τ 过大则特征缺乏判别力。建议在验证集上监控正样本对的相似度分布,确保其与负样本对有明显分离。
总结复盘:对比学习的成功依赖于三个关键因素:① 合理的正样本增强策略(不能改变语义);② 充足且高质量的负样本(避免假阴性);③ 合适的损失函数与温度系数。在实际项目中,建议先在小规模数据集上验证增强策略的有效性,再扩展到大规模预训练。同时,监控训练过程中的正负样本相似度分布,可以及时发现训练异常。

对比学习作为自监督预训练的基础范式,其核心思想、组件设计和损失函数已被广泛应用于多模态预训练模型中。理解本章内容,将为后续学习多模态对比学习(如 CLIP、ALIGN)奠定坚实基础。