这篇论文介绍了视觉模型中,分类提示词的优化思路,比较值得学习。这篇文章为了节约效率,采取了一些操作。

大体意思就是,假设需要区分越野车和suv,你可以让答模型给出一些候选的关键词,然后通过模拟生物进化的方式,剔除掉不合适的关键词(比如“很高大的车”,越野车和suv都符合,所以这个关键词没有区分度),最终提升分类准确率。整个优化过程一定要在多分类的环境下进行,这样才能找到多个分类中最实用的提示词。

ProAPO: Progressively Automatic Prompt Optimization for Visual Classification》提出了一种无需人工干预、仅需单样本监督(one-shot)的自动提示词优化方法,用于提升视觉-语言模型(VLMs,如 CLIP)在细粒度图像分类任务中的性能。其核心思想是:通过进化算法,从任务级模板逐步优化到类别级描述,自动搜索具有视觉区分性的自然语言提示词


一、问题动机:为什么需要优化提示词?

CLIP 等 VLM 通过计算图像与文本提示(prompt)之间的相似度进行分类。其性能高度依赖提示词质量。然而:

  • 人工模板(如 “a photo of a {class}”)缺乏细粒度细节;
  • LLM 生成的描述虽丰富,但存在三大问题(见原文 Fig.1(a)):
    • 不准确(inaccurate):如将“北京烤鸭”描述为“有脚”(feet);
    • 缺乏区分性(lack discrimination):如对“Laysan Albatross”和“Sooty Albatross”都生成“长而带钩的喙”和“蹼足”;
    • 非视觉性(non-visual):如用“强烈气味”描述“菠萝蜜”。

原文指出:“Due to the hallucination in LLMs, generated descriptions are suboptimal due to inaccurate… or lack discrimination for fine-grained recognition.”(第1页)

因此,论文目标是:在最小监督(one-shot)且无人工干预下,自动找到对细粒度类别具有视觉区分性的提示词

二、整体流程

ProAPO 分两个阶段优化提示词:

  1. 任务级模板优化(Task-specific Template Optimization),这是第一步,逐步优化,找到描述整体类别的最优提示词。在这个阶段,不直接对每个类别的具体描述,例如针对suv,只会给出“这是一台suv汽车”
  2. 类别级描述优化(Class-specific Description Optimization),在这个阶段,开始寻找每个类别的具体描述,例如suv下面增加“四个轮子”,“车身比较高”等细节。

三、细节详解

3.1 任务级模板优化

在视觉-语言模型(如 CLIP)中,分类依赖于图像与文本提示(prompt)之间的相似度。初始模板如:

P₀ = “a photo of a {class}.”

虽然通用,但缺乏任务上下文,尤其在细粒度任务中(如区分不同鸟类),仅靠类名 {class} 无法提供足够视觉区分性。

因此,阶段1的目标是:

在仅使用 one-shot 标注样本无人工干预 的前提下,自动搜索一个任务级(task-specific)最优模板 ( P_t^* ),为后续类别级描述优化提供良好起点。


Step 1:初始模板设定(Initialization)

  • 公式/算法依据:Algorithm 1 第1行:Ut ← {P₀}

  • 原文描述(Sec 3.1):

    “Similar to PN[39], we use ‘a photo of a {class}.’ filling with class names in the dataset as P₀.”

  • 示例(CUB 鸟类数据集):

    • 类别:Laysan Albatross
    • 初始提示:"a photo of a Laysan Albatross."

该模板作为优化起点,进入后续迭代。


Step 2:构建模板库 ( B_t )(Template Library Construction)

这是 ProAPO 降低成本的核心设计:仅一次性调用 LLM,后续通过编辑/进化操作生成新候选,避免每轮都调用昂贵的 LLM。

(1)来源1:预定义模板

  • 如 CLIP 官方提供的 Template-80(80种人工模板)
  • 示例(来自 Template-80):
    • "a close-up photo of a {class}"
    • "a sculpture of a {class}"

