综艺节目里有一种经典玩法「看图猜物」:搭档完全看不到图片,只凭一句描述——「圆圆的、红红的、脆脆的可以吃」——就能从一堆水果中锁定时令的那一种。CLIP(Contrastive Language-Image Pre-training)就是这样一个见过亿万张「图文配对卡」的猜物万事通。它不像传统图像分类模型那样靠背题库应试:题库里没有「猕猴桃」,它就真认不出猕猴桃。CLIP的绝活是听描述猜物——把「一张猕猴桃的照片」这句话编码成一种特征语言,再和图片的特征语言比对,哪怕从没见过猕猴桃的训练样本,也能凭描述认出它。这就是零样本分类:不训练、不调参,换个新类别照样能猜。这篇文章将带你从零拆解这位「万事通」的底层原理:双塔架构、对比预训练、Prompt模板、多模板集成,学完你也能用CLIP给任意图片零标注分类。

岗位关联

对AI从业者价值:掌握CLIP零样本分类,等于获得「免训练、可扩展」的图像分类利器,在新品类识别、少样本场景下大幅降低人工标注成本,是CV工程师的进阶必修课。

目录
  1. 可视化演示
  2. 零样本分类概述
  3. CLIP架构原理
  4. 图文对比预训练
  5. 零样本推理流程
  6. Prompt模板设计
  7. 多模板集成
  8. 与传统分类对比
  9. 局限与应用前景
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示CLIP双编码器架构的图文并行编码、余弦相似度矩阵匹配、以及Prompt ensemble零样本分类三个阶段,切换步骤查看不同环节。

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

双编码器:图文并行编码 图像编码器将图片转为patch序列再编码为向量 文本编码器将Prompt模板编码为文本向量 sim(I,T) = I·T / (||I|| ||T||) 双编码器分别处理后通过余弦相似度匹配

零样本分类概述

想象一位「背题库选手」参加认物大赛:题库里印着1000张带标签的照片,它把每张都刻进脑子。考试时题库里有的,对答如流;题库里没有的,哪怕是一个西红柿它也能看成红色气球。传统图像分类模型就是这位背题选手:模型结构最后挂一个固定长度的分类头,类别集合在训练那天就被焊死,想加一个「猕猴桃」类别,就得重新收集标注数据、重新训练。而今天的主角CLIP,是另一位参赛嘉宾——「猜物万事通」。它不需要背题库,只凭一句「圆圆的、毛茸茸的、切开是绿色的果子」,就能从候选清单里挑出猕猴桃。这种对训练时从未见过的类别直接做出预测的能力,就叫零样本分类。

CLIP之所以能做到,是因为它把「分类」这件事从「记忆标签」改成了「匹配描述」。给定一张图片,模型不再问「你属于第几类」,而是问「你更像哪段描述」。候选类别可以是猫、狗、车牌、CT影像中的病灶,只要把这些类别名称写成自然语言描述,CLIP都能给出匹配分数。分数最高的描述对应的类别,就是预测结果。整个过程不需要任何目标任务上的标注数据,也不需要更新任何参数,这就是「零样本」三个字的含义。

在实际使用中,我们会为每个候选类别计算一个匹配分数,再通过softmax归一化成概率:

回到猜物大赛的现场:背题库选手还在等题库更新,万事通已经用一句描述轻松拿下新类别。这正是零样本分类最大的魅力——把「认识什么」的选择权从训练时交还给了推理时。你只需要改一行文本,模型就从「猫狗分类器」变成了「病斑分类器」。

