对比学习(Contrastive Learning)总论
1. 核心思想
对比学习的核心目标是学习一个嵌入空间,使得相似样本(正样本)的距离接近,不相似样本(负样本)的距离远离。
1.1 基本框架
给定一个查询样本
其中
1.2 为什么对比学习能学习到可迁移的判别表示
对比学习通过**极端的代理任务(pretext task)**学习表示:
- 无需标签:仅依靠数据自身的结构信息
- 区分性:强迫模型区分所有样本对,习得细粒度特征
- 迁移性:学到的特征跨越不同视觉/语言任务,因为模型必须捕获语义级相似性而非浅层视觉线索
2. 数学统一框架
2.1 相似度函数
点积相似度(余弦相似度的缩放版本)
归一化温度缩放点积(NT-Xent 使用的相似度)
其中
2.2 温度系数对分布的影响
定义
- 低
(如 0.01-0.1):分布锐利(sharp),梯度由少数困难负样本主导 - 高
(如 0.5-1.0):分布平滑(smooth),所有负样本贡献相近梯度
2.3 分布对齐:均匀性(Uniformity)
好的对比学习表示应满足两个性质:
- 对齐性(Alignment):正样本对距离接近
- 均匀性(Uniformity):表示在超球面上均匀分布
均匀性度量:
3. 典型损失函数
3.1 Contrastive Loss(对比损失)
-margin-based contrastive loss,也称为 Contrastive Loss:
其中:
是欧氏距离的平方 指示是否为正样本对(1=正,0=负) 是边界超参数
当
3.2 Triplet Loss
其中:
是锚点(anchor) 是正样本(positive) 是负样本(negative) 是边界,确保正负样本间有足够间隔
3.3 InfoNCE
InfoNCE 将对比学习建模为预测正样本的分类问题:
分解形式:
温度系数梯度分析:
对数概率的梯度:
- 正样本项:
,直接推动正样本相似度 - 负样本项:
,根据概率推开负样本
InfoNCE 与互信息的关系:
InfoNCE 是
其中
3.4 NT-Xent (Normalized Temperature-scaled Cross Entropy)
SimCLR 使用的损失,对每个样本
其中:
是 batch size(含两个 view) 是归一化点积 是 的正样本(配对的另一个增强) 排除自身
总损失取所有
3.5 Margin-based Loss
当
4. 温度系数 的深入分析
4.1 温度系数对梯度的影响
设
关键观察:当
4.2 温度系数对表示分布的影响
| 分布特征 | 梯度来源 | 风险 | |
|---|---|---|---|
| 极锐利(接近 one-hot) | 主导负样本 | 表示空间各向异性,易崩溃 | |
| 较锐利 | 困难负样本 | 可能过度关注硬负样本 | |
| 适中 | 均衡 | 推荐起始值 | |
| 平滑 | 所有负样本均匀 | 对比信号被稀释 |
4.3 温度系数的自适应策略
线性升温:初期
余弦衰减:
基于熵的调整:当正样本概率熵过高时降低
5. 正负样本构造策略
5.1 正样本构造
图像领域:
- 同一图像的不同增强视图(裁剪、翻转、颜色变换)
- 同一图像的不同区域块(patch)
- 视频中的连续帧(时序正样本)
文本领域:
- 同一句子经不同增强的版本
- 上下文相关掩码预测的恢复
- 机器翻译中的不同语言版本
关键原则:正样本应保持语义一致性,仅改变表面属性而不改变语义类别。
5.2 负样本构造
In-batch 负样本
将同一个 batch 内其他样本视为负样本。SimCLR 的做法:batch size
Memory Bank
维护一个较大的样本库
Queue-based 负样本
使用队列维护最近见过的样本。新样本入队,最旧的样本出队。队列大小(如 65536)与 batch size 解耦。
5.3 负样本质量的重要性
硬负样本(与查询高度相似但实际不同):
- 提供强梯度信号
- 过多会导致学习困难
- 适度的硬负样本有益
简单负样本:
- 提供平稳梯度
- 数量多但信息量少
- 避免极端:完全简单负样本会退化为 trivial
负样本数量与 batch size 的关系:
| batch size | 负样本数 | 效果 |
|---|---|---|
| 32 | 62 | 通常不足 |
| 64 | 126 | 基本可用 |
| 256 | 510 | 推荐起步 |
| 4096 | 8190 | 显著提升 |
| 8192 | 16382 | 最佳效果 |
6. 表示崩溃(Representation Collapse)
6.1 崩溃的类型
完全崩溃:所有样本映射到同一个点
,其中 是常数向量- 损失值接近某常数,无法进一步优化
局部崩溃:所有样本映射到嵌入空间的子空间
- 表示仅分布在某个子流形上
- 维度降低,判别能力丧失
6.2 崩溃的原因
对比损失存在退化解:如果所有样本的表示都相同(
(正样本相似度 = 1) (负样本相似度 = 1)- 损失值固定,无法区分好与坏的表示
形式化:当
6.3 防止崩溃的方法
归一化(
将表示限制在超球面上,防止坍缩到某一点。但仍可能使所有表示聚集在单位球的某个区域。
停止梯度(Stop Gradient):
- BYOL/SimSiam:使用预测器网络
预测另一个 view 的表示 - 梯度仅从一侧流向另一侧,打破对称性
- 不需要负样本即可防止崩溃
Shuffle BN:
- 在两侧网络间打乱 BatchNorm 的统计量
- 防止信息泄漏导致崩溃
正则化均匀性:
显式推动表示均匀分布。
7. 工程实践
7.1 数据增强策略
图像增强策略:
| 增强类型 | 说明 | 效果 |
|---|---|---|
| 随机裁剪 + 调整大小 | 从原图裁剪不同区域并resize | 引入空间多样性 |
| 水平翻转 | 随机水平翻转 | 引入视角变化 |
| 颜色扰动 | 随机调整亮度/对比度/饱和度/色调 | 捕获颜色相似性 |
| 高斯模糊 | 对图像应用高斯模糊 | 增加抗干扰性 |
| 灰度化 | 以概率转换为灰度图 | 增加颜色不变性 |
| 随机网格化 | 将图像划分为网格并打乱 | 引入结构变化 |
文本增强策略:
- 同义词替换(EWK)
- 随机插入(RI):在句子中随机插入词语及其同义词
- 随机交换(RS):随机交换句子中两个词的位置
- 随机删除(RD):以概率随机删除词
多模态增强:
- 随机丢弃模态(如 dropout image 或 text)
- 随机标记丢弃(类似 BERT 的 [MASK])
7.2 Batch Size 与负样本数量
SimCLR 的消融实验:
| Batch Size | 负样本数 | ImageNet Top-1 |
|---|---|---|
| 256 | 510 | 71.7% |
| 512 | 1022 | 73.3% |
| 1024 | 2046 | 74.8% |
| 2048 | 4094 | 76.0% |
| 4096 | 8190 | 77.0% |
增加有效负样本的方法:
-
Memory Bank:将负样本数量与 batch size 解耦
- Memory Bank 大小
可设为 65536 或更大 - 每次随机采样
个样本作为负样本
- Memory Bank 大小
-
队列-based(MoCo):
- 维护一个队列
存储最近 个样本的表示 - 新 batch 的表示入队,最旧的出队
- 队列与编码器异步更新
- 维护一个队列
-
梯度累积:
- 在多个小 batch 上累积梯度
- 等效于更大的 batch size
7.3 监控嵌入空间健康
正负样本相似度分布监控:
# 训练时记录
positive_similarities = []
negative_similarities = []
for batch in dataloader:
z1, z2 = encoder(batch) # 两个增强的表示
# 计算正样本对相似度
pos_sim = torch.mm(z1, z2.T) # 对角线元素为正样本对
# 计算负样本对相似度
neg_sim = torch.mm(z1, z2.T) # 非对角线元素
positive_similarities.append(torch.diag(pos_sim).mean())
negative_similarities.append(neg_sim[~mask].mean())- 正样本相似度应该高且稳定(> 0.8)
- 负样本相似度应该低但不要太低(0.1-0.3 为宜)
- 如果负样本相似度接近 0,可能表示崩溃或温度系数过低
均匀性度量:
监控
t-SNE/UMAP 可视化:
每若干 epoch 可视化嵌入空间,检查是否形成有意义的聚类。
7.4 对比学习与分类学习的区别
| 维度 | 对比学习 | 分类学习 |
|---|---|---|
| 标签依赖 | 不需要标签,利用数据自身结构 | 需要明确标签 |
| 优化目标 | 样本间的相对关系 | 样本与类别标签的映射 |
| 表示性质 | 语义级相似性,更通用 | 任务特定,判别性强 |
| 迁移能力 | 特征迁移性好,可用于下游任务 | 迁移依赖微调 |
| 负样本 | 必须,用于区分 | 通常不需要 |
| 表示维度 | 通常需要归一化(如 | 通常不需要归一化 |
7.5 对比学习与其他任务的关系
与检索的关系:
- 对比学习学到的表示可直接用于基于余弦相似度的最近邻检索
- 检索质量是表示质量的直接指标
与聚类的关系:
- SwAV 等方法将对比学习与聚类结合
- 通过聚类生成伪标签,再进行对比学习
与表示迁移的关系:
- 视觉领域的预训练表示可迁移到文本领域(如 CLIP)
- 对比学习提供了跨模态对齐的自然框架
8. 典型算法演进
8.1 早期方法
| 方法 | 年份 | 关键思想 |
|---|---|---|
| CPC | 2019 | 通过预测未来表示学习 |
| RotNet | 2018 | 识别图像旋转角度 |
| DeepCluster | 2018 | 聚类生成伪标签 |
8.2 Contrastive Learning 时代
| 方法 | 年份 | 关键贡献 |
|---|---|---|
| MoCo | 2020 | 队列 + 动量编码器 |
| SimCLR | 2020 | 大 batch + 强增强 |
| BYOL | 2020 | 孪生网络 + 预测器 + 停止梯度 |
| SwAV | 2020 | 对比学习 + 聚类 |
8.3 CLIP 与多模态时代
CLIP (ICML 2021):
- 视觉编码器 + 文本编码器对比学习
- 4亿图像-文本对预训练
- 零样本分类能力
9. 对比学习任务设计检查清单
样本构造:
- 正样本构造方式是否合理(语义一致性)
- 负样本数量是否充足(建议 > 1000)
- 是否避免正样本泄漏(如augmentation后仍属同一类)
网络架构:
- 是否使用归一化(如
归一化) - Projection Head 是否使用多层 MLP
- 是否使用动量编码器(MoCo)或停止梯度(SimSiam)
损失函数:
- 是否设置温度系数
(推荐范围 0.05-0.2) - 温度系数是否需要自适应调整
- 是否监控损失值收敛情况
数据增强:
- 图像增强策略是否充分(建议至少 3 种组合)
- 增强是否改变语义(不应改变)
- 文本增强是否保持语义等价
训练监控:
- 是否监控正样本相似度分布
- 是否监控负样本相似度分布
- 是否监控均匀性指标
- 是否定期可视化嵌入空间
资源规划:
- Batch size 是否足够(建议 >= 256)
- Memory Bank 或 Queue 大小是否合理
- 是否需要梯度累积
10. 常见训练问题排查表
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 表示崩溃:所有表示相同或相近 | 对比损失退化解 | 添加 |
| 正样本相似度过高 (> 0.95) | 温度系数过低或增强不足 | 提高 |
| 正样本相似度过低 (< 0.5) | 增强过于激进、编码器容量不足 | 减弱增强、增加网络深度、使用预训练模型 |
| 负样本相似度过高 (> 0.5) | 负样本数量不足、采样有偏 | 增加负样本数量、使用 Memory Bank、使用更难的负样本采样 |
| 负样本相似度过低 (< 0.05) | 温度系数过低、表示空间过于稀疏 | 提高 |
| **训练不稳定/震荡 | 学习率过高、batch size 过小 | 降低学习率、使用学习率预热(warmup)、增加 batch size |
| 迁移效果差:下游任务性能低 | 任务过于简单、数据分布差异大 | 使用更多样化的预训练数据、使用任务相关的正样本构造 |
| 梯度消失/爆炸 | 相似度数值范围问题 | 归一化向量、使用梯度裁剪(max_norm=1.0)、调整 |
| 收敛过慢 | 表示维度不足、信息瓶颈 | 增加嵌入维度(512→1024)、移除 Projection Head 瓶颈层 |
| Loss 不下降 | 学习率过低/过高、梯度阻塞 | 调整学习率、检查梯度流、验证数据加载 |
| 内存不足 | 负样本队列过长、batch size 过大 | 减小 Queue 大小、使用梯度累积、降低 batch size |
| 过早收敛到局部解 | 正样本过于简单、负样本过于困难 | 增加增强难度、使用课程学习(从易到难) |
| 嵌入空间碎片化 | 温度系数过高、缺少均匀性约束 | 降低 |
11. 数学推导补充
11.1 InfoNCE 与互信息下界的完整推导
设
定义提议分布
互信息
应用 Jensen 不等式和琴生不等式,可得:
因此,最小化 InfoNCE 损失等价于最大化互信息下界。
11.2 为什么 In-batch 负样本有效
设 batch 内有
对于样本
采样偏差分析:设负样本的真实分布为
当
其中
12. 扩展话题
12.1 有监督对比学习
Supervised Contrastive Learning (SimCLR v2) 将标签信息融入正负样本构造:
其中
有监督 vs 无监督:有监督对比学习中,相同类别的不同增强也视为正样本,大幅增加正样本数量。
12.2 多模态对比学习
CLIP (Learning Transferable Visual Models From Natural Language Supervision):
- 双塔架构:图像编码器
+ 文本编码器 - 对比损失:
- 大规模预训练:4亿图像-文本对
- 零样本迁移:通过自然语言提示实现分类
12.3 对比学习与非对比学习的结合
掩码图像建模 (MAE) + 对比学习:
- 使用对比学习作为辅助损失
- MAE 提供局部特征,对比学习提供全局语义
DINO (Self-Distillation with No Labels):
- 学生网络预测教师网络的中心(center)
- 避免使用负样本,通过交叉熵实现判别学习
13. 核心公式速查
InfoNCE:
NT-Xent:
Triplet Loss:
温度梯度:
参考资料
- SimCLR: A Simple Framework for Contrastive Learning of Visual Representations (Chen et al., 2020)
- Momentum Contrast for Unsupervised Visual Representation Learning (He et al., 2020)
- BYOL: Bootstrap Your Own Latent (Grill et al., 2020)
- CLIP: Learning Transferable Visual Models From Natural Language Supervision (Radford et al., 2021)
- InfoNCE: A Mutual Information Lower Bound for Representation Learning