(2)来源2:LLM 生成的多样化模板

  • 调用方式(Appendix A.1):

    Prompt to LLM:
    “Hi, ChatGPT! I would like your help to prompt for image classification using CLIP… create a set of Templates like: a photo of a{}.”

  • 生成结果示例(虚构但符合论文逻辑):

    • "an image depicting a {class}"
    • "this is a picture of a {class} in the wild"

(3)来源3:加入数据集领域信息**(Domain-aware Augmentation)**

这是 ProAPO 的关键创新之一。论文指出,仅靠类名易产生语义歧义,需引入任务上下文(如“bird”、“flower”)。

  • 如何生成领域信息
    通过上传数据集论文 PDF 给 LLM,询问:

    “Please return dataset domain information… A few words are good.”

  • 结果见 Table 5(部分摘录):

    数据集 领域信息
    CUB bird; wildlife; ornithology
    FLO flower; floral; botanical
    ESAT satellite photo; land cover
  • 如何融入模板?(Appendix A.1)
    对基础模板 "a photo of a {class}.",通过4种方式注入领域信息:

    1. "a photo of a {class}, a type of {domain}."
    2. "a photo of a {domain}: {class}."
    3. "a {domain} of a {class}."
    4. "a {domain} photo of a {class}."
  • 具体示例(CUB + domain = “bird”):

    • "a photo of a Laysan Albatross, a type of bird."
    • "a bird photo of a Laysan Albatross."

原文强调(Sec 3.1):
“We also supplement templates with dataset domain information generated by LLMs, such as ‘flower’ for FLO and ‘bird’ for CUB.”

最终,所有上述模板构成**模板库 (Bt)(B_t)(Bt) **(Algorithm 1 第2行)。


Step 3:使用 APO 进行迭代优化(Automatic Prompt Optimization)

APO(Algorithm 2)是一个进化式优化框架,在模板空间中搜索最优(Pt∗)( P_t^* )(Pt)