p(yi∣x)=exp⁡(s(x,ti)/τ)∑j=1Kexp⁡(s(x,tj)/τ)\displaystyle p(y_i|x)=\frac{\exp\left(s(x, t_i)/\tau\right)}{\sum_{j=1}^{K}\exp\left(s(x, t_j)/\tau\right)}
这个公式把「图片与第i个类别描述的相似度」转化为「属于第i类的概率」,温度τ控制分布的尖锐程度。通俗说:分数越高的候选,概率越接近1,预言越自信。
  1. 相似度s(x, t_i)衡量图片x和类别i的文本描述t_i有多匹配。就像猜物现场,万事通心里给「猕猴桃」这个描述打了个「很像」的分数。
    s(x,ti)\displaystyle s(x, t_i)
  2. 温度缩放s/τ把相似度除以温度τ。τ小则分数差异被放大,高分者更突出;τ大则分数差异被抹平,所有候选概率更均匀。
    s(x,ti)τ\displaystyle \frac{s(x, t_i)}{\tau}
  3. 指数化exp把缩放后的分数变成正数,同时保持大小顺序。分数越高,指数越大,优势被进一步拉开。
    exp⁡(s(x,ti)τ)\displaystyle \exp\left(\frac{s(x, t_i)}{\tau}\right)
  4. 分母归一化对所有K个候选类别的指数求和。每个类别的概率 = 自己的指数 / 总和,保证所有概率加起来等于1,形成一套完整的「投票结果」。
    ∑j=1Kexp⁡(s(x,tj)/τ)\displaystyle \sum_{j=1}^{K}\exp\left(s(x, t_j)/\tau\right)

CLIP架构原理

万事通凭什么能「看图听描述」?因为它随身带着两本词典:一本图像词典,一本文字词典。任何一张图片,图像词典都能把它压缩成一段「视觉特征简介」——不是像素本身,而是「画面里有什么」的高度抽象表征;任何一句话,文字词典都能把它压缩成一段「语义特征简介」——不是具体字词,而是「这句话在讲什么」的表征。这两本词典,就是CLIP的两大编码器。

CLIP采用双塔结构:图像塔(图像编码器)和文本塔(文本编码器)。图像塔通常用ResNet或ViT(视觉Transformer)实现,输入是一张图片,输出一个特征向量;文本塔用Transformer实现,输入是一句文本(通常是一个句子),输出另一个特征向量。关键设计在于:两个塔输出的特征向量被映射到同一个共享向量空间——就像把中文和英文都翻译成同一种「世界语」,在这个空间里,语义相近的图文向量会彼此靠近,语义无关的向量会彼此远离。

在这个共享空间里,衡量两个向量「近不近」的标尺是余弦相似度。假设图像特征向量为u,文本特征向量为v,它们的相似度定义为:

万事通的两本词典之所以能「互相对得上门」,是因为他在成长过程中见过无数「图文配对卡」,把两本词典的翻译规则打磨得严丝合缝。下一节我们就来看他是怎么长大的。

sim(u,v)=u⋅v∥u∥×∥v∥=cos⁡θ\displaystyle \text{sim}(u, v)=\frac{u \cdot v}{\|u\| \times \|v\|} = \cos\theta
余弦相似度只关心两个向量的方向是否一致,不关心它们的长度。就像判断两个人「聊不聊得来」看的是三观方向是否一致,而不是看谁嗓门大。
  1. 点积u·v对应位置相乘后求和。方向越一致的点积越大,方向垂直则接近0,方向相反则为负。
    u⋅v=∑iuivi\displaystyle u \cdot v = \sum_{i} u_i v_i
  2. 模长‖u‖、‖v‖每个向量的长度,即各分量平方和再开根号。除以模长是为了去掉「长度」的干扰,只看方向。
    ∥u∥=∑iui2\displaystyle \|u\| = \sqrt{\sum_{i} u_i^2}
  3. 比值即余弦两个单位向量的点积取值范围在[-1, 1],1表示方向完全一致,-1表示方向完全相反。CLIP训练的目标就是让配对的图文向量余弦值尽量接近1。
    cos⁡θ=u⋅v∥u∥×∥v∥\displaystyle \cos\theta = \frac{u \cdot v}{\|u\| \times \|v\|}

图文对比预训练

万事通不是天生的,他的成长经历只有一件事:翻看海量图文配对卡。OpenAI从互联网上收集了约4亿对「图片+文字描述」的数据——一张夕阳下海边的照片,配文「a photo of a sunset over the ocean」;一张戴着帽子的狗,配文「a dog wearing a hat」。注意,这些配对数据不需要人工标注类别,网页上现成的图文就是天然标签。这就像猜物高手小时候翻遍了世界各地的图鉴,每张图下面都配着一句自然语言说明。

CLIP的学习方式是对比学习。对于一张图片,它对应的文字描述是正样本——应该被拉近;同一批数据里的其他文字描述是负样本——应该被推开。想象一下幼儿园老师让小朋友做连线题:把图片和正确的句子连在一起,其他句子都是干扰项。CLIP做的事情一模一样,只不过它在做的是「拉近」与「推开」:正样本对在向量空间里互相靠近,负样本对互相远离。

