想象你掌管一家跨国婚介所。每天都有海量“会员”涌入:一边是照片——一只趴在草地上的金毛犬、一辆停在雨夜街边的自行车;另一边是文案——“一只金毛犬在草地上休息”“雨夜街边的自行车”。这些照片与文案是来自互联网的真实“情侣组合”。你的任务,是训练一位顶尖月老(这就是 CLIP),让他看到任何一张新照片时,都能立刻判断“这段话配不配得上这张图”。 这位月老的本事来自两套功夫:先把照片和文案各自“浓缩”成一张只有数字的品味卡片(特征向量),再通过一场场“连对游戏”(对比学习)练出火眼金睛——同属一对的照片与文案要在数字空间里靠得极近,不搭边的则被远远拆开。当你把几亿对真实情侣喂给他后,他就不再需要手把手教了:随便给一张新照片,他都能自己写出匹配的文案,或从上千份文案里挑出最配的那份。这就是 CLIP 的“零样本迁移”能力。 本文会带你走进这家婚介所:月老的训练细节、为什么见过的情侣越多眼光越准、两位分析师(视觉编码器与文本编码器)怎么选、如何给文案润色(Prompt 工程),以及这位月老在哪些场合会看走眼、未来如何升级。

岗位关联

对 AI 从业者而言,CLIP 是打通视觉与语言的基石模型。掌握它的对比学习原理与工程技巧,能直接用于跨模态检索、零样本分类与多模态产品落地,是简历上最具含金量的技能之一。

目录
  1. 可视化演示
  2. 1. 训练核心机制:月老的“连对游戏”
  3. 2. 数据规模效应:见过的人越多,眼光越准
  4. 3. 文本编码器选择:文案分析师为什么选 Transformer
  5. 4. 视觉编码器对比:照片分析师的两种流派
  6. 5. Prompt 工程应用:给文案润色的艺术
  7. 6. 模型局限分析:月老也有看走眼的时候
  8. 7. 改进方向展望:婚介所的升级计划
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

CLIP双塔架构:图文对齐到共享嵌入空间 图像编码器 文本编码器 共享嵌入空间 sim(I,T) = cos(E_img(I), E_txt(T)) = E_img \u00b7 E_txt / (||E_img|| \u00d7 ||E_txt||) 对角线=正样本对,...

1. 训练核心机制:月老的“连对游戏”

婚介所的第一课,是让新来的月老玩“连对游戏”:主管一次性把 8 张照片和 8 段文案打乱摆在桌上,要求他为每张照片选出最配的文案。游戏狠就狠在——他必须先猜,再揭晓答案。选对了真情侣,这个“眼光”就被强化;牵错了线,他被扣分并记住教训。如此反复,月老渐渐明白:金毛犬的照片该配“金毛犬在草地上”,而不是“雨夜的自行车”。多模态对比学习,正是这一场场连对游戏的总称。

在 CLIP 的世界里,照片先被视觉编码器压缩成一个特征向量 $\mathbf{f}^{\text{img}}$,文案先被文本编码器压缩成 $\mathbf{f}^{\text{txt}}$。两者做余弦点乘,得到 0 到 1 之间的“契合度” $s$。训练时,模型拿到一个批次共 $N$ 对图文(例如 32768 对),要保证:每一行每一列里,对角线上的“真情侣”得分最高。光“高”还不够,必须把其他错误组合远远甩开,才能逼出真正的鉴别力。

LCLIP=−12N∑i=1N[log⁡exp⁡(sii/τ)∑j=1Nexp⁡(sij/τ)+log⁡exp⁡(sii/τ)∑j=1Nexp⁡(sji/τ)]\displaystyle \mathcal{L}_{\text{CLIP}} = -\frac{1}{2N}\sum_{i=1}^{N}\left[\log\frac{\exp(s_{ii}/\tau)}{\sum_{j=1}^{N}\exp(s_{ij}/\tau)} + \log\frac{\exp(s_{ii}/\tau)}{\sum_{j=1}^{N}\exp(s_{ji}/\tau)}\right]

直观理解:方括号里是一个“软最大”概率——第 $i$ 张照片能在多大比例上从 $N$ 段文案里认出自己的真命天子。损失函数要最大化这个概率,等价于让 $s_{ii}$ 尽量高、让所有 $s_{ij}\ (j\neq i)$ 尽量低。

