论文泛读:DYNAPROMPT: DYNAMIC TEST-TIME PROMPT TUNING(动态测试时调优)
本文作为泛读系列,大部分为AI生成,本意是帮助自己快速阅读理解论文思想同时进行记录,不喜欢AI文章的可以快速划走,或者查看论文精读专栏系列。
这篇论文是ICLR2025的一篇文章。
论文链接:https://arxiv.org/abs/2501.16404
代码链接:https://github.com/zzzx1224/DynaPrompt
这篇文章提出了DynaPrompt(动态测试时提示调优) 算法,核心思想是解决传统测试时提示调优 “忽略测试样本关联性” 或 “在线调优误差积累导致提示崩溃” 的问题,通过动态管理提示缓冲区,自适应筛选、优化、追加提示,在利用历史测试样本信息的同时减少误差积累,提升视觉语言模型(如 CLIP)的零样本泛化能力。
一、算法解决的问题:
在 DynaPrompt 之前,测试时提示调优(TPT)存在两大痛点:
1、独立调优的局限性:
传统 TPT 为每个测试样本独立调优提示(从初始提示v₀
重新开始),完全忽略了测试样本间的关联性,浪费了历史样本包含的测试分布信息。
2、在线调优的提示崩溃:
在线 TPT 用前一个样本的优化提示初始化当前样本,虽利用了历史信息,但会因无真实标签引导的熵最小化目标积累误差,导致提示逐渐退化(“提示崩溃”),最终性能骤降(如论文图2中 Online TPT 准确率接近 0%)。
二、算法的核心思想:
DynaPrompt 的核心是一个可动态更新的提示缓冲区(Prompt Buffer),缓冲区存储历史优化后的有效提示。针对每个测试样本,算法通过 “筛选 - 优化 - 更新 - 预测” 四步实现动态调优,关键模块包括 “动态提示选择” 和 “动态提示追加”。
1、核心载体:提示缓冲区(Prompt Buffer)
- 作用:存储一组在线学习的提示(记为
Vₙ
,Mₙ
为缓冲区中提示数量,M
为缓冲区最大容量,超参数设为 10),每个提示初始化为手工设计或预训练的v₀
,并随测试样本动态更新。 - 意义:不再依赖单个历史提示(如 Online TPT),而是通过缓冲区管理多组历史提示,为 “筛选相关提示” 提供基础,从源头减少单一提示的误差传递。
2、关键步骤 1:动态提示选择(筛选相关提示,避免崩溃)
针对当前测试样本xₙ
,从缓冲区Vₙ
中筛选 “既对当前样本有信心、又不过度自信” 的提示,核心是双指标筛选(预测熵 + 概率差),最终取两者的交集作为选中提示集Sₙ。
筛选指标 | 计算逻辑 | 筛选规则 | 目的 |
---|---|---|---|
预测熵(Entropy) | 基于提示vᵢ 对xₙ 及其增强样本的平均预测概率,计算熵D_ent(xₙ, vᵢ) | 选择D_ent(xₙ, vᵢ) ≤ D_ent(xₙ, v₀) (比初始提示v₀ 熵更低) | 熵越低,提示对当前样本的预测不确定性越小,包含更多相关分布信息 |
概率差(Probability Difference) | 计算提示vᵢ 对 “原始xₙ ” 与 “增强xₙ ” 的预测概率差D_pro(xₙ, vᵢ) | 选择D_pro(xₙ, vᵢ) ≥ D_pro(xₙ, v₀) (比初始提示v₀ 差更大) | 差越大,提示对输入结构变化越敏感,避免 “过度自信”(如错误预测却低熵) |
- 筛选逻辑:选中的提示集
Sₙ = Eₙ ∩ Rₙ
(Eₙ
为熵筛选子集,Rₙ
为概率差筛选子集)。 - 优势:既保证选中的提示与当前样本相关(低熵),又避免其因过度自信导致崩溃(高概率差),同时冻结不相关提示,避免冲突优化方向,减少误差积累。
3、关键步骤 2:动态提示追加(应对无合适提示,适应新分布)
当缓冲区中无符合条件的提示(Sₙ = ∅
)时,触发动态追加机制:
- 追加初始提示:将初始提示
v₀
加入Sₙ
(即Sₙ = {v₀}
),避免被迫使用不相关 / 崩溃的历史提示。 - 缓冲区容量控制:若追加后缓冲区满(
Mₙ = M
),删除最不活跃的提示(缓冲区中最底部、最长时间未被选中的提示),平衡内存开销与信息有效性。
- 意义:解决 “新分布样本无匹配历史提示” 的问题,让算法能自适应未知测试分布,同时防止缓冲区无限膨胀。
4. 优化与预测(基于选中提示,提升精度)
- 提示优化:对选中的
Sₙ
,通过 “熵最小化” 目标优化(与传统 TPT 一致),更新为Ṡₙ
,公式为:L_ent(Sₙ; xₙ) = -Σp(ŷ=c|Xₙ, Sₙ)log p(ŷ=c|Xₙ, Sₙ)
(Xₙ
为xₙ
的增强样本集,优化后提示Ṡₙ = Sₙ - α∇L_ent
,α
为学习率) - 样本预测:用更新后的
Ṡₙ
计算xₙ
的预测概率,取概率最大的类别作为结果(argmax_c p(ŷ=c|xₙ, Ṡₙ)
)。
5. 缓冲区更新(维持有效提示池)
优化后的Ṡₙ
会更新到缓冲区Vₙ
,形成闭环:
-
若
Sₙ
是追加的v₀
(即Eₙ ∩ Rₙ = ∅
):将Ṡₙ
追加到缓冲区顶部,若满则删除最底部不活跃提示。 -
若
Sₙ
是筛选出的历史提示:将Ṡₙ
追加到顶部,同时从缓冲区中移除原Sₙ
(避免重复存储)。 -
目的:让缓冲区持续保留 “最新优化、与当前分布相关” 的提示,为后续样本提供高质量历史信息。
三、算法整体流程(简化)
- 输入:测试样本序列
{xₙ}
、初始空缓冲区V₀
、初始提示v₀
、缓冲区最大容量M
。 - 对每个测试样本
xₙ
:a. 生成xₙ
的增强样本集Xₙ
;b. 计算缓冲区中所有提示与xₙ
的 “预测熵” 和 “概率差”,筛选出Sₙ
;c. 若Sₙ
为空,追加v₀
到Sₙ
;d. 优化Sₙ
得到Ṡₙ
;e. 用Ṡₙ
预测xₙ
;f. 更新缓冲区Vₙ
为Vₙ₊₁
(加入Ṡₙ
,删除冗余 / 不活跃提示); - 输出所有
xₙ
的预测结果。
四、算法思想的核心亮点
-
自适应利用历史信息:不再 “盲目依赖前一个样本提示”(Online TPT),而是通过双指标筛选 “相关且安全” 的历史提示,最大化历史信息价值。
-
从根源减少误差积累:冻结不相关提示,避免冲突优化;无合适提示时用
v₀
重启,切断误差传递链,解决 “提示崩溃”。 -
动态适应新分布:通过提示追加和不活跃删除,让缓冲区随测试分布变化更新,提升对未知分布的泛化能力。