这个目标用InfoNCE损失函数来刻画。对一批大小为N的图文对,第i对图片I_i和文本T_i的损失为:

经过数十亿次这样的「连线练习」,图像塔学会了「看懂画面」,文本塔学会了「读懂语义」,更重要的是,两个塔在共享空间里对齐了——万事通的两本词典终于能互译了。这时候,他已经不需要题库,可以上场参加「看图猜物」了。

Li=−log⁡exp⁡(sim(Ii,Ti)/τ)∑j=1Nexp⁡(sim(Ii,Tj)/τ)\displaystyle \mathcal{L}_i = -\log\frac{\exp\left(\text{sim}(I_i, T_i)/\tau\right)}{\sum_{j=1}^{N}\exp\left(\text{sim}(I_i, T_j)/\tau\right)}
这个损失鼓励「第i张图片与它自己的描述」的相似度,在与其他N-1个干扰文本的对比中胜出。本质是一场N选1的考试:每个正样本对要在噪声中脱颖而出。
  1. 正样本分子exp(sim(I_i, T_i)/τ) 是图片与正确描述的匹配指数。理想情况下这个值要尽可能大。
    exp⁡(sim(Ii,Ti)/τ)\displaystyle \exp\left(\text{sim}(I_i, T_i)/\tau\right)
  2. 负样本分母分母把与所有文本(包括正样本自己)的匹配指数都加起来,代表「从N个候选中选一个」的总池子。
    ∑j=1Nexp⁡(sim(Ii,Tj)/τ)\displaystyle \sum_{j=1}^{N}\exp\left(\text{sim}(I_i, T_j)/\tau\right)
  3. log与负号把比值取对数再加负号。当正样本匹配远高于干扰项时,比值接近1,log接近0,损失趋近于0;反之损失很大。梯度下降就是在不断「修剪」这个损失。
    −log⁡(⋅)\displaystyle -\log(\cdot)

零样本推理流程

万事通上场猜物,有一套固定的流程。假设此刻他面对一张从未见过的动物照片,候选清单是「猫、狗、鸟」。第一步,他掏出文本词典,把每个候选类别扩写成一句标准描述;第二步,他掏出图像词典,把照片压缩成视觉特征简介;第三步,他逐个比对「照片简介」和「描述简介」的余弦相似度;第四步,选相似度最高的那个名字报出答案。

把流程符号化:设图片为x,类别集合为 {y_1, y_2, ……, y_K}。先为每个类别构造描述文本 t_k = template(y_k),比如「a photo of a cat」。然后用文本编码器 f_text 把 t_k 编码为文本特征,用图像编码器 f_image 把 x 编码为图像特征。最后计算相似度并取最大值:

这一套流程没有「训练」二字,只有「编码」和「比对」。正因为如此,换一批候选类别只需要重新写文本,几毫秒就能完成「换题库」。不过万事通也不是随便问问就能猜准——他问话的措辞,直接决定了猜题的成功率。这正是下一节Prompt模板的用武之地。

y^=arg⁡max⁡kcos⁡(fimage(x), ftext(tk))\displaystyle \hat{y}=\arg\max_{k} \cos\left(f_{\text{image}}(x),\ f_{\text{text}}(t_k)\right)
推理时CLIP没有任何权重更新,它只是把「分类」转化成了「检索」:在候选文本里找与图像最匹配的那一个。这就是零样本的本质——用检索代替训练。
  1. 图像特征f_image(x)图像塔把图片压缩成一个向量,好比万事通扫一眼照片,在脑子里形成「圆脸、竖耳、胡须」的视觉印象。
    fimage(x)\displaystyle f_{\text{image}}(x)
  2. 文本特征f_text(t_k)文本塔把「a photo of a cat」这样的句子压缩成向量,好比万事通在候选清单上给每个名字标注了语义画像。
    ftext(tk)\displaystyle f_{\text{text}}(t_k)
  3. arg max取最大遍历K个候选,找出余弦相似度最大的下标k,对应的类别就是预测结果。整个流程是前向计算,没有梯度、没有反向传播。
    arg⁡max⁡kcos⁡(⋅,⋅)\displaystyle \arg\max_{k} \cos(\cdot, \cdot)