1. 第一步:计算配对得分矩阵:先用余弦相似度算出所有“照片-文案”组合的契合度,构成一个 $N\times N$ 的得分矩阵,对角线以外的格子都是干扰项。

sij=fiimg⋅fjtxt∥fiimg∥⋅∥fjtxt∥\displaystyle s_{ij} = \frac{\mathbf{f}_i^{\text{img}} \cdot \mathbf{f}_j^{\text{txt}}}{\|\mathbf{f}_i^{\text{img}}\| \cdot \|\mathbf{f}_j^{\text{txt}}\|}

2. 第二步:温度缩放与软化:除以温度系数 $\tau$ 后取指数,把得分差异放大成“接近 1 或接近 0”的竞争概率;$\tau$ 越小,月老越“笃定”,概率分布越尖锐。

pij=exp⁡(sij/τ)∑k=1Nexp⁡(sik/τ)\displaystyle p_{ij} = \frac{\exp(s_{ij}/\tau)}{\sum_{k=1}^{N}\exp(s_{ik}/\tau)}

3. 第三步:双向求期望损失:分别站在“图片找文本”和“文本找图片”两个方向计算交叉熵,再取平均,确保两个编码器被对称地训练。

LCLIP=−12N∑i=1N[log⁡piiimg→txt+log⁡piitxt→img]\displaystyle \mathcal{L}_{\text{CLIP}} = -\frac{1}{2N}\sum_{i=1}^{N}\left[\log p_{ii}^{\text{img}\to\text{txt}} + \log p_{ii}^{\text{txt}\to\text{img}}\right]

游戏结束,月老把“眼力”沉淀进了编码器的权重里。下一次训练,他会带着旧经验去连新的对子——这正是 CLIP 能从海量互联网杂乱数据中持续进化的原因。

2. 数据规模效应:见过的人越多,眼光越准

婚介所扩张了。月老不再只学 1500 万对“速成案例”,而是把数据一路加到 4 亿对。有趣的是,他的眼光并没有“学到头”:数据量每翻 10 倍,零样本分类精度就稳定地上涨一截,几乎画出一条“对数坐标下的直线”。这就像一位老月老——见过的情侣组合越多,越能覆盖各种刁钻的用户画像,任何新面孔在他眼里都有迹可循。

传统监督学习常说“数据涨到一定程度收益递减”,但 CLIP 在大规模图文对比任务上观察到了近乎 log-linear 的标度率:横轴取对数后,精度近似线性上升。这一现象背后有两点支撑:一是大批次(如 32768)让每个样本与海量负样本同台竞争,信息密度高;二是训练 epoch 数不必多(CLIP 只训练 32 个 epoch),因为每次迭代见到的都是新数据,“多样性”比“重复看同一张图”更重要。

Acc(N)≈α⋅log⁡2(NN0)+β\displaystyle \text{Acc}(N) \approx \alpha \cdot \log_2\left(\frac{N}{N_0}\right) + \beta

1. 第一步:明确数据量变量:$N$ 是用于训练的图文对总数,$N_0$ 是参考规模(例如 1500 万)。

N=训练图文对总数,N0=参考规模\displaystyle N = \text{训练图文对总数}, \quad N_0 = \text{参考规模}

2. 第二步:对数缩放:取以 2 为底的对数,表示“数据翻一倍,收益是固定的常数,而不是翻倍”。

log⁡2(NN0)\displaystyle \log_2\left(\frac{N}{N_0}\right)

3. 第三步:斜率与基线:$\alpha$ 是斜率,衡量数据红利的大小;$\beta$ 是基线精度,代表极小数据下的表现。

α=ΔAccΔlog⁡2N,β=基线精度\displaystyle \alpha = \frac{\Delta \text{Acc}}{\Delta \log_2 N}, \qquad \beta = \text{基线精度}

所以,想提升 CLIP 的下游效果,最朴素的杠杆就是“喂更多、更杂、更真实的对子”。这也解释了为什么 WIT 数据集高达 4 亿对——规模本身就是对比学习最重要的超参数之一。

3. 文本编码器选择:文案分析师为什么选 Transformer

