想象你请来一位见多识广的大厨,他读过4亿道“图配文”的菜谱,只要看到一道菜的照片,就能大致说出它叫什么名字,反过来念出菜名也能想到照片。这位大厨就是 CLIP:一边靠“眼睛”读图,一边靠“文字”读菜名,两只手必须默契配合。可当你开了一家小餐馆,客人点的全是本地私房菜,菜单语言和大厨熟悉的菜谱完全不同,你该怎么让这位大厨快速上手?最笨的办法是送他回厨师学校重新培训——这就像全量微调,昂贵且容易忘掉老手艺。更聪明的办法是给他一张便利贴,上面写几句本地话的提示,让他做菜时扫一眼。如何让这张便利贴被自动写得最好,正是 Prompt Learning 所做的事。

岗位关联

对多模态 AI 工程师来说,掌握 CLIP 微调与提示学习,意味着能用极少量标注把百亿级图文模型迁移到自己的业务场景,是降本增效的必修课。

目录
  1. 可视化演示
  2. CLIP双塔基础:两位大厨的默契
  3. CLIP微调策略:重新培训还是只换前台
  4. Prompt Learning原理:给大厨递便利贴
  5. CoOp方法:一张共享便利贴走天下
  6. CoCoOp方法:每张照片定制便利贴
  7. 实践评估选择:什么时候用哪张便利贴
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示CLIP微调与Prompt 的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

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

CLIP微调与Prompt :CLIP CLIP微调策略概览与适配方法 CoOp可学习提示的优化方法 核心机制可视化 CLIP微调与Prompt 整体架构与关键组件

CLIP双塔基础:两位大厨的默契

想象一位叫 CLIP 的大厨,左手看图,右手读菜名。他在4亿道图文菜谱上练出了默契:看到一道菜的照片,脑海里会自动浮现菜名的味道;听到一个菜名,也能想象出它装盘的样子。这种默契不是靠死记硬背,而是靠大量“图文配对”的对比学习慢慢磨出来的。

CLIP 实际由图像编码器和文本编码器两个塔组成。训练时,一个 batch 里有 N 张图片和 N 条文本,正样本是图片和它对应的文本,其余 N-1 条文本都算负样本。模型要把正样本的相似度推高,把负样本的相似度压低。于是损失函数写成:

训练好的 CLIP 有了“零样本分类”能力:给定一张照片,把它和“一张{类别}的照片”这样模板生成的文本逐一比较,得分最高的类别就是预测结果。可当你的新餐厅用“SKU-037”这种暗号当菜名时,大厨就听不懂了。于是我们需要微调策略。

L=−12N∑i=1N[log⁡exp⁡(sim(Ii,Ti)/τ)∑j=1Nexp⁡(sim(Ii,Tj)/τ)+log⁡exp⁡(sim(Ii,Ti)/τ)∑j=1Nexp⁡(sim(Ij,Ti)/τ)]\displaystyle \mathcal{L}=-\frac{1}{2N}\sum_{i=1}^{N}\left[\log\frac{\exp(\mathrm{sim}(I_i,T_i)/\tau)}{\sum_{j=1}^{N}\exp(\mathrm{sim}(I_i,T_j)/\tau)}+\log\frac{\exp(\mathrm{sim}(I_i,T_i)/\tau)}{\sum_{j=1}^{N}\exp(\mathrm{sim}(I_j,T_i)/\tau)}\right]
  1. 图片与文本向量图片编码器把第 \(i\) 张图变成向量 \(I_i\),文本编码器把第 \(i\) 条文本变成向量 \(T_i\),然后计算它们的余弦相似度:
    sii=sim(Ii,Ti)=Ii⋅Ti∥Ii∥∥Ti∥\displaystyle s_{ii}=\mathrm{sim}(I_i,T_i)=\frac{I_i \cdot T_i}{\lVert I_i\rVert \lVert T_i\rVert}
  2. 负样本归一化分母累加第 \(i\) 张图与 batch 中所有文本的相似度,再除以温度系数 \(\tau\),相当于对相似度做 softmax:
    ∑j=1Nexp⁡(sij/τ)\displaystyle \sum_{j=1}^{N}\exp(s_{ij}/\tau)
  3. 双向对称求和图片找文本和文本找图片两个方向都要做,两个方向的 log-softmax 取平均再加负号,形成 InfoNCE 式的对比损失:
    −12N∑i=1N[log⁡exp⁡(sii/τ)∑jexp⁡(sij/τ)+log⁡exp⁡(sii/τ)∑jexp⁡(sji/τ)]\displaystyle -\frac{1}{2N}\sum_{i=1}^{N}\left[\log\frac{\exp(s_{ii}/\tau)}{\sum_j\exp(s_{ij}/\tau)}+\log\frac{\exp(s_{ii}/\tau)}{\sum_{j}\exp(s_{ji}/\tau)}\right]

