4. 对比学习基础:正负样本构建、InfoNCE损失函数、温度系数的作用、SimCLR与CLIP的对比
各位同学,欢迎来到第四章。这一章我们聊聊对比学习。
说实话,对比学习这个概念,在我刚入行那会儿还没这么火。那时候做多模态,大家更习惯用分类损失硬怼。后来发现,数据标注成本太高了,而且很多场景下你根本拿不到完美的标签。这时候对比学习就站出来了——它不需要你告诉模型「这是什么」,只需要告诉模型「这两个东西像不像」。
嗯,听起来很朴素对吧?但背后的门道可不少。我们一个一个拆开讲。
4.1 正负样本构建:对比学习的灵魂
对比学习的核心就一句话:拉近相似样本,推开不相似样本。那问题来了——谁跟谁算相似?谁跟谁算不相似?
这就是正负样本构建要解决的问题。
正样本:同一张图片经过两次不同的数据增强(比如裁剪、翻转、颜色抖动),得到的两张图就是正样本对。在CLIP里,配对的文本-图片对也是正样本。
负样本:其他所有不配对的样本。比如同一batch里其他图片,或者其他文本。
我个人习惯把负样本分成两类:
- batch内负样本:同一个batch里其他样本,简单高效
- hard negative:跟正样本很像但又不是的样本,比如「猫」和「老虎」
关键点:负样本的数量和质量,直接决定模型学到的表征好不好。我见过不少项目,模型训不动,一查发现负样本太少或者太简单,模型根本没学到区分能力。
举个例子,SimCLR的做法是:
- 一个batch有N张图,每张图做两次增强,得到2N个样本
- 对于某个样本,它的正样本只有1个(它自己的另一个增强版本)
- 剩下的2N-2个全是负样本
你想想看,2N-2个负样本,够不够?说实话,N越大越好。我记得有篇论文说batch size至少256起步,不然负样本太少,模型容易坍塌。
避坑指南:我曾经在一个小数据集上跑SimCLR,batch size设了32,结果模型学出来的表征全是常数。后来把batch size提到512,效果立马就出来了。所以,对比学习很吃batch size,这是第一个坑。
4.2 InfoNCE损失函数:对比学习的核心公式
有了正负样本,怎么让模型学会区分?这就轮到InfoNCE上场了。
InfoNCE的全称是Info Noise Contrastive Estimation。名字挺唬人,但公式其实很简洁:
L = -log( exp(sim(q, k+)/τ) / Σ exp(sim(q, ki)/τ) )
解释一下:
q:查询样本(比如一张图片的编码)k+:正样本(比如同一张图的其他增强版本)ki:所有样本(包括正样本和负样本)sim:相似度函数,通常用余弦相似度τ:温度系数,后面会细讲
这个损失函数在做什么?说白了,就是让正样本对的相似度尽可能大,同时让负样本对的相似度尽可能小。分母里把所有样本的相似度都加在一起,相当于一个归一化项。
我刚开始看这个公式时,总觉得它跟softmax很像。没错,InfoNCE本质上就是一个多分类的交叉熵损失——把正样本当作正确的类别,其他负样本当作错误的类别。
个人经验:我在做图文检索项目时,发现InfoNCE对负样本的利用效率很高。即使负样本数量很大,模型也能稳定收敛。但要注意,负样本不能全是easy negative,否则模型学不到细粒度区分。
4.3 温度系数τ的作用:一个超参数,影响全局
温度系数τ,看起来就是个分母上的小参数,但它的作用可大了。
τ控制的是什么呢?对负样本的惩罚力度。
- τ很小(比如0.07):相似度分布变得尖锐,模型会更关注那些跟正样本很像的负样本(hard negative)。好处是区分能力强,坏处是容易过拟合。
- τ很大(比如1.0):相似度分布变得平滑,模型对所有负样本一视同仁。好处是训练稳定,坏处是区分能力弱。
为什么会这样?你想想看,τ在分母上。τ越小,指数项exp(sim/τ)的值差异就越大。那些跟正样本相似度高的负样本,会被放大惩罚。τ越大,所有样本的指数项差异变小,模型就「懒得」去区分了。
我记得在CLIP的原始论文里,他们用的τ是0.07。这个值不是随便选的,是调参调出来的。我自己做实验时也发现,τ在0.05到0.1之间效果最好,太大会导致模型学不到东西,太小又容易训崩。
避坑指南:我曾经在一个多模态检索任务上,把τ设成了0.5,结果模型loss降不下去。排查了半天,发现是τ太大,模型对所有样本的相似度都差不多,根本分不清正负。后来改成0.07,效果立竿见影。所以,τ一定要调,别偷懒。
4.4 SimCLR vs CLIP:两种对比学习范式的对比
SimCLR和CLIP都是对比学习的代表作,但它们的思路完全不同。我们来做个对比:
| 维度 | SimCLR | CLIP |
|---|---|---|
| 模态 | 单模态(图像-图像) | 多模态(图像-文本) |
| 正样本 | 同一图像的不同增强 | 配对的图像-文本对 |
| 负样本 | batch内其他图像 | batch内其他图像-文本对 |
| 数据增强 | 非常依赖(随机裁剪、颜色抖动等) | 不依赖(直接用原始数据) |
| 训练数据 | ImageNet等标注数据 | 互联网图文对(4亿对) |
| 核心思想 | 同一图像的不同视角应该相似 | 配对的图文应该相似 |
| 应用场景 | 图像表征学习 | 图文检索、零样本分类 |
SimCLR的思路是:让同一张图的不同「视角」在特征空间里靠近。这里的「视角」是通过数据增强实现的。所以SimCLR非常依赖数据增强策略——你想想看,如果增强太弱,正样本太像,模型学不到东西;如果增强太强,正样本都变样了,模型又学歪了。
CLIP的思路是:让配对的图文在特征空间里靠近。它不需要数据增强,因为文本本身就是一种天然的「增强」。一张猫的图片,配上「一只橘猫在沙发上睡觉」这个文本,比任何图像增强都丰富。
我个人觉得,CLIP最大的贡献是证明了多模态对比学习可以做到zero-shot迁移。你想想看,SimCLR学到的图像表征,要做分类还得加个分类头。但CLIP学到的图文对齐表征,直接拿文本做分类器就行——比如你想做猫狗分类,直接用「a photo of a cat」和「a photo of a dog」这两个文本向量去跟图片向量算相似度,谁近就是谁。
关键区别:SimCLR学的是「图像内部的一致性」,CLIP学的是「图像和文本之间的对齐」。前者更适合纯视觉任务,后者更适合跨模态任务。
嗯,说到这里,我想起一个项目经历。当时我们要做一个电商平台的图文检索系统,用户上传一张图片,系统返回相关的商品描述。一开始我试了SimCLR,效果一般,因为SimCLR只学了图像表征,没学文本表征。后来换成CLIP的思路,用对比学习同时训练图像编码器和文本编码器,效果直接翻倍。所以,选对范式比调参更重要。
4.5 小结
这一章我们聊了对比学习的几个核心概念:
- 正负样本构建:正样本是配对的,负样本是其他所有。负样本的数量和质量很关键。
- InfoNCE损失:让正样本相似度最大,负样本相似度最小。本质上是个多分类交叉熵。
- 温度系数τ:控制对负样本的惩罚力度。τ越小,越关注hard negative。
- SimCLR vs CLIP:SimCLR做单模态对比,CLIP做多模态对比。选哪个看你的任务。
下一章,我们会深入CLIP的模型结构,看看它的图像编码器和文本编码器是怎么设计的。到时候再聊。