【视觉提示词优化】ProAPO提升分类准确率
高效优化提示词,提升视觉模型分类准确率
这篇论文介绍了视觉模型中,分类提示词的优化思路,比较值得学习。这篇文章为了节约效率,采取了一些操作。
大体意思就是,假设需要区分越野车和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 分两个阶段优化提示词:
- 任务级模板优化(Task-specific Template Optimization),这是第一步,逐步优化,找到描述整体类别的最优提示词。在这个阶段,不直接对每个类别的具体描述,例如针对suv,只会给出“这是一台suv汽车”
- 类别级描述优化(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; ornithologyFLO flower; floral; botanicalESAT satellite photo; land cover -
如何融入模板?(Appendix A.1)
对基础模板"a photo of a {class}.",通过4种方式注入领域信息:"a photo of a {class}, a type of {domain}.""a photo of a {domain}: {class}.""a {domain} of a {class}.""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∗)。
迭代流程(每轮):
-
生成候选(Algorithm 2, Line 5 & 9):
- 编辑操作(Algorithm 3):对当前模板 ( P ),从 ( B_t ) 中:
- Add:添加新模板元素(如加入
"in the wild") - Delete:删除冗余部分
- Replace:替换为库中其他模板
- Add:添加新模板元素(如加入
- 进化操作(Algorithm 4):
- Crossover:合并两个高分模板(如
P₁ ∪ P₂) - Mutation:随机加入库中元素,避免局部最优
- Crossover:合并两个高分模板(如
- 编辑操作(Algorithm 3):对当前模板 ( P ),从 ( B_t ) 中:
-
评估候选(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)[−logs(x,y)])( H = \mathbb{E}_{(x,y)}[-\log s(x, y)] )(H=E(x,y)[−logs(x,y)])
- 作用:防止过拟合(见 Fig.1©)
-
更新候选集(Algorithm 2, Line 8 & 11):
保留 top-k 高分模板,作为下一轮生成基础。
迭代终止:
- 固定迭代次数 ( T )(默认 ( T=4 ),见 Sec 4.5)
- 返回最高分模板:(Pt∗=argmaxP∈UtF(D,P))( P_t^* = \arg\max_{P \in U_t} F(D, P) )(Pt∗=argmaxP∈UtF(D,P))(Algorithm 1 第4行)
3.2 类别级描述优化
CLIP 等 VLM 在细粒度任务(如区分 Laysan Albatross 与 Sooty Albatross)中失败,往往不是因为模板不够好,而是因为类名本身缺乏视觉细节。即使使用 LLM 生成描述(如 CuPL、DCLIP),也存在三大问题(见原文 Fig.1(a)):
- 不准确(inaccurate):如为“北京烤鸭”生成“有脚”(feet);
- 缺乏区分性(lack discrimination):两个不同鸟类都描述为“长而带钩的喙”、“蹼足”;
- 非视觉性(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的流程如下:
- 初始化类别提示 (P^0)( \hat{P}_0 )(P^0):基于 (Pt∗)( P_t^* )(Pt∗) + LLM 生成的视觉描述;
- 分组采样(Group Sampling):仅选择部分“关键类别”进行优化;
- 构建描述库 ( B_s ):为每个选中类别组生成描述候选;
- 调用 APO 进行迭代优化(Algorithm 2);
- 输出最终提示 (P∗=argmaxP∈UcF(D,P))( P^* = \arg\max_{P \in U_c} F(D, P) )(P∗=argmaxP∈UcF(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”
- Laysan Albatross:
注意:这些描述包含共性(如“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)))(c′∈MISCLASS(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,Pt∗∪VD(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=⋃c∈sVD(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[−logs(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∗=argmaxP∈UcF(D,P))(P^* = \arg\max_{P \in U_c} F(D, P))(P∗=argmaxP∈UcF(D,P))。
论文在 Fig.6 给出了优化前后描述对比,清晰展示了 ProAPO 如何提升细粒度区分性。
优化前(LLM 生成):
- Laysan Albatross 和 Sooty 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 Albatross 和 Sooty 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)。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)