CLIP微调策略:重新培训还是只换前台

把大厨送回厨师学校,让他把过去所有做菜习惯都推翻重练,这就是全量微调。它确实能让他学会私房菜,但代价极高,而且学新菜的过程中可能把原有的拿手菜也忘掉,这就是灾难性遗忘。更聪明的做法是:大厨继续掌勺,只换一个熟悉本地客人的前台,由前台负责把菜名解释给客人,这对应线性探测。

实际工作中,全量微调会更新整个模型的参数;线性探测冻结图像编码器和文本编码器,只在最后接一个可训练的分类头;部分层微调则只更新最后几层,让模型“带一点本地口音”但保留底层通用知识。用一个统一的参数更新公式来表示:

当训练数据只有每类几张图时,全量微调就像让大厨只看三道菜就重写整个菜谱,必然过拟合。而线性探测虽然安全,却没能改变 CLIP 对“菜名暗号”的理解。有没有既不用重训大厨,又能让他听懂新语言的办法?答案是提示学习。

θt=θt−1−η∇θ1∣D∣∑(x,y)∈DLtask(fθ(x),y)\displaystyle \theta_t=\theta_{t-1}-\eta\nabla_\theta\frac{1}{|\mathcal{D}|}\sum_{(x,y)\in\mathcal{D}}\mathcal{L}_{\mathrm{task}}(f_\theta(x),y)
  1. 前向计算损失把少数标注样本 \((x,y)\) 送入当前模型 \(f_\theta\),计算任务损失,例如分类交叉熵:
    Ltask(fθ(x),y)\displaystyle \mathcal{L}_{\mathrm{task}}(f_\theta(x),y)
  2. 反向求梯度对损失关于参数 \(\theta\) 求导,得到每个参数应该往哪个方向调整:
    ∇θ1∣D∣∑(x,y)∈DLtask(fθ(x),y)\displaystyle \nabla_\theta\frac{1}{|\mathcal{D}|}\sum_{(x,y)\in\mathcal{D}}\mathcal{L}_{\mathrm{task}}(f_\theta(x),y)
  3. 参数更新用学习率 \(\eta\) 控制步长,让参数沿着梯度反方向走一小步:
    θt=θt−1−η∇θLtask\displaystyle \theta_t=\theta_{t-1}-\eta\nabla_\theta\mathcal{L}_{\mathrm{task}}

Prompt Learning原理:给大厨递便利贴

这次我们不培训厨师,只在他的菜谱首页贴一张便利贴,上面写着本地客人说话的口味习惯。大厨每次做菜前扫一眼便利贴,做菜手法不变,但端出来的菜更符合本地口味。这张便利贴就是 Prompt。传统手工提示是专家反复试出来的文字模板,而 Prompt Learning 把便利贴变成一组可学习的连续向量,让模型自己按需调整。

在 CLIP 中,文本编码器的输入是一串 token 的向量。Prompt Learning 在类别词前面插入 \(M\) 个可学习的上下文向量,组成新的文本序列:

其中 \(c\) 是第 \(c\) 个类别的文本 token 向量。我们可以把分类概率写成一个相似度 softmax:

大厨的刀工、火候都没变,变的只是菜单上那张便利贴。接下来要解决的是:便利贴上的内容到底该怎样学出来?

