本文目录导读:

对比学习(Contrastive Learning)的目标函数核心思想是:拉近相似样本(正样本对)的距离,推远不相似样本(负样本对)的距离。
根据具体的实现方式和应用场景,目标函数主要有以下几种经典设计:
经典基础:对比损失
这是最原始的对比损失,由 LeCun 等人提出,主要用于训练孪生网络(Siamese Network)。
- 公式:
L = (1-Y) * 0.5 * D² + Y * 0.5 * max(0, margin - D)² - 解读:
- Y:标签,Y=1 表示正样本对(相似),Y=0 表示负样本对(不相似)。
- D:两个样本特征向量之间的欧氏距离(或其他距离度量)。
- margin:一个超参数,对于负样本对,如果距离已经大于
margin,则损失为 0(不再推远);如果距离小于margin,则继续推远。
- 效果:正样本对距离越小越好,负样本对距离越大越好,但有一个“天花板”(margin)。
主流基石:NT-Xent损失
这是SimCLR、MoCo 等主流对比学习框架使用的核心损失函数,全称是“归一化温度标度的交叉熵损失”。
- 公式(通常针对一个正样本对
(i, j)): [ L_{i,j} = -\log \frac{\exp(\text{sim}(z_i, zj) / \tau)}{\sum{k=1}^{2N} \mathbf{1}_{[k \neq i]} \exp(\text{sim}(z_i, z_k) / \tau)} ] - 解读:
- sim:余弦相似度(
cosine similarity)。sim(A, B) = A·B / (|A|*|B|),这保证了特征被归一化到单位球上。 - 分母:批次中所有其他样本(包括其他正样本和所有负样本)与样本 i 的相似度之和。
- 分子:唯一正样本对
(i, j)的相似度。 - τ:温度系数(超参数),用于控制对负样本的惩罚力度,τ 越小,模型越关注“困难”的负样本(即与锚点相似的负样本)。
- sim:余弦相似度(
- 本质:这是一个多类分类问题,把当前样本
i当作一个类别,j是它的正例,其余 2N-2 个样本都是负例,损失函数计算的是“正样本对(i, j)被正确识别出来”的交叉熵。
变体:InfoNCE损失
这是 NT-Xent 的一个通用形式,尤其在CPC(对比预测编码) 和 MoCo 中被使用。
- 公式: [ Lq = -\log \frac{\exp(q \cdot k+ / \tau)}{\exp(q \cdot k+ / \tau) + \sum{i=1}^{K} \exp(q \cdot k_i / \tau)} ]
- 解读:
- q:查询(query),例如当前样本。
- k+:正键(positive key),与 q 对应的正样本。
- k-:负键(negative key),一个很大的负样本队列(MoCo 中的字典队列)。
- 与 NT-Xent 的区别:NT-Xent 是 InfoNCE 在 SimCLR 这种一个批次内所有样本互为负样本场景下的特例,InfoNCE 更通用,允许负样本来自一个更大的、动态更新的队列(如 MoCo)。
不需要负样本:BYOL 和 SimSiam 的损失
这些方法不需要显式的负样本,而是通过不对称的网络结构(如预测器 predictor 或动量编码器)来防止模型坍塌。
-
BYOL 损失(负余弦相似度): [ L = 2 - 2 \cdot \frac{\langle q{\theta}(z{\theta}), z{\xi}' \rangle}{||q{\theta}(z{\theta})|| \cdot ||z{\xi}'||} ] 即
2 - 2 * cosine_similarity,它计算在线网络(online network)对某一视图的预测与目标网络(target network)对另一视图的投影之间的余弦相似度,目标是被约束为不会剧烈更新的(动量编码器)。 -
SimSiam 损失(对称的负余弦相似度): [ L = -0.5 * [\text{sim}(p_1, z_2) + \text{sim}(p_2, z_1)] ]
p是预测头(predictor)的输出,z是投影头(projector)的输出,sim是余弦相似度,它对称地对两个视图进行预测,并且不依赖动量编码器或负样本。
其他常见损失
- Triplet Loss:适用于度量学习,公式:
L = max(0, D(a, p) - D(a, n) + margin),它要求正样本对(a, p)的距离比负样本对(a, n)的距离至少小一个 margin,缺点是需要精心选择困难样本(hard negative mining)。 - Margin Loss:常用于多模态对比学习(如 CLIP),公式:
L = max(0, margin - (sim(pos) - sim(neg))),它只维护一个距离差异,而不是 Softmax 概率。
如何选择?
| 应用场景 | 推荐目标函数 | 关键特点 |
|---|---|---|
| 图像自监督学习 | NT-Xent (SimCLR) / InfoNCE (MoCo) | 需要大量负样本,适合大规模预训练。 |
| 图像自监督学习(省资源) | BYOL / SimSiam | 不需要负样本,避免了大 batch size 或 memory bank,但训练稳定性需调试。 |
| 度量学习 / 人脸识别 | Triplet Loss / Contrastive Loss | 需要定义 margin,对困难样本挖掘敏感。 |
| 多模态对齐(如文本-图像) | InfoNCE (如 CLIP) | 每个模态形成一个 batch,互相作为负样本。 |
| 推荐系统 / 图学习 | InfoNCE | 对比用户-物品或节点-邻居的嵌入。 |
核心建议:
- 对于新手或通用视觉任务:NT-Xent 损失(SimCLR 风格)是最稳妥、最容易复现的选择,它实现简单,效果好。
- 如果需要节省显存或数据有限:尝试 SimSiam 或 BYOL。
- 温度系数 τ 是关键:通常设置在 0.07 到 0.5 之间,过小会导致模型只关注极少数困难样本,不稳定;过大会导致对所有负样本一视同仁,缺乏区分度。
- 归一化:在计算相似度前,务必对特征向量进行 L2 归一化(
z / ||z||),这会让损失函数只关注方向(角度),而不受特征模长影响,显著提升性能。