Prompt模板设计

同样是问「照片里是什么」,不同问法效果天差地别。你问「呃……那个……啥?」万事通一头雾水;你问「这是一张XX的照片」,他立刻心领神会。CLIP的文本塔在预训练时见过的句子大多是完整的自然语言描述,而不是孤零零的单词。因此,把类别名「cat」直接喂给文本塔,效果往往不如「a photo of a cat」——后者更贴近万事通在成长过程中熟悉的「语言环境」。

Prompt模板就是一个填空句子,把类别名填进去,生成一句自然的描述:

常见的模板还有很多变体:「a photo of a {}」「a picture of {}」「a sculpture of {}」「a drawing of a {}」等。在ImageNet的零样本评测中,团队发现精心设计的模板比裸类别名能提升数十个百分点。这背后的原因也不难理解:预训练数据里,图片配文大多是完整句子,文本塔已经习惯了「句子式输入」;你递上一句完整的话,它才能调动全部经验来理解。

当然,这也暴露了一个现实:措辞敏感是CLIP的固有属性。同一个类别,换一种句式,相似度分数可能明显波动。既然单个问法有波动,那就多问几种、综合判断——这就是集成的思想。

tk=“a photo of a {yk}”,ek=ftext(tk)\displaystyle t_k = \text{``a photo of a } \{y_k\} \text{''},\qquad e_k = f_{\text{text}}(t_k)
模板的作用是给类别名穿上一件「自然语言的外衣」,让文本塔能用它最习惯的方式理解这个类别。换件衣服,识别效果可能差好几个百分点。
  1. 模板填充把类别名y_k填入占位符{ },得到完整句子t_k。比如y_k=dog,得到「a photo of a dog」。
    tk=“a photo of a {yk}”\displaystyle t_k = \text{``a photo of a } \{y_k\} \text{''}
  2. 文本编码用文本塔f_text把句子编码为特征向量e_k。这个向量包含了「照片里有只狗」的完整语义,而不是孤零零的「狗」字。
    ek=ftext(tk)\displaystyle e_k = f_{\text{text}}(t_k)

多模板集成

猜物现场,主持人只问一次「这是什么?」万事通可能犹豫。但如果主持人换五种问法:「这是什么?」「照片里是什么?」「你能认出这个吗?」「这像什么?」「图里有什么?」每一种问法都给出一个判断,综合五个判断再下结论,准确率自然更稳。CLIP的多模板集成(prompt ensemble)就是这个思路。

实现上,对每个类别y_k,准备M个模板,分别生成M个描述句子,各自编码成文本特征,然后与图像特征计算相似度并取平均:

多模板集成的收益在ImageNet评测中非常显著:单模板Top-1准确率约68%,而用80个模板集成后提升到约76%。8个百分点的提升,仅仅来自「多问几遍」。这也给工程实践提了个醒:跑CLIP零样本分类,别只写一句模板就跑,多准备几套句式,白捡几个点的精度。

S(yk∣x)=1M∑m=1Mcos⁡(fimage(x), ftext(tk(m)))\displaystyle S(y_k|x)=\frac{1}{M}\sum_{m=1}^{M}\cos\left(f_{\text{image}}(x),\ f_{\text{text}}(t_k^{(m)})\right)
多模板集成相当于让万事通用多种问法反复确认,再把各次相似度分数平均,减小单一措辞带来的偶然偏差。工程上几乎零成本,效果却很实在。
  1. M个模板生成M个描述t_k^{(1)}, t_k^{(2)}, ……, t_k^{(M)} 是同一个类别的不同说法。比如「a photo of a cat」「a picture of a cat」「a drawing of a cat」。
    tk(m),m=1,2,…,M\displaystyle t_k^{(m)},\quad m=1,2,\dots,M
  2. 分别算相似度每种说法都与图像特征算一次余弦相似度。相当于多个「考官」各自独立打分。
    cos⁡(fimage(x), ftext(tk(m)))\displaystyle \cos\left(f_{\text{image}}(x),\ f_{\text{text}}(t_k^{(m)})\right)
  3. 平均融合把M个分数加起来除以M。平均可以抵消个别说法的「异常发挥」,让最终分数更接近真实语义匹配度。
    1M∑m=1M(⋅)\displaystyle \frac{1}{M}\sum_{m=1}^{M}(\cdot)