tc=[v1,v2,…,vM,c]\displaystyle t_c=[v_1,v_2,\ldots,v_M,c]
p(y=c∣x)=exp⁡(sim(fI(x),g([v1,…,vM,c]))/τ)∑k=1Cexp⁡(sim(fI(x),g([v1,…,vM,ck]))/τ)\displaystyle p(y=c\mid x)=\frac{\exp\left(\mathrm{sim}(f_I(x),g([v_1,\ldots,v_M,c]))/\tau\right)}{\sum_{k=1}^{C}\exp\left(\mathrm{sim}(f_I(x),g([v_1,\ldots,v_M,c_k]))/\tau\right)}
  1. 可学习上下文向量\(v_m\) 不是字典里的词,而是每个维度都能被梯度更新的连续向量,等价于一张“可以打印内容的便利贴”:
    vm∈Rd,m=1,…,M\displaystyle v_m\in\mathbb{R}^d,\quad m=1,\ldots,M
  2. 拼接类别 token把上下文向量和类别向量拼成一个完整的文本向量序列,再送进冻结的文本编码器:
    tc=[v1,v2,…,vM,c]\displaystyle t_c=[v_1,v_2,\ldots,v_M,c]
  3. 零样本分类变成软提示分类图像向量 \(f_I(x)\) 与文本向量 \(g(t_c)\) 做余弦相似度,再经过 softmax 输出每个类别的概率:
    p(y=c∣x)=softmaxc(sim(fI(x),g(tc))τ)\displaystyle p(y=c\mid x)=\mathrm{softmax}_c\left(\frac{\mathrm{sim}(f_I(x),g(t_c))}{\tau}\right)

CoOp方法:一张共享便利贴走天下

CoOp 全称 Context Optimization,思路很直接:所有图片共用同一组可学习提示向量。就像餐厅在每张桌子上放同一张标准优惠券,券上写着“本店招牌菜请按本地口味制作”,不管客人点什么菜,大厨看到的便利贴都一样。

训练时,CLIP 的两个编码器保持冻结,只优化这 \(M\) 个提示向量。用少样本训练集计算分类交叉熵损失,梯度只回传到提示向量上。目标函数为:

CoOp 在 1/2/4/8/16 shot 设置下都能显著超过手工模板,而且学到的提示向量还可以作为新数据集的初始化,减少重新训练成本。但共用一张便利贴也有弱点:如果客人点的菜差异很大,固定的“本地口味”就不够用了。

min⁡v1,…,vM1∣D∣∑(x,y)∈D−log⁡exp⁡(sim(fI(x),g([v1,…,vM,cy]))/τ)∑k=1Cexp⁡(sim(fI(x),g([v1,…,vM,ck]))/τ)\displaystyle \min_{v_1,\ldots,v_M}\frac{1}{|\mathcal{D}|}\sum_{(x,y)\in\mathcal{D}}-\log\frac{\exp\left(\mathrm{sim}(f_I(x),g([v_1,\ldots,v_M,c_y]))/\tau\right)}{\sum_{k=1}^{C}\exp\left(\mathrm{sim}(f_I(x),g([v_1,\ldots,v_M,c_k]))/\tau\right)}
  1. 固定一组提示向量\(v_1,\ldots,v_M\) 是全部可学习参数,类别 token 和两个编码器都不再更新:
    Θtrain={v1,…,vM}\displaystyle \Theta_{\mathrm{train}}=\{v_1,\ldots,v_M\}
  2. 文本侧构造输入每个类别都用同一组提示向量拼接自己的类别 token,得到对应的文本描述:
    tk=[v1,…,vM,ck]\displaystyle t_k=[v_1,\ldots,v_M,c_k]
  3. 少样本交叉熵对所有标注样本计算正确类别的负对数概率并求和,得到端到端优化的目标:
    LCoOp=−1∣D∣∑(x,y)log⁡p(y∣x)\displaystyle \mathcal{L}_{\mathrm{CoOp}}=-\frac{1}{|\mathcal{D}|}\sum_{(x,y)}\log p(y\mid x)

CoCoOp方法:每张照片定制便利贴

想象同一家餐厅里,有人点了重辣的川菜,有人点了清淡的粤菜。固定便利贴只写“少油少盐”,显然无法同时照顾两种需求。CoCoOp 的解法是:让便利贴打印变得智能,大厨先看一眼照片,再根据照片内容临时生成一张专属提示。这就是 Conditional Context Optimization。