迭代流程(每轮):

  1. 生成候选(Algorithm 2, Line 5 & 9):

    • 编辑操作(Algorithm 3):对当前模板 ( P ),从 ( B_t ) 中:
      • Add:添加新模板元素(如加入 "in the wild"
      • Delete:删除冗余部分
      • Replace:替换为库中其他模板
    • 进化操作(Algorithm 4):
      • Crossover:合并两个高分模板(如 P₁ ∪ P₂
      • Mutation:随机加入库中元素,避免局部最优
  2. 评估候选(Algorithm 2, Line 7 & 10):
    使用带熵约束的适应度函数(公式6):
    F(D,P)=Acc+αHF(D, P) = \text{Acc} + \alpha HF(D,P)=Acc+αH
    其中:

    • Acc(公式4):one-shot 训练集上的分类准确率
    • H(公式5):负对数似然熵项,(H=E(x,y)[−log⁡s(x,y)])( H = \mathbb{E}_{(x,y)}[-\log s(x, y)] )(H=E(x,y)[logs(x,y)])
    • 作用:防止过拟合(见 Fig.1©)
  3. 更新候选集(Algorithm 2, Line 8 & 11):
    保留 top-k 高分模板,作为下一轮生成基础。

迭代终止:

  • 固定迭代次数 ( T )(默认 ( T=4 ),见 Sec 4.5)
  • 返回最高分模板:(Pt∗=arg⁡max⁡P∈UtF(D,P))( P_t^* = \arg\max_{P \in U_t} F(D, P) )(Pt=argmaxPUtF(D,P))(Algorithm 1 第4行)

3.2 类别级描述优化

CLIP 等 VLM 在细粒度任务(如区分 Laysan Albatross 与 Sooty Albatross)中失败,往往不是因为模板不够好,而是因为类名本身缺乏视觉细节。即使使用 LLM 生成描述(如 CuPL、DCLIP),也存在三大问题(见原文 Fig.1(a)):

  1. 不准确(inaccurate):如为“北京烤鸭”生成“有脚”(feet);
  2. 缺乏区分性(lack discrimination):两个不同鸟类都描述为“长而带钩的喙”、“蹼足”;
  3. 非视觉性(non-visual):如用“强烈气味”描述“菠萝蜜”。

原文指出:“Generated descriptions are suboptimal due to inaccurate… or lack discrimination for fine-grained recognition.”(Sec 1)

因此,阶段2的目标是:

在任务级模板 ( P_t^* ) 的基础上,自动优化每个类别的视觉描述去除共性冗余保留判别性细节,从而提升细粒度分类能力。


3.2.1 整体流程(Algorithm 1, Lines 5–11)

阶段2的流程如下:

  1. 初始化类别提示 (P^0)( \hat{P}_0 )(P^0):基于 (Pt∗)( P_t^* )(Pt) + LLM 生成的视觉描述;
  2. 分组采样(Group Sampling):仅选择部分“关键类别”进行优化;
  3. 构建描述库 ( B_s ):为每个选中类别组生成描述候选;
  4. 调用 APO 进行迭代优化(Algorithm 2);
  5. 输出最终提示 (P∗=arg⁡max⁡P∈UcF(D,P))( P^* = \arg\max_{P \in U_c} F(D, P) )(P=argmaxPUcF(D,P))

关键在于:不优化全部类别,而是通过智能采样策略聚焦最有潜力的子集,大幅降低计算成本。


3.2.2 关键技术详解

Step 1:构建初始类别提示 (P^0)( \hat{P}_0 )(P^0)(Prompt Sampling Strategy)

(1)来源:LLM 生成的视觉描述

  • 使用标准提示(见 Appendix A.2, Table 6),如 CuPL 的:

    “Describe what a {class} looks like.”

  • 示例(CUB 数据集):

    • Laysan Albatross
      • “white with black wings”
      • “a long, hooked bill”
      • “flight over the ocean”
    • Sooty Albatross
      • “large, dark-colored bird”
      • “white band around its neck”
      • “long, hooked bill”

注意:这些描述包含共性(如“long, hooked bill”)和特性(如“white with black wings” vs “dark-colored”)。

(2)增强多样性:引入类别同义词****

  • 为避免类名语义单一,论文还让 LLM 生成类别同义词(Appendix A.2):

    “Provide synonyms for the current category. If it has subclasses, return them as well.”

  • 示例:“Laysan Albatross” → “Moli”(夏威夷俗名)

(3)Prompt Sampling:随机组合,选最优起点

  • 算法(Algorithm 5):
    • 对每个类别,从其描述集合 ( VD© ) 中随机采样多个子集;
    • (Pt∗)( P_t^* )(Pt) 拼接,形成多个候选提示 ( P_i );
    • 评估每个 ( P_i ) 的适应度 ( F(D, P_i) );
    • 选择得分最高者作为 (P^0)( \hat{P}_0 )(P^0)

原文(Appendix B):“It ensures that subsequent optimization is around candidates with relatively high scores.”


Step 2:分组采样策略(Group Sampling Strategy, Algorithm 6)

在 ProAPO 的阶段2中,目标是对类别级视觉描述进行优化,以提升细粒度分类性能。然而,若对全部类别同时优化,提示组合数量将呈指数级增长(见 Fig.1(b)),导致计算成本不可接受。

为此,ProAPO 引入分组采样策略(Algorithm 6),仅选择一小部分关键类别子集进行优化。这些子集以“组”(group)为单位组织,每组包含一个目标类别及其在 one-shot 验证中被混淆的类别

什么是 one-shot?
在本文设定中,每个类别仅提供一个标注样本(即训练集 (D = {(x_i, y_i)}_{i=1}^{|C|}),(|C|) 为类别总数)。该样本不用于模型训练(ProAPO 是 training-free 的),仅用于评估候选提示的质量(即计算适应度分数 (F(D, P)))。

提示词是否用于多类别分类?
是的。ProAPO 优化的是一个完整的类别级提示集合 (P),其中每个类别 (c) 都有对应的自然语言描述。在推理时,CLIP 会计算输入图像与所有类别提示的相似度,并选择最高者作为预测结果(公式 (2)–(3))。

采样两类关键组:

(1)最差组(Worst Groups)

  • 对每个类别 ©,使用当前最优模板 (P_t^*) 在其 one-shot 样本 (D_c) 上计算准确率 (ACC(c))(\text{ACC}(c))(ACC(c))
  • 选出 准确率最低的前 (n_{wst}) 个类别
  • 对每个此类别 ©,收集其在 one-shot 验证中被误分类到的类别(即若样本 ((x, c)) 被预测为 (c’),则 (c′∈MISCLASS(c)))(c' \in \text{MISCLASS}(c)))(cMISCLASS(c))
  • 构成组:(s={c}∪MISCLASS(c))(s = \{c\} \cup \text{MISCLASS}(c))(s={c}MISCLASS(c))
  • 目的:优先修复模型最容易出错的细粒度混淆对。

(2)显著组(Salient Groups)

  • 对每个类别 ©,计算加入 LLM 生成描述 (VD©) 后的准确率增益
    [ACCGAIN(c)=F(Dc,Pt∗∪VD(c))−F(Dc,Pt∗)][ \text{ACCGAIN}(c) = F(D_c, P_t^* \cup VD(c)) - F(D_c, P_t^*)][ACCGAIN(c)=F(Dc,PtVD(c))F(Dc,Pt)]
    其中 (F) 是带熵约束的适应度函数(公式 (6));
  • 选出 增益最大的前 (nsln)(n_{sln})(nsln) 个类别
  • 同样将其与各自的 (MISCLASS(c))(\text{MISCLASS}(c))(MISCLASS(c)) 合并成组;
  • 目的:聚焦那些描述信息能带来最大性能提升的类别。

原文(Sec 3.4):“We select the groups with the lowest top-(n_{wst}) accuracy and its misclassified categories. Moreover, we also choose salient groups by the category with the top-(n_{sln}) result gains after adding descriptions.”

默认设置(Table 7):

  • (nwst=nsln=⌊log⁡(∣C∣)⌋)(n_{wst} = n_{sln} = \lfloor \log(|C|) \rfloor)(nwst=nsln=log(C)⌋)
  • 例如 CUB(200 类):(log⁡(200)≈5.3)(\log(200) \approx 5.3)(log(200)5.3),取 5 组;
  • 总共优化 (S=nwst+nsln)(S = n_{wst} + n_{sln})(S=nwst+nsln) 个组。

效果(Table 4):

  • 全类别优化:耗时 300+ 分钟
  • 分组采样优化:仅需 15 分钟,且性能不降反升(Avg(13): 64.4 → 65.0);
  • 说明:关键混淆对的局部优化足以驱动全局性能提升

Step 3:针对每个选中的组 (s) 进行描述优化

“针对每个选中的组 (s)” 是什么意思?
每个组 (s) 是一个类别集合(如 ({ \text{Laysan Albatross}, \text{Sooty Albatross} })),代表一个细粒度混淆对。ProAPO 仅对组内类别的提示进行局部优化,其余类别保持不变。

对每个组 (s),执行以下操作(Algorithm 1, Lines 7–10):

(1)构建描述库 (B_s)

  • 收集组内所有类别 (c \in s) 的 LLM 生成视觉描述集合 (VD©);
  • 这些描述在初始化阶段已通过一次性 LLM 查询获得(见 Appendix A.2);
  • (Bs=⋃c∈sVD(c))(B_s = \bigcup_{c \in s} VD(c))(Bs=csVD(c))
  • 注意:虽然“组”本身只包含类别标签,但优化时会立即加载其对应的描述信息

(2)调用 APO 进行迭代优化(Algorithm 2)

  • 使用与阶段1相同的优化框架:
    • GEN(Algorithm 3):通过 Add/Delete/Replace 操作生成新候选;
    • EVO(Algorithm 4):通过 Crossover/Mutation 提升搜索效率;
  • 评估函数仍为:
    [F(D,P)=Acc+αH][F(D, P) = \text{Acc} + \alpha H][F(D,P)=Acc+αH]
    其中熵项 (H=E(x,y)∈D[−log⁡s(x,y)])(H = \mathbb{E}_{(x,y) \in D}[-\log s(x, y)])(H=E(x,y)D[logs(x,y)]) 用于缓解 one-shot 下的过拟合(Sec 3.3);
  • 评估范围:使用完整的 one-shot 训练集 (D)(覆盖所有类别),确保优化方向与全局目标一致。

(3)更新全局提示集合 (U_c)

  • 将优化后的组内提示合并回整体提示集
  • 保留 top-k 高分候选,作为下一轮生成基础;
  • 最终输出:(P∗=arg⁡max⁡P∈UcF(D,P))(P^* = \arg\max_{P \in U_c} F(D, P))(P=argmaxPUcF(D,P))

论文在 Fig.6 给出了优化前后描述对比,清晰展示了 ProAPO 如何提升细粒度区分性。

优化前(LLM 生成):

  • Laysan AlbatrossSooty Albatross 都包含:
    • “flight over the ocean”(红色,共性)
    • “long wings and a long hooked bill”(红色,共性)

无法区分

优化后(ProAPO 保留):

  • Laysan Albatross 保留:
    • “white body and wings flecked with black”(蓝色,特性)
    • “yellow beak”(蓝色,特性)
  • Sooty Albatross 保留:
    • “dark brown or black bird”(蓝色,特性)
    • “white crescent around the eye”(蓝色,特性)

原文(Sec 4.3):“After iterative optimization, common descriptions such as ‘flight over ocean’ and ‘long wings and hooked bill’ are removed. Discriminative descriptions are also retained…”

这种自动去冗余、提判别的能力,正是 ProAPO 在 CUB、FLO、ESAT 等细粒度数据集上显著优于 CuPL(+4.8%~21%)的原因。


四、效果总结

论文在 CUB(鸟类)数据集上给出了定性分析(Fig.6),清晰展示了 ProAPO 如何提升细粒度区分性。

优化前(LLM 生成的原始描述):

  • Laysan AlbatrossSooty Albatross 都包含:
    • “在海上飞行”(flight over the ocean)
    • “长翅膀和带钩的喙”(long wings and a long hooked bill)
      缺乏区分性(红色标注)

优化后(ProAPO 保留的提示):

  • Laysan Albatross 保留:
    • “白色身体,黑色翅膀”(white body and wings flecked with black)
    • “黄色喙”(yellow beak)
  • Sooty Albatross 保留:
    • “深棕色或黑色鸟”(dark brown or black bird)
    • “眼睛周围有白色新月形斑纹”(white crescent around the eye)

原文描述:“After iterative optimization, common descriptions such as ‘flight over ocean’ and ‘long wings and hooked bill’ are removed. Discriminative descriptions are also retained…”(第8页)

这种去共性、留特性的机制,正是 ProAPO 在细粒度任务(如 CUB、FLO、ESAT)上显著优于基线的原因。

在 13 个数据集上,ProAPO 平均超越最强描述方法(如 CuPL)2.7%~3.3%

在 EuroSAT(卫星图像)上,相对 CuPL 提升 21%

优化后的提示词可跨主干网络迁移(如从 ResNet50 到 ViT-L/14),且优于连续提示方法(如 CoOp)。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