与传统分类对比

把背题库选手和猜物万事通放在同一张考场上,差异清晰可见。传统分类模型的训练流程是:收集1000类标注数据 → 训练一个带分类头的网络 → 部署。分类头的维度被固定为1000,下次想换成2000类?从头再来。CLIP的流程则是:加载预训练双塔 → 写K个类别模板 → 部署。下次想换类别?改一行文本,立刻生效。

用公式对比两者的目标函数,差异一目了然。传统监督分类学的是一个「线性分类头」W:

而CLIP没有分类头,它的「分类」是文本匹配:

当然,背题库选手也不是一无是处:在固定类别、数据充足的封闭场景下,专门训练的分类模型精度通常仍然高于CLIP。万事通的强项是灵活和泛化,不是死磕单点精度。选谁,取决于你的场景是「题库永远不变」还是「新物种层出不穷」。

Psup(y∣x)=softmax(W⊤f(x))\displaystyle P_{\text{sup}}(y|x)=\text{softmax}\left(W^{\top} f(x)\right)
Pclip(y∣x)=softmax(cos⁡(fimage(x), ftext(ty))τ)\displaystyle P_{\text{clip}}(y|x)=\text{softmax}\left(\frac{\cos\left(f_{\text{image}}(x),\ f_{\text{text}}(t_y)\right)}{\tau}\right)
传统分类的权重W是从训练数据里学出来的,类别换了W就得重学;CLIP的「权重」藏在文本描述里,换类别只需换句子。这是两者最本质的分水岭。
  1. 传统分类头WW是形状为[特征维度,类别数]的矩阵,每一列对应一个类别的「模板特征」。它完全由训练数据决定,新类别无法凭空生成。
    W⊤f(x)\displaystyle W^{\top} f(x)
  2. softmax归一化传统模型在固定类别集合上做概率归一化,类别数变了,整个尾部结构都要重新训练。
    softmax(⋅)\displaystyle \text{softmax}(\cdot)
  3. CLIP的文本特征即权重f_text(t_y)相当于动态生成的第y类「模板特征」,不需要训练,只需要写一句描述。类别数从10变成1000,只是多写几句模板的事。
    cos⁡(fimage(x), ftext(ty))/τ\displaystyle \cos\left(f_{\text{image}}(x),\ f_{\text{text}}(t_y)\right)/\tau

局限与应用前景

万事通也有翻车的时候。第一,细粒度识别是硬伤:让他区分「哈士奇」和「阿拉斯加雪橇犬」,他可能盯着照片半天,最后报出「狗」。候选类别极其相似时,文本描述的区分度不足,特征向量在空间里挤成一团,余弦相似度拉不开差距。第二,域偏移(domain shift):预训练数据以自然照片为主,如果测试图是X光片、卫星图或手绘草图,匹配效果会明显下降——万事通没见过这种「画风」,自然猜不准。第三,数据偏差:预训练数据来自互联网,天然带有社会文化偏差,某些小众类别或非英语描述的效果会打折扣。

评估CLIP零样本分类性能时,常用Top-K准确率这个指标。对N张测试图片:

尽管有这些短板,万事通的前景依然广阔。CLIP开启的「图文匹配」范式已经扩展到视频理解、语义分割、目标检测、图像生成等领域,诸如DALL·E、Stable Diffusion等文生图模型也大量借用了CLIP的文本空间。零样本分类不是终点,而是「不需要训练就能理解世界」这个更大叙事的起点——对CV工程师来说,掌握这位万事通,就等于拥有了一把能随时换锁芯的万能钥匙。