CoCoOp 用一个轻量的 Meta-Net 接收图片特征,输出 \(M\) 个提示向量:

接着把这组实例相关的提示向量拼上类别 token,再做文本编码和相似度分类。它的优化目标为:

CoCoOp 的核心优势是泛化:当测试集出现训练时没见过的“新菜”时,图片专属提示能根据图片内容自动调整,比 CoOp 的固定提示更稳健。代价则是 Meta-Net 增加了参数量和推理时间,选择时需要权衡。

[v1(xi),…,vM(xi)]=MLP(Pool(fI(xi)))\displaystyle [v_1(x_i),\ldots,v_M(x_i)]=\mathrm{MLP}\left(\mathrm{Pool}(f_I(x_i))\right)
min⁡ϕ1B∑i=1B−log⁡exp⁡(sim(fI(xi),g([v1(xi),…,vM(xi),cyi]))/τ)∑k=1Cexp⁡(sim(fI(xi),g([v1(xi),…,vM(xi),ck]))/τ)\displaystyle \min_{\phi}\frac{1}{B}\sum_{i=1}^{B}-\log\frac{\exp\left(\mathrm{sim}(f_I(x_i),g([v_1(x_i),\ldots,v_M(x_i),c_{y_i}]))/\tau\right)}{\sum_{k=1}^{C}\exp\left(\mathrm{sim}(f_I(x_i),g([v_1(x_i),\ldots,v_M(x_i),c_k]))/\tau\right)}
  1. 图片特征池化冻结的图像编码器输出整张图的特征,经过池化变成一个向量,作为 Meta-Net 的输入:
    zi=Pool(fI(xi))\displaystyle z_i=\mathrm{Pool}(f_I(x_i))
  2. Meta-Net 生成提示一个小型 MLP 把图片特征映射成 \(M\) 个提示向量,这些向量是图片专属的:
    [v1(xi),…,vM(xi)]=MLP(zi)\displaystyle [v_1(x_i),\ldots,v_M(x_i)]=\mathrm{MLP}(z_i)
  3. 动态文本分类每个类别都用这张图片自己的提示向量构造文本,再与图片特征计算相似度,最后用交叉熵让正确类别得分最高:
    LCoCoOp=−1B∑i=1Blog⁡p(yi∣xi)\displaystyle \mathcal{L}_{\mathrm{CoCoOp}}=-\frac{1}{B}\sum_{i=1}^{B}\log p(y_i\mid x_i)

实践评估选择:什么时候用哪张便利贴

如果餐厅菜单稳定、客人类型单一,一张共享便利贴就够,CoOp 便宜高效;如果客人画像差异大、拍摄环境飘忽不定,印照片专属便利贴的 CoCoOp 更划算;如果新任务本质上只是要一个固定分类器,线性探测已经足够;只有当你拥有大量标注数据且任务需要彻底改变模型表达方式时,才考虑全量微调。

从参数规模上可以直观看到差异:

在少样本评估中,建议固定随机种子,每个类别选取相同的 K 张图作为训练集,另取一批作为测试集,并报告多次运行的平均值。提示长度 M 不是越大越好,而是一个超参数,需要用小验证集搜索。如此得到的结论,才有资格回答“该微调还是该做提示学习”。

∣θfull∣≫Md≈∣ϕmeta∣\displaystyle |\theta_{\mathrm{full}}| \gg Md \approx |\phi_{\mathrm{meta}}|
  1. 全量微调参数所有编码器参数都可训练,参数量记为整个骨干网络规模:
    Θ(full)=∣θfull∣\displaystyle \Theta(\mathrm{full})=|\theta_{\mathrm{full}}|
  2. CoOp 参数量只训练 \(M\) 个维度为 \(d\) 的提示向量,参数规模只有 \(Md\):
    Θ(CoOp)=M×d\displaystyle \Theta(\mathrm{CoOp})=M\times d
  3. CoCoOp 参数量只训练 Meta-Net 的权重,与图片塔和文本塔相比通常小几个数量级:
    Θ(CoCoOp)=∣ϕmeta∣\displaystyle \Theta(\mathrm{CoCoOp})=|\phi_{\mathrm{meta}}|