婚介所要招一位文案分析师,把会员的自我介绍浓缩成品味卡片。候选人里有三位:词袋模型只统计关键词频率,看不懂语序;循环网络顺着句子一读到底,容易忘掉开头;Transformer 则让每个词同时“看见”全句,像一眼扫完简历又立刻记住所有细节的面试官。CLIP 毫不犹豫选了 Transformer——因为“草地上有只狗”和“狗上有片草地”用词完全相同,意思却天差地别,只有能建模语序与长程依赖的结构才能胜任。

技术细节上,CLIP 的文本编码器约为 6300 万参数:12 层、隐藏宽度 512、8 头注意力;输入先做小写化与 BPE 分词,词表大小 49152;句子首尾插入特殊符号 [SOS] 与 [EOS],最后取 [EOS] 位置的特征作为整句向量。与 BERT 不同,它没有用“掩码语言建模”做预训练,而是从零开始,完全靠对比学习的目标把语义“逼”出来。

htext=Proj(Trm([SOS], w1, w2, …, wL, [EOS])EOS)\displaystyle h_{\text{text}} = \text{Proj}\left( \text{Trm}\left([\text{SOS}],\, w_1,\, w_2,\, \dots,\, w_L,\, [\text{EOS}]\right)_{\text{EOS}} \right)

1. 第一步:拼接特殊符号:句首加 [SOS]、句尾加 [EOS],让模型知道文本的边界在哪。

[SOS], w1, w2, …, wL, [EOS]\displaystyle [\text{SOS}],\, w_1,\, w_2,\, \dots,\, w_L,\, [\text{EOS}]

2. 第二步:Transformer 编码:把整串词元送入多层 Transformer $\text{Trm}$,每个词元都融合了全句语境。

Trm([SOS], w1, …, [EOS])\displaystyle \text{Trm}\left([\text{SOS}],\, w_1,\, \dots,\, [\text{EOS}]\right)

3. 第三步:抽取句向量并投影:取下标 $\text{EOS}$ 位置最后一层的输出,再通过线性投影 $\text{Proj}$ 与图像特征对齐到同一维度。

htext=Proj(⋅EOS)\displaystyle h_{\text{text}} = \text{Proj}\left( \cdot_{\text{EOS}} \right)

有了这位能“读句子”的文案分析师,月老才真正听懂了“金毛犬趴在草地上”和“草地趴着金毛犬”之间的差别——虽然词一样,画面感完全不同。

4. 视觉编码器对比:照片分析师的两种流派

照片分析师也有门派之争。老派 ResNet 拿着放大镜,在照片上一格一格地挪着看,视野局促但每一步都走得稳,年轻时学得快;新派 ViT 则把照片切成 16×16 像素的拼图块,一次铺开在桌上,用全局目光审视所有块之间的关系,刚入门时笨手笨脚,但见多识广后格局更大。

CLIP 论文系统对比了两派:ResNet 家族(ResNet-50/101 以及宽度放大的 RN50x4/x16/x64)与 ViT 家族(ViT-B/32、ViT-B/16、ViT-L/14)。结论非常清晰:在 4 亿数据与充足算力下,ViT 全面追平并反超 ResNet,其中 ViT-L/14@336px 在 ImageNet 零样本上达到约 76.2% 的 top-1 精度。代价也很现实:大 ViT 推理成本与显存更高,很多工业落地仍会选 ResNet 或小 ViT/B/16 以换取速度。

z0=[xcls; xp1E; xp2E; … ; xpKE]+Epos\displaystyle z_0 = \left[x_{\text{cls}};\, x_p^1\mathbf{E};\, x_p^2\mathbf{E};\, \dots;\, x_p^K\mathbf{E}\right] + \mathbf{E}_{\text{pos}}

1. 第一步:图像切块并展平:把 $H\times W$ 的图像切成 $K$ 个 $P\times P$ 的小块,每个小块展平成向量 $x_p^k$。

xpk∈RP2⋅C\displaystyle x_p^k \in \mathbb{R}^{P^2 \cdot C}

2. 第二步:线性投影:每个小块向量乘以可学习的投影矩阵 $\mathbf{E}$,映射到 Transformer 的隐藏维度。

xpkE\displaystyle x_p^k \mathbf{E}