AccK=1N∑i=1N1[yi∈top-K(p^i)]\displaystyle \text{Acc}_K = \frac{1}{N}\sum_{i=1}^{N} \mathbb{1}\left[y_i \in \text{top-}K(\hat{p}_i)\right]
Top-K准确率衡量「正确答案是否落在模型预测概率最高的前K个候选里」。K越大,容错率越高,也越能反映模型候选排序的整体质量。
  1. 指示函数1[·]括号内条件成立取1,不成立取0。相当于给每张图记一次「猜中/没猜中」。
    1[⋅]\displaystyle \mathbb{1}[\cdot]
  2. top-K预测集合把模型对所有候选类别的预测概率从高到低排序,取前K个类别组成集合。K=1就是常规准确率,K=5表示「前五名里有没有正确答案」。
    top-K(p^i)\displaystyle \text{top-}K(\hat{p}_i)
  3. 平均对N张测试图的命中情况取平均,得到0到1之间的准确率分数。这是衡量零样本分类器候选质量的核心指标。
    1N∑i=1N(⋅)\displaystyle \frac{1}{N}\sum_{i=1}^{N}(\cdot)

AI 应用场景

电商新品自动打标

阶段:数据标注辅助与商品理解

解决的问题:电商平台每天上新大量商品,传统分类模型只能识别训练时定义好的类目,新品或小众品类(如「露营折叠椅」)没有历史标注数据,人工打标成本高、时效差。CLIP零样本分类可以直接用商品名或运营写的短描述作为文本模板,对商品主图进行匹配分类,实现「上线即打标」。

具体案例:某二手交易平台接入CLIP后,用户上传闲置物品照片,系统用平台标准的数万个子类目名生成模板,零标注地为照片预测子类目,推荐给用户确认。相比纯人工打标,每单耗时从2分钟降到秒级,冷门类目识别率提升了约15%。

新闻图片库自动归集

阶段:内容生产与检索增强

解决的问题:媒体机构积累了海量历史图片,按新闻事件、人物、场景归档需要大量人工。传统模型分类体系固定,新增选题(如「火星探测车」)无法即时覆盖。CLIP允许用新闻标题、选题关键词动态构造模板,对图片库做零样本检索和分类,随用随改。

具体案例:某图片版权平台用CLIP对500万张存量图片建立文本检索索引,编辑输入「暴雨中的城市街道」,系统直接将图片与描述做相似度匹配返回Top-50候选,无需为每个新选题重新训练模型,选题响应时间从天级缩短到分钟级。

专业影像初步筛查

阶段:辅助诊断前的候选筛选

解决的问题:在医疗、工业等专业领域,罕见病例或新型缺陷往往缺乏标注样本。传统监督模型无法覆盖「没见过」的类别,而CLIP可以借助专业描述文本(如「肺部磨玻璃样阴影」「电路板锡珠缺陷」)对影像做初步筛查,为专家提供候选排序。

具体案例:某医疗器械团队用CLIP对眼底照片做病变初筛,将「糖尿病视网膜病变」「黄斑水肿」等术语写进模板,对无标注的筛查队列输出疑似阳性Top-K清单,再由医生复核。初筛召回率可观,大幅减少了医生逐张翻阅的工作量。

Python 演示

python38 行
import torchimport open_clipfrom PIL import Image model, _, preprocess = open_clip.create_model_and_transforms(    'ViT-B-32', pretrained='laion2b_s34b_b79k')tokenizer = open_clip.get_tokenizer('ViT-B-32') labels = ['cat', 'dog', 'bird']templates = [    'a photo of a {}',    'a photo of the {}',    'a picture of a {}'] def zero_shot_classify(image_path, labels, templates):    img = preprocess(Image.open(image_path).convert('RGB')).unsqueeze(0)    with torch.no_grad():        image_features = model.encode_image(img)        image_features /= image_features.norm(dim=-1, keepdim=True)        total_probs = None        for template in templates:            texts = [template.format(label) for label in labels]            text_tokens = tokenizer(texts)            text_features = model.encode_text(text_tokens)            text_features /= text_features.norm(dim=-1, keepdim=True)            similarity = image_features @ text_features.T            probs = torch.softmax(similarity, dim=-1)            total_probs = probs if total_probs is None else total_probs + probs        average_probs = total_probs / len(templates)    best_idx = average_probs.argmax().item()    return labels[best_idx], average_probs[0, best_idx].item() if __name__ == '__main__':    image_path = 'animal.jpg'    pred, confidence = zero_shot_classify(image_path, labels, templates)    print('predict:', pred, 'confidence:', confidence)
目的:完整实现CLIP零样本分类的推理流程——加载预训练双塔模型,对输入图片与多个类别模板做图文匹配,并用多模板集成输出最终预测。
  1. model, _, preprocess = open_clip.create_model_and_transforms('ViT-B-32', ...)加载预训练ViT-B-32双塔模型,_表示丢弃训练接口,只需推理。
  2. img = preprocess(Image.open(image_path).convert('RGB')).unsqueeze(0)图片预处理:缩放、归一化、加batch维度,变成模型能吃的张量。
  3. image_features = model.encode_image(img)图像塔编码,把图片压缩成视觉特征向量。
  4. image_features /= image_features.norm(dim=-1, keepdim=True)除以模长做L2归一化,让之后的点积等价于余弦相似度。
  5. texts = [template.format(label) for label in labels]模板填充,把类别名嵌进句子,如 'a photo of a cat'。
  6. text_tokens = tokenizer(texts)文本分词,把句子转成token序列。
  7. text_features = model.encode_text(text_tokens)文本塔编码,得到类别描述的特征向量。
  8. similarity = image_features @ text_features.T矩阵乘法算图像特征与所有文本特征的相似度。
  9. total_probs = probs if total_probs is None else total_probs + probs多模板集成:每个模板的softmax分数累加。
  10. average_probs = total_probs / len(templates)求平均概率,综合多个句式给出最终预测。

