2-对比学习与排序损失
1. 对比学习的基本思想
1.1 从分类到表示学习
监督学习中的分类损失(如 Cross-Entropy)要求模型将输入映射到一个固定的类别标签空间。这带来的局限是:类别数量是预定义的,新类别出现时必须重新训练;类别之间的语义关系由标签定义,无法捕捉细粒度的相似性信息。
对比学习(Contrastive Learning)的核心思想是:学习一个嵌入空间,使得相似的样本在空间中距离近,不相似的样本距离远。这里”相似”与”不相似”由数据自身定义(通常来自数据增强),而非预定义的标签。
形式化地,设编码器
其中
1.2 正负样本的定义
正样本(Positive pair):同一原始样本经不同数据增强得到的两个视图。来自同一图像的不同裁剪、不同颜色 jitter、不同翻转等。经编码器后记为
负样本(Negative pair):来自不同原始样本的视图。记为
正样本定义依赖于数据增强策略,负样本定义依赖于采样方式(batch 内采样或外部 bank)。数据增强和负样本策略是对比学习效果的两大支柱。
2. 典型对比损失函数
2.1 Contrastive Loss(对比损失,Hadsell et al., 2006)
原始形式
设一对样本
其中
各部分含义
- 正样本项(
): ,要求正样本的欧氏距离尽量小(尽量靠近) - 负样本项(
): ,仅当负样本距离小于 margin 时才施加惩罚;若负样本已经足够远( ),损失为 0,不施加额外推动力
设计动机
Contrastive Loss 的设计哲学是稀疏监督:仅对违反间隔约束的负样本施加惩罚,对已满足条件的负样本不消耗模型容量。这与 SVM 的间隔最大化思想一脉相承。
2.2 Triplet Loss(三元组损失,Schroff et al., 2015,FaceNet)
三元组结构
Triplet Loss 引入三元组
:锚点(anchor),基准样本 :正样本(positive),与 anchor 属于同一身份/类别 :负样本(negative),与 anchor 属于不同身份/类别
损失形式
其中
为什么需要间隔
若
即正负样本之间必须保持至少
三元组采样策略(重要)
Triplet Loss 的效果严重依赖采样策略。若负样本太容易(与 anchor 差距很大),则 loss 始终为 0,模型不学习;若负样本太难(与 anchor 非常接近但不是同一类),则模型被强迫在过于细粒度的边界上优化,反而影响泛化。
三种策略:
| 策略 | 选择方式 | 问题 |
|---|---|---|
| easy negative | 随机选择明显不同的负样本 | 损失总为 0,不学习 |
| hard negative | 选择与 anchor 最接近的负样本 | 过度优化困难负样本,边界畸形 |
| semi-hard negative | 选择与 anchor 距离在 | 平衡学习难度与泛化能力,经验上推荐 |
FaceNet 论文的实验表明,semi-hard negative 采样在训练稳定性和最终效果之间取得最佳平衡。
2.3 InfoNCE / NT-Xent(Noise Contrastive Estimation / Normalized Temperature-scaled Cross Entropy)
从概率出发的推导
设批量(batch)中有
模型对正样本对
根据 InfoNCE 的定义,从配分函数(partition function)角度看,
其中分子是正样本对的指数相似度,分母是所有配对(1 个正样本 +
InfoNCE 损失
负对数概率即为 InfoNCE 损失:
这正是 NT-Xent(Normalized Temperature-scaled Cross Entropy)的形式——将 temperature 引入指数相似度,再用 Cross-Entropy 的形式优化正样本被选中的概率。
等价形式展开
将
第一项
为什么叫 “Noise Contrastive Estimation”
NCE 原是 Gutmann & Hyvarinen (2010) 提出的密度比估计方法:用一个可学习的判别器区分数据分布和噪声分布。InfoNCE 将这一思想应用于对比学习,用正负样本的对比替代显式密度比,以对比的方式估计互信息(mutual information)的下界。具体地,InfoNCE 损失是
2.4 温度系数 的梯度推导与作用
温度系数的定义
温度系数
当
梯度分析
对正样本相似度
即梯度与正样本被选中的概率
温度对梯度量级的影响
对温度
但
3. 对比学习与梯度消失/表示坍塌
3.1 表示坍塌(Representation Collapse)
问题描述
表示坍塌是指编码器将所有输入映射到相同的表示(如所有嵌入趋近于同一个向量),使得任意两个样本之间的相似度均为最大(
为什么发生
Collpase 发生在模型”走捷径”时:与其学习有意义的特征对比,模型发现只要将所有输入映射到相同向量,就能让正样本对相似度为 1,从而最小化 InfoNCE。这是损失函数本身的degeneracy(退化)问题,而非优化困难。
如何避免
- 负样本必须存在且足够多:若负样本数量不足,模型可能通过让所有表示相同来”作弊”。SimCLR、MoCo 等方法通过大批量(batch size ≥ 256)或大 memory bank(queue size ≥ 4096)来保证负样本数量。
- 不对称结构(asymmetric architecture):BYOL、SimSiam 等方法不使用负样本,而是通过两个不同结构的编码器分支(在线网络 vs 目标网络)引入隐式对比信号,避免显式负样本。
- 正则化:对 embedding 添加 l2 归一化约束
,防止表示退化为零向量。
4. 负样本策略详解
4.1 Batch 内负样本(In-batch Negative)
SimCLR 采用的策略:每个 batch 有
优点:实现简单,负样本与正样本来自同一分布,采样质量高。
缺点:batch size 必须足够大(
4.2 Memory Bank / Queue(记忆库)
MoCo (Momentum Contrast) 的核心改进:用一个大尺寸的**队列(queue)**存储历史 epoch 中编码过的表示,作为负样本来源。队列大小(memory bank size)通常为 4096~65536,远超 batch size。
更新流程:
- 当前 batch 的表示入队,队列最旧的表示出队
- 负样本来自整个队列,而非当前 batch
- 队列的表示由动量编码器(momentum encoder)生成,保证负样本的表示随模型更新缓慢变化,而不是完全过时
优点:突破 batch size 限制,可以用小 batch 获得大量负样本;负样本多样性高(来自不同时期的模型)。 缺点:需要维护额外的动量编码器;memory bank 的表示与最新模型有 lag。
4.3 Cross-batch vs Within-batch
| 策略 | 负样本来源 | 采样一致性 |
|---|---|---|
| In-batch | 当前 batch 内其他样本 | 负样本与正样本分布高度一致 |
| Memory bank | 历史队列(跨 batch) | 负样本来自不同时期的模型,分布有轻微偏移 |
| Distributed negs | 多个 worker 间共享负样本(如 CLD) | 负样本规模极大,但通信开销高 |
5. 数据增强在对比学习中的角色
5.1 为什么需要数据增强
对比学习中的”标签”是数据自身的结构——同一图像的不同视图应映射到相近表示。若不对输入进行增强,模型只能学习到”相同输入”的恒等映射,而无法学到对语义变化鲁棒的表示。
数据增强引入了模型必须忽略的变换(颜色、旋转、噪声等),迫使模型捕捉变换不变量(invariant)——这些不变量通常对应语义信息(如物体的类别、形状)。
5.2 常见增强类型
| 增强类型 | 作用 | 典型场景 |
|---|---|---|
| 随机裁剪(Random Crop) | 迫使模型关注多个局部 | 图像 |
| 颜色抖动(Color Jitter) | 颜色不相关时学到形状 | 图像 |
| 高斯噪声 | 抗噪声鲁棒性 | 信号/语音 |
| 随机翻转(Horizontal Flip) | 位置不变量 | 图像 |
| 随机旋转(Rotation) | 角度不变量 | 图像 |
| 掩码(Masking) | 填补缺失信息 | NLP / 音频 |
| Mixup / CutMix | 混合样本增强 | 图像 |
5.3 增强与负样本的关系
经验上常见(empirical common practice):增强越强,负样本的有效性越低——因为强增强使得正样本对已经难以区分,负样本的挑战性相对降低。当增强很强时,可以减少负样本数量;当增强较弱时,必须增加负样本数量来维持学习信号的强度。SimCLR 的消融实验证明:更强的颜色抖动使 InfoNCE 目标对 batch size 的依赖减弱,因为正样本对本身就提供了更强的学习信号。
6. Margin Ranking Loss(排序损失)
6.1 与 Triplet Loss 的关系
Margin Ranking Loss 是 Triplet Loss 的更一般形式。设一个查询(query)
其中
与 Triplet Loss 的对比
Triplet Loss 是 Margin Ranking Loss 的特例,其中
即 Triplet Loss 的形式。
6.2 在排序 / 推荐系统中的应用
在信息检索(IR)和推荐系统中,Margin Ranking Loss 是 learning-to-rank 的核心工具:
- 搜索排序:给定查询
,学习文档 与 的相关度 ,使相关文档排在不相关文档之前。 - 推荐系统:给定用户
和物品 ,学习评分函数 ,优化正样本(用户交互过的物品)在排序中高于负样本(用户未交互的物品)。 - 双塔模型(Two-tower model):用户塔和物品塔分别编码,
,用 Margin Ranking Loss 训练使正样本对的相似度高于负样本对至少 。
6.3 BPR(Bayesian Personalized Ranking)
BPR 是推荐系统中另一经典排序损失,定义为
其中
7. 对比学习与自监督预训练、表征学习的关系
7.1 自监督预训练的范式
传统监督预训练:用标注数据预训练 backbone,在下游任务上 fine-tune。标注数据的规模限制了模型的泛化能力。
自监督预训练(Self-supervised Pre-training):在无标注的大规模数据上,用对比损失预训练表征,然后在下游任务上用少量标注数据进行有监督微调。对比学习是自监督预训练的主流方法之一(另一主流是重建类方法,如 MAE、Autoencoder)。
7.2 对比学习作为表示学习目标的优点
- 不需要标签:利用数据自身的增强结构作为监督信号,可以在互联网规模的未标注数据上训练。
- 学到通用特征:正样本对强调语义不变性,负样本对强调区分能力,这些能力直接迁移到下游视觉/NLP 任务。
- 下游任务适配灵活:学习到的表示可以用于分类、检索、分割等多种下游任务,而非仅限于预定义类别。
7.3 典型流程
- 预训练阶段:在大规模无标注数据上,用对比损失训练编码器
,学习通用表示 。 - 下游微调阶段:将预训练编码器作为 backbone,附加任务相关的分类头或检测头,用少量标注数据 fine-tune。Fine-tune 阶段通常切换为标准的分类/检测损失。
- 为什么 fine-tune 时切换损失:预训练的对比损失优化的是”全局相对比较”(正样本比负样本近),而非”绝对类别归属”。下游任务的分类是绝对任务,需要模型输出每个类的置信度,而非相对距离。因此分类头 + Cross-Entropy 是下游任务的自然选择。
8. 工程实践
8.1 正负样本构造方法
图像场景
# SimCLR 风格:两个随机增强视图
view1 = augment(image)
view2 = augment(image)
z1 = encoder(view1); z2 = encoder(view2)
# 正样本对:(z1, z2);负样本:batch 内所有其他 z文本场景
文本增强比图像弱,常用策略:
- Dropout noise:同一文本通过编码器两次(dropout 不同),得到两个不同 dropout 下的表示作为正样本
- 回译(Back-translation):翻译成另一语言再翻译回来
- Span masking:遮蔽部分 token,让模型编码未遮蔽部分
多模态场景(CLIP)
- 正样本对:图像
和对应文本描述 - 负样本对:batch 内不匹配的图像-文本对
- 损失:双路(image
text 和 text image)的 InfoNCE 损失之和
8.2 Batch Size、温度、Embedding 维度的影响
| 超参数 | 影响规律 | 典型取值 |
|---|---|---|
| Batch size | 越大 → 负样本越多 → 表示质量提升(in-batch negative 场景) | SimCLR: 256~4096;MoCo: 256(配合 memory bank) |
| 温度 | 越低 → 分布越尖锐 → 梯度越强 → 训练越快但易塌陷;越高 → 分布平滑 → 训练稳定但收敛慢 | |
| Embedding 维度 | 越高 → 表示能力越强 → 但负样本数量需同步增加以维持对比信号的区分度 | |
| 归一化(l2) | 若不归一化,embedding 范数会膨胀,导致相似度度量不稳定;归一化后 | 几乎所有对比方法都使用 l2 归一化 |
经验规律:若 batch size 受限(如 GPU 显存不足),优先使用 MoCo 类的 memory bank 方案,而不是降低 batch size;若 embedding 维度从 512 降到 128,需同步调低温度以维持对比信号的区分效率。
8.3 训练监控指标
表示坍塌检测
监控 **IPC(Instance-wise Proportion of Correct Predictions)**或 Mean Cosine Similarity:
若
Top-k 检索质量
在验证集上做
其中
相似度分布监控
每 1000 步采样一批表示,记录 batch 内所有配对的余弦相似度直方图。若正样本相似度分布和负样本相似度分布重叠严重(区分度低),说明模型学到的对比信号弱,需调整温度或负样本策略。
9. 图像、文本、多模态典型使用方式
9.1 图像
SimCLR:in-batch negative,batch size 2564096,两个随机增强视图,3 倍,batch size 翻倍带来 ~1% 的 top-1 提升。
MoCo / MoCo v2:memory bank(queue size 65536),动量编码器,in-batch negative 仅 256,
BYOL / SimSiam:不用负样本,动量编码器 + 预测头。BYOL 有 online 预测头 + target 目标网络;SimSiam 去掉了动量更新,用 constant momentum + stop gradient 模拟。两者均可避免显式负样本,但架构不对称是关键。
9.2 文本
- ContraCLM / SimCSE:在 BERT 等预训练模型基础上,用 dropout 生成两个正样本(同一文本通过 encoder 两次),负样本来自 batch 内其他文本。
,对比损失加在 token 的表示上。 - ColBERT:晚交互(late interaction)双塔模型,query 和 document 分别编码,但在 token 级别计算交互相似度(MaxSim),用 Margin Ranking Loss 训练。
- 无监督负样本:用对比损失对同一文本的不同 mask 样本作为正样本,从其他文档采样作为负样本(类似跨文档负采样)。
9.3 多模态
CLIP:图像编码器 + 文本编码器双塔,InfoNCE 损失(双路:image
ALIGN:与 CLIP 类似,但使用更大规模的多模态数据和 JFT 图像编码器,batch size 4096,
10. 什么时候用对比损失,什么时候用分类损失
10.1 决策树
任务类型
├── 有明确类别标签,类别数固定
│ ├── 类别互斥,单标签 → 分类损失(Softmax + CE)
│ └── 类别不互斥,多标签 → Multi-label BCE
├── 无明确标签,但有相似度结构
│ ├── 检索/排序/度量学习 → 对比损失 / Triplet Loss / Margin Ranking
│ └── 自监督预训练(无标注) → 对比损失(InfoNCE 等)
└── 有标签但类别极多(如亿级词表)→ 结合 Cross-Entropy + 对比损失(可选)
10.2 经验判断标准
| 维度 | 分类损失更合适 | 对比损失更合适 |
|---|---|---|
| 标签来源 | 类别标签明确、可靠 | 标签稀缺或不存在,只有相似性结构 |
| 类别数 | 类别数适中(< 10K) | 类别数极大或开放词汇 |
| 任务目标 | 预测输入属于哪个类 | 测量输入之间的相似度 |
| 下游任务 | 分类、检测(固定类别) | 检索、聚类、零样本分类、重识别 |
| 表示用途 | 直接用于预测 | 作为特征用于多种下游任务 |
| 数据增强可用性 | 有限 | 数据增强多样,可构造正样本对 |
| 训练资源 | 资源有限时 | 资源充足(大批量或 memory bank) |
10.3 常见组合策略
组合 1(CLIP 风格):对比预训练 → 分类微调。在无标注数据上用对比损失预训练学通用表示,在下游任务上用分类损失微调。
组合 2(检索增强分类):检索场景中用对比损失优化度量空间,分类头也加载同一表示空间,用标准的分类损失微调。表示质量提升直接带来检索和分类的双重收益。
组合 3(度量学习和分类联合):