3. 第三步:拼接类别标记并加位置编码:在最前面拼一个可学习的类别向量 $x_{\text{cls}}$,再加上位置编码 $\mathbf{E}_{\text{pos}}$,让模型知道每块拼图在照片里的方位。

z0=[xcls; xp1E; … ; xpKE]+Epos\displaystyle z_0 = \left[x_{\text{cls}};\, x_p^1\mathbf{E};\, \dots;\, x_p^K\mathbf{E}\right] + \mathbf{E}_{\text{pos}}

放大镜派与拼图派各有所长:小数据、低算力场景,ResNet 的稳健让工程更省心;而当你手握大模型和大数据,ViT 的全局视野才是上限更高的答案。

5. Prompt 工程应用:给文案润色的艺术

婚介所发现一个秘密:会员文案写得含糊时,月老匹配率骤降。用户只写一个词“狗”,月老的品味卡片就“摸不准脉”;可一旦改成“一张金毛犬趴在绿色草地上休息的照片”,匹配率立刻飙升。原因很简单——月老受训时看到的全是完整句子,输入越像训练时的文案,他的品味空间越能对齐。于是婚介所总结出一套固定句式,把所有标签都套进去再交给月老。

在 CLIP 中这被称为 Prompt 工程。做零样本分类时,先把每个标签 $y$ 套入 $K$ 个模板("a photo of a {y}"、"a bad photo of a {y}"、“a painting of a {y}“ 等),分别过文本编码器后取平均,得到这个类别的”代表向量“;再用图像特征与所有类代表向量算相似度、做 softmax 得到概率。论文显示,用 80 个模板集成比单个模板在 ImageNet 上高出约 3.5 个百分点,对细粒度类别,加上”a type of bird”这类上下文描述还能再涨。

p(y∣I)=exp⁡(s(fI, tˉy)/τ)∑y′=1Cexp⁡(s(fI, tˉy′)/τ),tˉy=1K∑k=1KEnc(Tk(y))\displaystyle p(y\mid I) = \frac{\exp\big(s(f_I,\, \bar{t}_y)/\tau\big)}{\sum_{y'=1}^{C}\exp\big(s(f_I,\, \bar{t}_{y'})/\tau\big)}, \qquad \bar{t}_y = \frac{1}{K}\sum_{k=1}^{K}\text{Enc}\big(\mathcal{T}_k(y)\big)

1. 第一步:生成模板变体:对每个类别 $y$,用 $K$ 个不同句式造出 $K$ 句描述,相当于给同一标签写多份不同风格的自我介绍。

Tk(y),k=1,2,…,K\displaystyle \mathcal{T}_k(y), \quad k = 1, 2, \dots, K

2. 第二步:平均得到类代表向量:$K$ 句描述分别过文本编码器并取平均,得到该类的“平均品味卡片”。

tˉy=1K∑k=1KEnc(Tk(y))\displaystyle \bar{t}_y = \frac{1}{K}\sum_{k=1}^{K}\text{Enc}\big(\mathcal{T}_k(y)\big)

3. 第三步:软最大分类:图像特征与所有类代表向量算契合度并归一化成概率,取最大者作为预测类别。

p(y∣I)=exp⁡(s(fI, tˉy)/τ)∑y′=1Cexp⁡(s(fI, tˉy′)/τ)\displaystyle p(y\mid I) = \frac{\exp\big(s(f_I,\, \bar{t}_y)/\tau\big)}{\sum_{y'=1}^{C}\exp\big(s(f_I,\, \bar{t}_{y'})/\tau\big)}

给文案润色,本质上是在“迁就”月老被训练出来的阅读习惯。一份贴心的自我介绍,比十个标签堆砌更能让月老眼前一亮。

6. 模型局限分析:月老也有看走眼的时候

再厉害的月老也有短板——他只凭“整体眼缘”下判断。你问他“照片里桌上那杯红色咖啡杯旁边有几颗草莓”,他支支吾吾;你说“宇航员骑着马”,他能听懂,但把'马骑宇航员'和'宇航员骑马'放一起,他完全分不清谁在骑谁。他擅长的是“这照片给我的整体感觉”,而不是数数、定位和逻辑组合。