常见误区

误区「零样本分类不需要任何数据,直接就能用,所以它是从石头里蹦出来的。」我一开始以为CLIP完全不用数据,像查字典一样天然啥都懂。

正解零样本指的是不需要目标任务上的标注数据,但CLIP在预训练阶段吞下了约4亿个图文对。这就好比万事通虽然考试前不背题库,但人家从小看了几亿张「图文配对卡」才练出猜物本事。零样本省的是「训练」的麻烦,不是「成长」的代价。

为何常见:「零样本」三个字太有迷惑性,容易让人忽略预训练阶段的巨大数据成本。常见误区是只看到推理时「免训练」的表象。

误区「CLIP最后肯定有个分类层,输出就是类别编号,所以换类别也得重新训练吧?」很多CV背景的人沿用传统分类模型的思维惯性。

正解CLIP压根没有可训练的分类头,它的「分类」是图文特征匹配。类别集合变化时,只是文本模板列表变化,模型权重一行都不用动。就像万事通换一本候选名册就能开新一场猜物赛,不需要重新培养一个万事通。

为何常见:传统分类模型的「特征提取器+分类头」结构太深入人心,人们习惯性地把CLIP也套进这个模板里。

误区「反正CLIP懂语义,直接写『cat』和写『a photo of a cat』应该没区别吧?」试过才发现差别巨大。

正解文本塔是在完整句子的语料里练出来的,裸单词相当于问万事通「这个……嗯……」,完整句子才是他熟悉的提问方式。工程上模板措辞能带来几个到十几个百分点的差异,值得当作超参数来调。

为何常见:人们容易把CLIP的文本塔想象成「查单词表」,忽略了预训练数据的分布是自然句子而非孤词。

误区「CLIP会这么多种类,肯定比任何分类模型都准,以后不需要训练模型了。」这是一种典型的过度乐观。

正解在封闭类别、数据充分的场景下,专门训练的分类模型精度通常优于CLIP,因为监督模型把全部容量都用来精雕细琢这些固定类别;CLIP胜在开集泛化和换类别的灵活性。背题库选手专攻模拟题更准,万事通强在临场猜新题。

为何常见:零样本的惊艳表现容易让人忽略「通用」与「专用」之间此消彼长的精度权衡。

面试题

Q1. CLIP零样本分类与传统分类模型最核心的区别是什么?

单选题 · easy

  • A.CLIP需要更大的GPU显存
  • B.CLIP用文本匹配代替固定分类头← 正确答案
  • C.CLIP必须使用ImageNet预训练
  • D.CLIP输出的是图像分割结果

答案:B。传统模型通过训练的线性分类头输出固定类别编号,CLIP则把类别名编码成文本特征与图像特征匹配,换类别只需换文本,无需重训练。A、C、D均不符合CLIP的设计本质。

Q2. CLIP双塔结构中,图像塔和文本塔的输出被映射到哪里?

单选题 · mid

  • A.两个独立的向量空间
  • B.同一个共享向量空间← 正确答案
  • C.一个离散的标签集合
  • D.一个低维的编码表

