4、对比学习基础:对比学习的基本思想、正负样本定义、损失函数(如 InfoNCE)与核心组件(编码器、投影头、负样本队列)
对比学习(Contrastive Learning)是自监督预训练中最具影响力的范式之一,其核心目标是在无标注数据上学习到具有判别力的特征表示。与生成式自监督(如掩码重建)不同,对比学习不要求模型重建原始输入,而是通过“拉近相似样本、推开不相似样本”的方式,直接优化特征空间中的距离关系。本章将系统梳理对比学习的基本思想、正负样本的构造逻辑、InfoNCE 损失函数的数学原理,以及编码器、投影头、负样本队列三大核心组件的设计与协作方式。
上图展示了对比学习的基本框架:输入样本经过两种不同的数据增强得到正样本对,负样本则来自队列或同批次中的其他样本;所有样本通过编码器与投影头映射到特征空间,最终由 InfoNCE 损失驱动模型优化。下面逐一展开各模块的细节。
4.1 对比学习的基本思想
对比学习的核心假设是:好的特征表示应当使语义相似的样本在特征空间中靠近,使语义不相似的样本远离。这一思想源于度量学习(Metric Learning),但对比学习通过自监督方式自动构造训练信号,无需人工标注。
从信息论视角看,对比学习可以理解为最大化正样本对之间的互信息下界。给定输入 x 与其增强视图 x⁺,我们希望学习到的特征 z 能够保留 x 与 x⁺ 共享的语义信息,同时丢弃与任务无关的细节(如背景噪声、颜色扰动等)。InfoNCE 损失正是对这种互信息下界的一种有效估计。
对比学习的一个关键优势在于其灵活性:它不依赖于特定的数据模态,可以统一应用于图像、文本、音频、视频甚至跨模态数据。这使得它成为多模态自监督预训练的基础组件。
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 不等,取决于显存和队列设计。
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)来提供足够的负样本。其流程为:
- 对批次中每个样本 x_i 生成两个增强视图 x_i¹ 和 x_i²
- 编码器 f_θ 提取特征 h_i¹、h_i²
- 投影头 g_φ 映射到低维空间 z_i¹、z_i²
- 对每个锚点 z_i¹,正样本为 z_i²,负样本为批次中其他所有样本的增强视图
- 计算 InfoNCE 损失并反向传播
MoCo(2020)则采用队列+动量编码器策略:
- 对锚点样本 x_q 生成一个增强视图 x_q
- 对正样本 x_k 生成另一个增强视图 x_k
- 编码器 f_q 处理锚点,动量编码器 f_k 处理正样本
- 正样本特征 z_k 与队列中 K 个负样本特征拼接
- 计算 InfoNCE 损失,更新 f_q 和投影头
- 将 z_k 入队,队首特征出队
| 对比维度 | SimCLR | MoCo |
|---|---|---|
| 负样本来源 | 批次内其他样本 | 动态队列(跨批次) |
| 所需批次大小 | 大(8192) | 小(256~512) |
| 特征一致性 | 高(同一批次编码器相同) | 中(动量编码器滞后) |
| 显存占用 | 高(需要同时处理大批次) | 中(队列存储特征而非梯度) |
| 适用场景 | 大规模并行训练 | 单卡或小规模集群 |
从实际训练效果看,SimCLR 在 ImageNet 上 Top-1 准确率略高于 MoCo,但 MoCo 在计算资源受限时表现更稳定。两者在迁移学习中的表现差异不大,说明对比学习框架的鲁棒性较强。
4.6 常见误区与总结复盘
在对比学习的实践过程中,以下几个误区值得特别注意:
对比学习作为自监督预训练的基础范式,其核心思想、组件设计和损失函数已被广泛应用于多模态预训练模型中。理解本章内容,将为后续学习多模态对比学习(如 CLIP、ALIGN)奠定坚实基础。