AI 应用场景

电商以图搜款与商品分类

阶段:下游任务适配

解决的问题:电商后台有大量私人 SKU 编码,比如“AB-2026-白”,这些编码不在 CLIP 的自然语言词表里。如果直接零样本分类,准确率很低;如果全量微调,几十个类别的商品不足以支撑大模型更新。CoOp 只需学习一组共享提示向量,就能把“商品图”和“SKU 编码”重新对齐,用少量人工标注完成冷启动。

具体案例:某服装平台每天新增 300 个新款,每个新款只有 5-10 张标注入库图。算法团队用 CoOp 冻结 CLIP,只训练 8 个连续提示 token,在 16 shot 设置下把入库分类准确率从零样本的 62% 提升到 91%,且单卡训练只需几分钟。

医疗影像的跨设备域适应

阶段:模型鲁棒性优化

解决的问题:不同医院或不同厂商设备的 X 光片在亮度、对比度和摆位上差异很大,固定提示容易“水土不服”。CoCoOp 的图片专属提示可以根据每一张影像的特征动态生成提示,适应设备差异。

具体案例:医疗影像公司需要在三家医院部署肺部疾病分类模型。每家医院只提供 50 张标注片,他们用 CoCoOp 让每一张 X 光片生成自己的提示文本,在“新设备”测试集上比 CoOp 高出 8% 的 F1,同时没有降低原来设备的识别能力。

多模态内容审核

阶段:提示词策略迭代

解决的问题:内容安全场景中,违规类别更新非常快,传统做法是不断收集大量样本重训分类模型。Prompt Learning 允许审核团队只更新提示向量,就能让 CLIP 快速识别新出现的违规话术与图片组合。

具体案例:某社区平台发现一种新型“隐形营销”图片,正面看是街拍,边缘处嵌入小字广告。审核团队用 20 张违规样本训练一组 CoOp 提示向量,当天便上线了新的风险识别规则,而不用重新训练整个多模态模型。

Python 演示

python71 行
import torchimport torch.nn.functional as F  class FixedBackbone:    """用固定随机映射模拟CLIP编码器"""    def __init__(self, dim=64):        torch.manual_seed(0)        self.proj = torch.randn(dim * 2, dim) / (dim ** 0.5)     def encode_image(self, x):        return F.normalize(x @ self.proj, dim=-1)     def encode_text(self, t):        return F.normalize(t @ self.proj, dim=-1)  class SoftPrompt:    """简化版CoOp提示学习器"""    def __init__(self, dim, n_prompts=8, n_classes=4, backbone=None):        self.v = torch.nn.Parameter(torch.randn(n_prompts, dim) * 0.1)        self.tau = torch.nn.Parameter(torch.tensor(0.07))        self.backbone = backbone        self.n_classes = n_classes     def text_embedding(self, class_embed):        ctx = self.v.unsqueeze(0).expand(self.n_classes, -1, -1)        cls = class_embed.unsqueeze(1)        prompt = torch.cat([ctx, cls], dim=1)        pooled = prompt.mean(dim=1)        return self.backbone.encode_text(pooled)     def forward(self, x, class_embed):        img = self.backbone.encode_image(x)        txt = self.text_embedding(class_embed)        return img @ txt.T / self.tau  def make_fewshot_data(num_classes, dim=64, shots=4):    torch.manual_seed(1)    xs, ys = [], []    for c in range(num_classes):        center = F.normalize(torch.randn(dim), dim=-1)        for _ in range(shots):            xs.append(center + 0.05 * torch.randn(dim))            ys.append(c)    return torch.stack(xs), torch.tensor(ys)  def train(dim=64, shots=4, epochs=80):    backbone = FixedBackbone(dim)    model = SoftPrompt(dim, n_prompts=8, n_classes=4, backbone=backbone)    class_embed = F.normalize(torch.randn(4, dim), dim=-1)    x, y = make_fewshot_data(4, dim, shots)    opt = torch.optim.Adam([model.v], lr=2e-2)    for _ in range(epochs):        opt.zero_grad()        logits = model.forward(x, class_embed)        loss = F.cross_entropy(logits, y)        loss.backward()        opt.step()    return model, class_embed  if __name__ == "__main__":    model, class_embed = train()    with torch.no_grad():        x, y = make_fewshot_data(4, 64, 4)        logits = model.forward(x, class_embed)        acc = (logits.argmax(1) == y).float().mean().item()    print("CoOp-style prompt acc on few-shot subset:", round(acc, 4))
目的:用可学习提示向量训练一个简化版 CoOp,验证冻结 CLIP 主干时只优化提示也能记住少样本类别。
  1. self.v = torch.nn.Parameter(torch.randn(n_prompts, dim) * 0.1)创建一组可学习的连续提示向量,它们不是真实单词。
  2. ctx = self.v.unsqueeze(0).expand(self.n_classes, -1, -1)把同一组提示向量复制给每个类别,体现 CoOp 的“共享便利贴”思想。
  3. prompt = torch.cat([ctx, cls], dim=1)将提示向量和类别向量拼接,构成输入文本编码器的完整序列。
  4. img = self.backbone.encode_image(x)模拟冻结的图像塔,始终不更新参数。
  5. opt = torch.optim.Adam([model.v], lr=2e-2)只优化提示向量,不优化主干,这正是 Prompt Learning 的轻量之处。
  6. loss = F.cross_entropy(logits, y)用少数标注样本的交叉熵把提示向量调整到适合当前任务的方向。

