对比学习:让模型从无标注数据中学习表征
对比学习的核心直觉非常朴素:如果两个样本是"相似"的,它们的表征应该靠近;如果"不相似",它们的表征应该远离。这种简单的思想,却催生了自监督学习领域最重要的突破之一。
为什么需要对比学习?
传统监督学习需要大量人工标注数据,这在很多领域成本高昂甚至不可行。例如,医疗影像需要专业医生逐张标注,自动驾驶需要精确的像素级标注。
对比学习的愿景:从未标注数据中自动学习有用的特征表示,然后用少量标注数据微调即可。
传统监督学习:
100万张图片 + 人工标注 → 训练模型
问题:标注成本巨大
对比学习(自监督):
100万张图片(无标注)→ 学习通用特征
1000张标注图片 → 微调
优势:大幅降低标注需求
对比学习的核心思想
对比学习通过构造正样本对和负样本对来学习表征:
- 正样本对:来自同一图像的不同增强版本 → 应该靠近
- 负样本对:来自不同图像 → 应该远离
原始图片 A → 随机裁剪 + 颜色抖动 → A'(正样本)
原始图片 B → 随机裁剪 + 颜色抖动 → B'(正样本)
正样本对:(A, A'), (B, B')
负样本对:(A, B), (A, B'), (A', B), (A', B')
目标:f(A) 与 f(A') 靠近,f(A) 与 f(B) 远离
InfoNCE 损失函数
对比学习的核心损失函数是 InfoNCE(Noise Contrastive Estimation)。它的目标是:给定一个锚点样本,从一批样本中找出正样本。
# InfoNCE 损失
def info_nce_loss(z_i, z_j, temperature=0.1):
"""
z_i, z_j: 正样本对的表征向量
batch 中有 N 个正样本对,其余为负样本
"""
# 计算所有样本对的相似度
sim = cosine_similarity(z_i, z_j) / temperature
# 正样本对的相似度(对角线)
pos_sim = torch.diag(sim) # [N]
# 分母:正样本 + 所有负样本
denom = sim.sum(dim=1) # [N]
# 损失:最小化负对数似然
loss = -torch.log(pos_sim.exp() / denom)
return loss.mean()
直觉:这个损失函数鼓励模型将正样本对的相似度远高于负样本对。
经典方法对比
SimCLR(Simple Framework for Contrastive Learning)
Google 2020 年提出,奠定了对比学习的标准范式:
SimCLR 流程:
1. 从 batch 中采样 N 个样本
2. 每个样本做两次随机增强 → 得到 2N 个增强视图
3. 用 ResNet 编码器提取特征
4. 用 MLP 投影头映射到表征空间
5. 计算 InfoNCE 损失
关键设计:
- 大 batch size(4096 或更大)→ 更多负样本
- 强数据增强(裁剪、颜色、模糊)→ 更难的正样本对
- MLP 投影头 → 提升表征质量
MoCo(Momentum Contrast)
Facebook 2020 年提出,用动量更新解决大 batch 的限制:
MoCo v2 核心设计:
- 维护一个动态的负样本队列(queue)
- 编码器用动量更新(momentum=0.999)
- 不需要大 batch,小 batch 也能获得大量负样本
优势:在 8 张 GPU 上就能训练,不需要超大 batch
CLIP(Contrastive Language-Image Pre-training)
OpenAI 2021 年提出,将对比学习扩展到多模态:
CLIP 的跨模态对比学习:
- 图像编码器:提取图像特征
- 文本编码器:提取文本特征
- 对比目标:匹配的图文对靠近,不匹配的远离
训练数据:4 亿图文对(从互联网收集)
零样本能力:无需微调,直接用文本描述分类图像
数据增强的关键作用
对比学习的效果很大程度上取决于数据增强策略。好的增强应该:
- 保持语义不变:增强后仍然是同一类事物
- 增加外观差异:让正样本对足够"难"
| 增强方式 | 图像任务 | NLP 任务 |
|---|---|---|
| 随机裁剪 | ✅ 常用 | - |
| 颜色抖动 | ✅ 常用 | - |
| 高斯模糊 | ✅ 常用 | - |
| 随机掩码 | - | ✅ 常用 |
| 词序打乱 | - | ✅ 常用 |
| 同义词替换 | - | ✅ 常用 |
对比学习的实际应用
计算机视觉
- 图像分类:在 ImageNet 上用 1% 标注数据达到监督学习 96% 的效果
- 目标检测:预训练的特征显著提升检测精度
- 医学影像:在标注稀缺的医疗领域效果突出
自然语言处理
- 句子嵌入:Sentence-BERT 使用对比学习提升语义相似度计算
- 文本检索:CLIP 实现零样本图文检索
- 代码理解:CodeBERT 用于代码搜索和克隆检测
多模态
- 图文匹配:CLIP、ALIGN 实现跨模态检索
- 视频理解:VideoCLIP 学习时空表征
- 语音-文本:Whisper 使用对比思想对齐语音和文本
对比学习的局限性
- 负样本依赖:需要大量负样本才能学到好的表征
- 增强策略敏感:增强选择不当会导致表征质量下降
- 计算开销:需要大 batch 或额外的负样本队列
- 语义歧义:某些增强可能改变语义(如裁剪掉关键物体)
总结
对比学习的核心贡献在于证明了一个简单而深刻的道理:即使没有人工标注,仅仅通过"相似"和"不相似"的对比信号,模型也能学到高质量的特征表示。从 SimCLR 到 CLIP,对比学习正在重塑我们对自监督学习的理解。