CLIP 的对比学习原理是什么?为什么能做零样本分类?
简化版
CLIP 用图像编码器和文本编码器分别产生归一化向量,在一个 batch 内拉近匹配的图文对、拉远不匹配的组合(对比学习),学到一个图文共享的嵌入空间。做零样本分类时,把每个类别写成文本提示(如 “a photo of a dog”)编码成向量,和图像向量算相似度、取最高——因此不用为新数据集训练分类头。它擅长检索和开放词表分类,但本身不是能对话的生成式多模态 LLM,效果依赖预训练覆盖和 prompt。
详细版
一个 batch 有 N 对图文:图像向量与文本向量两两算余弦相似度,得到 N×N 矩阵,乘可学习温度系数。训练同时算图→文、文→图两个方向的交叉熵,让对角线(正确配对)得分最高。
推理零样本分类:为每个类别构造文本 → 编码成「类别原型」→ 图像向量和所有原型比相似度 → softmax 得预测。CLIP 学的是共享嵌入空间,擅长检索和开放词表分类,但只给全局向量,细粒度关系弱。
完整版教学
一、为什么用「双塔」而不是「融合」
CLIP 是双塔(dual-encoder) 结构:图像和文本各自独立编码成一个向量,最后只算相似度。对比另一种「融合编码器」(让所有图文 token 深度交互):
| 双塔(CLIP) | 融合编码器 | |
|---|---|---|
| 交互 | 只在最后算相似度 | 全程 token 级交互 |
| 效率 | 高(向量可预计算、建索引) | 低(每对图文都要跑一遍) |
| 细粒度关系 | 弱(只有全局向量) | 强 |
| 适合 | 大规模检索、零样本分类 | 精细图文理解 |
双塔的杀手锏是可扩展检索:把上亿张图的向量提前算好建索引,来一个文本查询只需编码一次再做向量检索。这是 CLIP 能大规模应用的根本。
二、批内对比:一个 N×N 矩阵
CLIP 的训练核心是「批内负样本对比」。一个 batch 有 N 对图文:
相似度矩阵 S(N×N):S[i][j] = cos(图像_i, 文本_j) / 温度τ
对图像 i:正确文本是 j=i(正样本),其余 N-1 个文本是负样本
对角线 S[i][i] 应最大,非对角线应小
损失是双向对称的交叉熵(把每一行、每一列都当成一个 N 分类问题,正确答案在对角线):
L = ( CrossEntropy(S, labels) + CrossEntropy(Sᵀ, labels) ) / 2
其中 labels = [0, 1, 2, ..., N-1]
CrossEntropy(S, labels) 是图→文方向(每张图找对的文本),CrossEntropy(Sᵀ, labels) 是文→图方向。大 batch 提供更多负样本、对比信号更强,但网络数据里可能有「语义相同却没配对」的假负样本,会干扰训练。
三、为什么要 L2 归一化和温度
两个关键设计细节:
- L2 归一化:把向量归一化到单位长度后,点积就等于余弦相似度——只看方向不看模长,避免某些向量靠「把模长放很大」来刷高相似度。
- 温度 τ:控制 softmax 分布的尖锐程度。τ 小 → 分布尖 → 强烈惩罚难负样本;τ 大 → 分布平。实际实现常学习一个 log 尺度并限制范围,防止训练早期温度乱飘导致不稳定。
四、零样本分类:用文本「动态生成」分类器
这是 CLIP 最惊艳的能力。传统分类要为每个数据集训一个固定分类头;CLIP 不用:
1. 把每个类别名写成自然语言:dog → "a photo of a dog"
2. 文本编码器把它们编码成 K 个"类别原型"向量
3. 图像向量和 K 个原型算相似度 → softmax → 预测
本质是——文本编码器根据类别名”临时生成”了一套分类器权重。想分类新的类别集合,只要换文本,无需重训。实践中对多个 prompt 模板(“a photo of a {}”, “a blurry photo of a {}”…)的文本向量做集成,通常比只输入裸类名更稳,因为预训练文本更接近自然语言描述。
记忆钩子:「零样本」指没用目标任务的标注样本训分类头,不代表这些概念在预训练里从没见过——CLIP 已在 4 亿图文对上见过海量概念。
五、能力边界
CLIP 只有全局向量,这决定了它的短板:
- 忽略物体数量、精确位置、细小文字(全局池化把这些细节抹平了);
- 数据偏差会影响相似度(训练集里的刻板搭配);
- 仅凭 CLIP 相似度不能证明描述在所有细节上正确——它只说「整体像不像」。
所以 CLIP 常被用作多模态大模型的视觉编码器(提供视觉特征)或评价组件(算图文相似度),但要生成细粒度回答,还得靠后接的 LLM 和保留局部特征。
六、常见误区与追问
- 误区:CLIP 能对话、能生成描述。 不能,它只算图文相似度,是理解/检索模型,不是生成式 LLM。
- 误区:零样本=模型没见过这些概念。 指没用该任务标注训分类头,概念可能在 4 亿预训练对里见过。
- 追问:CLIP 损失长什么样? 双向对称交叉熵,
L=(CE(S)+CE(Sᵀ))/2,正样本在 N×N 矩阵对角线。 - 追问:为什么要归一化+温度? 归一化让点积=余弦相似度(不受模长影响);温度控 softmax 尖锐度,稳定训练。
- 追问:大 batch 为什么重要? 提供更多批内负样本,对比信号更强;但要注意假负样本。
- 追问:CLIP 的主要短板? 全局向量忽略计数、位置、小文字,只能判断整体相似,细粒度弱。
- 追问:CLIP 在 MLLM 里干什么? 常作视觉编码器提供特征,或作图文相似度评价组件。
七、加强记忆
CLIP 记「双塔 + 批内对比 + 共享空间」:图像塔和文本塔各出一个归一化向量,用 N×N 相似度矩阵 + 双向对称交叉熵(正样本在对角线)拉近正确配对、拉远其余,学出图文共享嵌入空间。零样本分类的精髓是把类别文本当”动态分类器”——换文本就能分新类,无需重训(“零样本”指没用目标标注训分类头)。牢记短板:只有全局向量,忽略计数/位置/小文字,只能判整体相似,所以它在 MLLM 里当视觉编码器或评价组件,而非对话生成。