CLIP 的局限可以归纳为三点:第一,细粒度感知弱——计数、属性绑定(“红色的左脚的鞋”)、空间关系(“在…之上/之左”)都容易出错;第二,组合性理解差——两个语义叠加时,它倾向于做“平均”,而不是真正的句法组合;第三,数据偏见——互联网图文对自带社会偏见,某些人群与场景的分类准确率明显偏低,且面对分布外数据时鲁棒性有限。下图展示了“组合性缺失”的近似表现:

s(I, Tcat + dog)≈12(s(I, Tcat)+s(I, Tdog))\displaystyle s\big(I,\,T_{\text{cat + dog}}\big) \approx \frac{1}{2}\Big(s\big(I,\,T_{\text{cat}}\big) + s\big(I,\,T_{\text{dog}}\big)\Big)

1. 第一步:看组合句的得分:左边是图像与组合句“猫和狗”的契合度,CLIP 应该理解这层组合关系。

s(I, Tcat + dog)\displaystyle s\big(I,\,T_{\text{cat + dog}}\big)

2. 第二步:拆成两个单句得分的平均:右边把组合句拆成“猫”和“狗”两句,分别求相似度后取平均。

12(s(I, Tcat)+s(I, Tdog))\displaystyle \frac{1}{2}\Big(s\big(I,\,T_{\text{cat}}\big) + s\big(I,\,T_{\text{dog}}\big)\Big)

3. 第三步:二者近似相等即问题所在:模型没有产生"1+1>2"的组合语义,而是退化成加权平均。

s(I, Tcat + dog)≈12(s(I, Tcat)+s(I, Tdog))\displaystyle s\big(I,\,T_{\text{cat + dog}}\big) \approx \frac{1}{2}\Big(s\big(I,\,T_{\text{cat}}\big) + s\big(I,\,T_{\text{dog}}\big)\Big)

理解月老的盲区,才能在使用时避开雷区:CLIP 适合“粗分类”与“语义检索”,不适合需要精确定位、计数和深层因果推理的场合。

7. 改进方向展望:婚介所的升级计划

面对月老的短板,婚介所制定了一份升级计划。第一,请来微表情分析师——不再只做“整张照片对整句文案”的粗对齐,而是下沉到图像局部块与文本词元的细粒度对齐,甚至接上开放词汇检测头。第二,让月老写恋爱日记——在连对游戏之外,加练“看图说话”和“掩码填词”,让语义理解更立体。第三,清理会员库——去重、过滤低质图文、均衡各类别采样,从源头减少偏见。

这些方向在学术界已经开花结果:FILIP、SLIP 等方法把对比对齐下沉到 token 级;OWL-ViT 在 CLIP 之上加检测头实现开放词汇检测;CoCa 则同时使用对比损失与生成式字幕损失,让模型既会“选”也会“写”。数据侧,DataComp 等实验表明,同样算力下把数据清洗做到位,收益往往比加大模型更实在。一个通用的多任务目标可以写成:

Ltotal=Lcontrast+λ1⋅LMLM+λ2⋅Lgeneration\displaystyle \mathcal{L}_{\text{total}} = \mathcal{L}_{\text{contrast}} + \lambda_1 \cdot \mathcal{L}_{\text{MLM}} + \lambda_2 \cdot \mathcal{L}_{\text{generation}}

1. 第一步:保留对比主目标:$\mathcal{L}_{\text{contrast}}$ 是原有连对游戏损失,保证跨模态对齐的主干能力不丢。

Lcontrast\displaystyle \mathcal{L}_{\text{contrast}}

2. 第二步:叠加掩码语言建模:$\mathcal{L}_{\text{MLM}}$ 让文本端学会基于上下文补全,用 $\lambda_1$ 控制它的权重。

λ1⋅LMLM,λ1>0\displaystyle \lambda_1 \cdot \mathcal{L}_{\text{MLM}}, \quad \lambda_1 > 0

3. 第三步:叠加生成式目标:$\mathcal{L}_{\text{generation}}$ 让模型从图像生成描述文本,补足“整体眼缘”之外的细节理解。

λ2⋅Lgeneration,λ2>0\displaystyle \lambda_2 \cdot \mathcal{L}_{\text{generation}}, \quad \lambda_2 > 0

升级后的月老,既能一眼看穿整体气质,又能俯身观察细节,还会记录观察笔记——这正是多模态模型从“粗对齐”走向“强理解”的未来方向。