答案:B。双塔的输出的键设计是映射到同一个共享语义空间,语义相近的图文向量在空间中距离近,才能直接计算余弦相似度。这正是「图文配对卡」训练出的对齐效果。

Q3. 在CLIP的对比预训练中,正样本指的是什么?

单选题 · mid

  • A.随机搭配的图片和文本
  • B.语义匹配的图片和文本对← 正确答案
  • C.相同尺寸的图片和文本
  • D.同一批次的全部图文对

答案:B。正样本是来自同一图文对的图片和描述,语义匹配,应被拉近;同一批次里的其他文本都是负样本,应被推开。随机搭配或同批次样本都不具备「语义匹配」属性。

Q4. InfoNCE损失优化的是什么目标?

单选题 · hard

  • A.单独把正样本分数拉高
  • B.单独把负样本分数压低
  • C.让正样本在N个候选中胜出← 正确答案
  • D.最小化预测与标签的交叉熵

答案:C。InfoNCE把问题建模为N选1:正样本的相似度不仅要高,还要在分母所有候选(含N-1个负样本)中占比最大。单独拉高或压低都不完整,D是监督分类的损失。

Q5. 温度参数τ增大时,softmax概率分布会怎样变化?

单选题 · mid

  • A.高概率类别更突出,分布更尖锐
  • B.各类别概率趋于均匀,分布更平缓← 正确答案
  • C.所有类别概率同步增大
  • D.概率总和不再等于1

答案:B。τ在分母上,增大会削弱分数间的差异,exp(s/τ)彼此接近,归一化后各概率趋于均匀;τ减小则高分者独占鳌头。概率总和始终为1,C、D错误。

Q6. 为什么「a photo of a cat」比裸单词「cat」作为Prompt效果更好?

单选题 · mid

  • A.句子更长,计算量更大更准
  • B.文本塔预训练时更熟悉完整句子← 正确答案
  • C.单词会被分词器拆分丢失信息
  • D.长文本能触发图像塔更高分辨率

答案:B。CLIP的文本塔在海量自然句子语料上训练,完整句式符合它熟悉的「语言环境」,编码出的特征语义更丰富。这与计算量、分词或图像塔无关。

Q7. 多模板集成(prompt ensemble)为什么能提升分类效果?

多选题 · mid

  • A.减小单一措辞带来的偶然偏差← 正确答案
  • B.综合多种问法让匹配更稳健← 正确答案
  • C.增加了模型参数量提升表达力
  • D.平均结果能缓解个别模板的失误← 正确答案

答案:ABD。集成通过多种句式多次打分再平均,抵消单模板的措辞敏感性,减少偶然失误。它不改变模型参数,C错误,只是推理过程的融合策略。

Q8. 以下哪些步骤属于CLIP零样本分类的推理流程?

多选题 · mid

  • A.将类别名填入Prompt模板← 正确答案
  • B.用文本塔编码模板句子← 正确答案
  • C.用图像塔编码输入图片← 正确答案
  • D.反向传播更新模型权重

答案:ABC。推理流程是模板构造、文本编码、图像编码、余弦相似度排序,全程前向计算无梯度更新。D是训练阶段的行为,C零样本推理完全不涉及。

Q9. 关于CLIP与传统监督分类对比,下列说法正确的是?

多选题 · hard

  • A.传统模型换类别需要重新训练← 正确答案
  • B.CLIP类别扩展只需修改文本模板← 正确答案
  • C.CLIP依赖海量图文对预训练← 正确答案
  • D.传统模型在所有场景都优于CLIP

答案:ABC。传统分类头绑定固定类别集,换类别须重训;CLIP以文本匹配代替分类头,换类别即换文本;CLIP的性能建立在4亿图文对预训练之上。D过于绝对,封闭场景下监督模型往往更准。

Q10. 下列哪项是CLIP零样本分类的典型局限?

单选题 · hard

  • A.无法处理任何图像输入
  • B.细粒度相似类别容易混淆← 正确答案
  • C.推理时必须要联网下载模板
  • D.只能支持英文一种语言

答案:B。CLIP在细粒度任务上区分度不足,哈士奇与阿拉斯加这类相似类别容易翻车。它能处理图像输入、模板本地构造、且已有多语言版本,A, C, D均非典型局限。