常见误区

误区很多人以为 Prompt Learning 就是像用 ChatGPT 一样,多试几种英文模板,看哪个 prompt 字符串效果好。

正解Prompt Learning 学的是连续向量,不是离散文本。等于便利贴上的内容不是用笔写死的字,而是可以被梯度一点点打磨的“调料配方”,肉眼不一定能翻译成一句通顺的话。

为何常见:因为“提示”这个词和 Prompt Engineering 太像,初学者容易把基于文本的 prompt 工程与面向参数的 prompt tuning 混为一谈。

误区既然全量微调动用了全部参数,那它的拟合能力更强,效果应该永远更好。

正解少样本场景下全量微调很容易过拟合,还会破坏 CLIP 预训练学到的图文对齐能力,也就是灾难性遗忘。提示学习因为只调整几十到几百个参数,反而保留了大模型强大的先验知识。

为何常见:“参数越多越强”的直觉在数据充足时成立,但小数据下它会失效,于是新手容易在公开 benchmark 上被反直觉结果震惊。

误区看到 CoCoOp 在“基类到新类”的泛化实验里超过 CoOp,就觉得 CoCoOp 是升级版,所有任务都应该用它。

正解CoCoOp 需要额外的 Meta-Net,训练和推理开销都更高。如果测试分布和训练分布一致,CoOp 的固定提示往往更省事,甚至效果更好。

为何常见:论文里通常强调新类泛化这一亮点,读者容易忽略其计算代价和适用前提。

误区提示向量数量 M 越大,能表达的信息越多,准确率应该单调上升。

正解M 本质是模型容量。太短表达力不足,太长会引入冗余甚至过拟合,而且推理时文本侧计算量变大。通常 4 到 16 个 token 就能覆盖大多数任务。

为何常见:人们习惯性认为“更大的输入窗口、更多的 token”意味着更强,但提示学习的目标是在保持通用性的同时做轻量适配,不是无限加容量。

面试题

Q1. CLIP 在大规模预训练时核心学习目标是什么?

单选题 · easy

  • A.用文本重建图像
  • B.对齐图文特征空间← 正确答案
  • C.把图像压缩到低维
  • D.让文本自动生成图像

答案:B。CLIP 用对比学习把配对图片和文本在共享向量空间里拉近,把不配对的推远。它不是重建图像,也不是生成图像,而是学习图文之间的对齐关系。这和“大厨看到菜名能联想到照片”是同一个道理。

Q2. 使用 CLIP 做零样本图片分类时,类别文本通常如何构造?

单选题 · easy

  • A.随机初始化直接比较
  • B.使用类似“一张{类别}的照片”的模板← 正确答案
  • C.只使用类别的英文字母缩写
  • D.必须为每个类别单独训练分类头