AI 应用场景

场景一:跨境电商的商品零样本分类

阶段:模型推理与零样本迁移

解决的问题:传统电商分类需要为每个新类目标注数千张图、训练并部署新模型,类目一扩就伤筋动骨。CLIP 把类目名称变成 Prompt 文本,与图像特征直接比对,新增类目只需改一行配置。

具体案例:某跨境电商平台把 5000 个商品类目套进 “a photo of {商品} in the catalog” 模板,首日上线零样本分类准确率超过 90%;后续类目从 500 扩到 5000,全程没有重新标注和训练,节省了约 3 个月的算法迭代周期。

场景二:图库平台的文本召回

阶段:跨模态检索与特征工程

解决的问题:传统图库搜索依赖人工打标签,长尾语义(“黄昏时分的城市屋顶”)几乎无法覆盖。CLIP 双塔结构将百万图片离线编码成向量,用户输入任意自然语言即可秒级检索。

具体案例:某设计素材平台接入 CLIP 后,用户用“雨夜霓虹灯下的空荡街道”这类长句查询 500 万张图库,平均响应 300 毫秒返回 Top-20 结果;相比原有关键词标签系统,长尾查询的点击率提升了 40%。

场景三:工业质检的少样本适配

阶段:数据标注与模型适配(Prompt 工程)

解决的问题:产线缺陷样本稀少且类型翻新快,传统检测模型动辄需要上万张标注。借助 CLIP 的预训练特征,只需精心设计缺陷描述模板 + 少量样本训练线性头,就能快速上线新缺陷类别。

具体案例:某面板厂收集 200 张划痕、气泡、脏污样例,用 "a {defect} on the screen surface" 模板做 Prompt,再在 CLIP 特征上训练线性分类器,缺陷召回率达到 95%,替代了原本需要 2 万张标注数据的方案,标注成本降为原来的十分之一。

Python 演示

python48 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class CLIPContrastiveLoss(nn.Module):    """CLIP 使用的对称对比损失: 同时做图像->文本和文本->图像两个方向。"""     def __init__(self, init_tau=0.07):        super().__init__()        # 温度系数 tau 通过学习获得, 初始值对应 0.07        self.logit_scale = nn.Parameter(torch.log(torch.tensor(1.0 / init_tau)))     def forward(self, img_feats, txt_feats):        img_feats = F.normalize(img_feats, dim=-1)        txt_feats = F.normalize(txt_feats, dim=-1)        # 相似度矩阵: 第 i 行第 j 列 = 第 i 张图与第 j 段文本的余弦相似度        logits = self.logit_scale * img_feats @ txt_feats.t()        labels = torch.arange(logits.shape[0], device=logits.device)        loss_img = F.cross_entropy(logits, labels)        loss_txt = F.cross_entropy(logits.t(), labels)        return (loss_img + loss_txt) / 2.0  def main():    torch.manual_seed(42)    batch, dim = 8, 16    # 模拟 8 对图文: 文本特征 = 图像特征 + 少量噪声, 保证配对信息存在    img_feats = torch.randn(batch, dim)    txt_feats = img_feats + 0.2 * torch.randn(batch, dim)    loss_fn = CLIPContrastiveLoss()    opt = torch.optim.Adam(loss_fn.parameters(), lr=0.05)    for epoch in range(100):        loss = loss_fn(img_feats, txt_feats)        opt.zero_grad()        loss.backward()        opt.step()        if epoch % 20 == 0:            print("epoch {} loss {:.4f}".format(epoch, loss.item()))    sim = F.normalize(img_feats, dim=-1) @ F.normalize(txt_feats, dim=-1).t()    diag = torch.diagonal(sim)    off = (sim.sum() - diag.sum()) / (batch * (batch - 1))    print("对角线相似度均值: {:.3f}".format(diag.mean().item()))    print("非对角线相似度均值: {:.3f}".format(off.item()))  if __name__ == "__main__":    main()
目的:用 20 行核心逻辑实现 CLIP 的对称对比损失(InfoNCE),并在模拟的 8 对图文特征上训练温度系数,验证“配对相似度高于非配对”这一核心目标。
  1. self.logit_scale = nn.Parameter(...)把温度系数变成可学习参数,训练时自动调整软硬程度。
  2. logits = self.logit_scale * img_feats @ txt_feats.t()一次性算出 N×N 的图文相似度矩阵,矩阵乘法并行高效。
  3. labels = torch.arange(logits.shape[0], ...)对角线位置即正确答案:第 i 张图就该匹配第 i 段文本。
  4. loss_img = F.cross_entropy(logits, labels)站在图像角度,从 N 段文本中认出自己的那一段。
  5. loss_txt = F.cross_entropy(logits.t(), labels)站在文本角度做对称的交叉熵,两个方向一起训练。
  6. txt_feats = img_feats + 0.2 * torch.randn(...)用“图像特征加噪声”构造配对数据,保证每一对图文天然相似。