答案:B。零样本分类需要把类别名包装成自然语言模板,才能与训练时的文本分布对齐。随机字符串或缩写会偏离 CLIP 学到的语言习惯,导致相似度计算失效。

Q3. 在 Prompt Learning 中,可学习参数通常放在哪里?

单选题 · easy

  • A.视觉编码器后半部分
  • B.文本输入的上下文向量← 正确答案
  • C.最后的线性分类头
  • D.所有 Transformer 层

答案:B。Prompt Learning 在文本侧插入可学习的上下文向量,这些向量和类别词一起送入冻结的文本编码器。它与线性分类头无关,也不更新视觉编码器。

Q4. 与全量微调相比,CoOp 在少样本场景下的主要优势是什么?

单选题 · mid

  • A.准确率在任何数据集上都更高
  • B.可学习参数少,能降低过拟合和遗忘← 正确答案
  • C.完全不需要任何训练数据
  • D.一定可以加速所有推理任务

答案:B。CoOp 只更新提示向量,参数规模远小于骨干网络,在 K-shot 数据上不容易过拟合,也不容易破坏 CLIP 原有的通用知识。它仍然需要少量训练数据,推理速度也不一定更快。

Q5. CoCoOp 的核心改进是什么?

单选题 · mid

  • A.使用更长的固定提示向量
  • B.每张图片生成专属提示向量← 正确答案
  • C.替换更大的视觉主干网络
  • D.放弃文本分支只保留视觉分支

答案:B。CoCoOp 用 Meta-Net 根据图片特征动态生成提示向量,让便利贴内容随输入变化。它并没有放大视觉模型,也没有抛弃文本分支。

Q6. 在 few-shot 设置下对 CLIP 做全量微调,最容易出现什么问题?

单选题 · hard

  • A.梯度无法反向传播
  • B.过拟合且容易灾难性遗忘← 正确答案
  • C.模型收敛速度必然变慢
  • D.每类只能使用一张图片

答案:B。全量微调参数量极大,少量样本不足以约束所有参数,模型会记住训练集细节,同时覆盖预训练学到的图文对齐知识。few-shot 中的“样本少”并没有限制反向传播。

Q7. 评估 CLIP 下游适配效果时,为什么“基类/新类划分”值得关注?

单选题 · hard

  • A.可以考察模型的零样本泛化能力← 正确答案
  • B.可以减少训练集的总大小
  • C.可以消除图像分辨率的影响
  • D.可以提高文本模板的数量

答案:A。基类用于训练提示,新类在训练时完全没出现过。如果模型只记住基类而无法泛化,说明适配方案过拟合;这种划分能反映 CoOp 和 CoCoOp 在实际开放场景中的差异。

Q8. 下列哪些属于 Prompt Learning 的常见做法?

多选题 · mid

  • A.冻结两个编码器← 正确答案
  • B.在文本侧插入可学习向量← 正确答案
  • C.全量更新文本编码器
  • D.用下游任务损失优化提示← 正确答案

答案:ABD。Prompt Learning 的典型范式是冻结 CLIP 双塔,只训练文本侧的提示向量并用分类损失优化。C 选项属于全量微调文本编码器,不符合“轻量提示学习”的设定。

Q9. 关于 CLIP 微调策略,下列说法正确的有哪些?

多选题 · mid

  • A.线性探测冻结编码器← 正确答案
  • B.全量微调更新大量参数← 正确答案
  • C.部分微调只训练提示
  • D.CoOp 只优化提示向量← 正确答案

答案:ABD。线性探测只训练新增的分类头;全量微调更新骨干网络;CoOp 只优化提示向量。部分微调通常指更新最后若干层,而不是只训练提示,因此 C 不正确。

Q10. 关于 CoCoOp 相比 CoOp 的区别,正确的有哪些?

多选题 · hard

  • A.提示由实例特征生成← 正确答案
  • B.对基类新类泛化更好← 正确答案
  • C.训练速度必然更快
  • D.单次推理计算开销更高← 正确答案

答案:ABD。CoCoOp 用 Meta-Net 根据图片特征生成提示,因此提示是实例相关的,新类泛化更好;但多了一次 Meta-Net 的前向计算,训练和推理通常更慢,所以 C 不成立。