常见误区

误区“CLIP 就是 OpenAI 发布的那个模型,结构写死了,跟 ResNet 和 ViT 没关系。”

正解CLIP 是“双塔编码器 + 对比训练范式”的组合框架。图像端既可以用 ResNet 也可以用 ViT,文本端也有不同配置;模型架构与训练方法相互解耦。研究者完全可以换上更强的骨干网络,只要对比目标不变,仍属于 CLIP 范式。

为何常见:官方发布时直接捆绑了整套权重,使用者只调 API,自然把“一个模型”当成“一个固定的东西”。

误区“训练时只要拼命拉近配对的图和文就行,负样本随便处理一下就好。”

正解拉近与推远是一体两面。对比损失分母中所有负样本的指数之和,决定了正样本在嵌入空间里的相对位置;没有负样本的竞争,模型会把所有输入压成一个点,什么也区分不出来。负样本的质量与数量(大batch)直接影响表征质量。

为何常见:直觉上先注意到“拉近”这个动作,而忽略了 softmax 分母里暗藏的“推远”机制。

误区“CLIP 零样本分类那么强,数一数图里有几只猫、判断'杯子在桌上'肯定也没问题。”

正解CLIP 的对齐发生在“全局句子—全局图像”层面,擅长整体语义分类;但对计数、空间关系、属性绑定(“红色的左脚鞋”)等细粒度信息很差,组合性任务上甚至会把两个概念做平均。它更像“一眼定气质”的月老,而不是“拿尺子量五官”的鉴定师。

为何常见:零样本分类的惊艳表现让初学严重高估了模型的感知颗粒度。

误区“'a photo of a dog' 就是把'狗'翻译成英文而已,换成什么模板都一样。”

正解模板与上下文描述直接影响文本编码器的表征方向。CLIP 训练时看的是完整句子,输入越贴近预训练分布,对齐效果越好;论文里 80 个模板集成比单个模板在 ImageNet 上高出约 3.5 个百分点,可见 Prompt 是零样本性能的重要旋钮。

为何常见:初学者把文本编码器当作“查字典”,没有意识到预训练数据分布对输入形式的敏感度。

面试题

Q1. CLIP 在训练时的核心目标是什么?

单选题 · easy

  • A.使所有图文对的得分趋于相同
  • B.使配对图文得分最高并拉开其余← 正确答案
  • C.使图像特征与文本特征完全一致
  • D.使编码器的输出维度保持一致

答案:B。CLIP 的对比学习目标是让配对图文(正样本)的余弦相似度显著高于同一批次其他组合(负样本),也就是“拉近正对、推远负对”。A 与目标相反,C 是极端化误解(两个模态不会完全一致),D 是工程细节而非训练目标。

Q2. CLIP 的 4 亿训练图文对主要来自哪里?

单选题 · easy

  • A.医院影像与病历报告
  • B.实验室手工标注的精致图像
  • C.互联网上抓取的图像文本对← 正确答案
  • D.政府公开的标准数据集

答案:C。CLIP 使用的 WIT 数据集包含约 4 亿对图文,全部来自互联网自然共现的图像与文本,这正是“月老见多识广”的前提。人工标注数据规模有限,无法支撑对比学习所需的海量负样本。

Q3. CLIP 的文本编码器选择了哪种结构?

单选题 · easy

  • A.基于注意力的 Transformer 栈← 正确答案
  • B.基于统计的词袋模型编码
  • C.基于循环结构的 LSTM 网络
  • D.基于卷积的一维时序网络

答案:A。CLIP 文本端采用 Transformer(约 12 层、512 维),因为它能建模词序与长程依赖,理解“草地上有只狗”与“狗上有片草地”的区别。词袋模型丢失语序,LSTM 与卷积序列模型表达能力不如 Transformer。

Q4. 将对比损失中的温度系数 τ 调小,会带来什么效果?

单选题 · mid

  • A.相似度概率分布变得更加平滑
  • B.相似度概率分布变得更加尖锐← 正确答案
  • C.模型的训练速度必然变慢
  • D.编码器的输出维度随之变小

答案:B。τ 是 softmax 中的温度:τ 越小,$s/\tau$ 差异被放大,概率分布越接近 one-hot,模型越“笃定区”的负样本。τ 过大则分布平滑、梯度稀疏。它不影响训练速度与特征维度。

Q5. CLIP 实验发现零样本精度随数据量大致呈什么规律?

单选题 · mid

  • A.呈平方级速度快速上升
  • B.呈指数级速度爆炸上升
  • C.与数据量的对数近似线性← 正确答案
  • D.到达一定规模后立刻停滞

答案:C。CLIP 论文观察到 log-linear 标度率:数据量翻倍,精度近似线性提升,且没有明显饱和。这说明对比学习对数据规模非常“饥饿”,也解释了为什么 WIT 要用 4 亿对数据。

Q6. Prompt 工程能提升 CLIP 零样本精度的最主要原因是什么?

单选题 · mid

  • A.模板减小了模型的显存占用
  • B.模板贴近预训练时的文本分布← 正确答案
  • C.模板优化了数据集的标签排序
  • D.模板强制图像编码器使用注意力

答案:B。CLIP 预训练时文本端输入的是完整句子,若推理时只给裸标签,文本特征会偏离训练分布。用“a photo of a {label}“等模板把标签改写成句子,让文本编码器回到”舒适区”,相似度计算才可靠。

Q7. 在数据充足时,ViT 相比 ResNet 作为视觉编码器的优势是?

单选题 · hard

  • A.缺少归纳偏置因而精度更差
  • B.全局建模带来更强的表征能力← 正确答案
  • C.推理速度始终慢一个数量级
  • D.完全无法配合对比学习目标

答案:B。归纳偏置在 小数据上帮助 ResNet 快速收敛,但数据充足时 ViT 的全局自注意力能捕获长距离关系,CLIP 论文中 ViT 家族全面超越 ResNet。A 是旧经验,C、D 与事实不符——ViT 在同等算力下效率反而更高。

Q8. CLIP 难以区分“狗骑宇航员”与“宇航员骑狗”,根源在于?

单选题 · hard

  • A.对比损失只做全局图文对齐← 正确答案
  • B.文本编码器词表大小远超预期
  • C.视觉编码器只看图像的左上角
  • D.训练数据中完全没有文本标签

答案:A。CLIP 的对齐发生在“全局图像—全局句子”层面,没有逐块、逐词的细粒度监督,因此对涉及空间关系与组合次序的语义无能为力。词表大小、数据中有无标签都不是根因。

Q9. 以下哪些属于 CLIP 的已知局限?

多选题 · mid

  • A.对图像中的数量信息感知很弱← 正确答案
  • B.在开放词汇分类上完全不可用
  • C.无法完成任何零样本识别任务
  • D.对空间位置关系理解不足← 正确答案

答案:AD。CLIP 擅长整体语义分类,但计数、属性绑定与空间关系是弱项,因此 A、D 正确。B、C 过于绝对——CLIP 的核心卖点恰恰是开放词汇与零样本识别,只是细粒度上不完美。

Q10. 下列哪些做法能有效改进 CLIP 的细粒度能力?

多选题 · hard

  • A.叠加掩码语言建模辅助目标← 正确答案
  • B.加入 Token 级对齐与检测头← 正确答案
  • C.清洗数据并均衡类别采样← 正确答案
  • D.移除所有文本编码器参数

答案:ABC。掩码语言建模增强文本语义(CoCa 思路),Token 级对齐让局部块与词元对应(FILIP 思路),数据清洗可减少偏见并提升分布覆盖,三者都能补强细粒度。D 相当于拆掉婚介所的文案分析师,只会让跨模态对齐失效。