CoCoOp: Conditional Prompt Learning for Vision-Language Models

Kaiyang Zhou Jingkang Yang Chen Change Loy Ziwei Liu

S-Lab, Nanyang Technological University, Singapore

摘要

​  随着CLIP等强大预训练视觉语言模型的兴起,研究如何将这些模型适配到下游数据集变得至关重要。最近提出的一种名为上下文优化(CoOp)的方法,将自然语言处理领域的新趋势——提示学习引入到视觉领域,用于适配预训练的视觉语言模型。具体来说,CoOp技术通过将提示中的上下文词汇转化为可学习的向量集合,并仅需少量标注图像即可实现显著提升,这比人工调优的密集式提示效果更为突出。在我们的研究中发现CoOp存在一个关键缺陷:所学上下文无法泛化到同一数据集内的更广泛未见类别,这表明CoOp在训练过程中过度拟合了基础类别的特征。为解决这一问题,我们提出条件上下文优化(CoCoOp)方案。该方案通过引入轻量级神经网络,为每张图像生成输入条件标记(向量),从而扩展了CoOp的功能。与CoOp的静态提示不同,我们的动态提示能根据具体实例进行自适应调整,因此对类别偏移具有更强的鲁棒性。大量实验表明,CoCoOp在处理未知类别时展现出远超CoOp的泛化能力,不仅在单一数据集上表现出色,更在跨领域迁移性能上更具优势。代码可在https://github.com/ KaiyangZhou/CoOp处获得。

image-20250721215909226

3方法

​  图2展示了我们方法的总体框架。首先,我们将简要回顾本文使用的基础模型CLIP [40]和协作模型CoOp [63]。随后,我们将详细阐述本研究的技术细节及其设计原理。与协作模型类似,我们的方法同样适用于更广泛的CLIP类视觉语言模型。

3.1.对CLIP和CoOp的回顾

​  对比语言图像预训练
​  对比语言-图像预训练模型CLIP [41]已充分展现了学习开放集视觉概念的潜力。如图2所示,该模型采用双编码器架构:图像编码器可选用ResNet [18]或ViT [9]进行特征提取,将图像转化为特征向量;文本编码器则采用Transformer [48],通过词元序列输入生成向量化表征。
​  在训练过程中,CLIP采用对比损失函数来学习两种模态的联合嵌入空间。具体而言,对于图像-文本对的小批量数据,CLIP会针对每个图像最大化其与匹配文本的余弦相似度,同时最小化与其他未匹配文本的余弦相似度,而每个文本的损失计算方式也与此类似。完成训练后,CLIP即可用于零样本图像识别任务。设x为图像编码器生成的图像特征,{wi} K i=1为文本编码器产生的权重向量集合(假设总共有K个类别)。特别地,每个wi都是根据提示词生成的,例如“一张{class}的照片”,其中“{class}”标记由第i个类别名称填充。随后预测概率将通过以下公式计算: \[p(y|x)={\frac{\exp(\sinh(x,w_{y})/\tau)}{\sum_{i=1}^{K}\exp(\sin(x,w_{i})/\tau)}},\] ​  其中sim(.,.)表示余弦相似度,τ是学习得到的温度参数。

​  上下文优化(CoOp)
​  上下文优化(CoOp)旨在解决提示工程中的效率问题,使预训练的视觉-语言模型能更好地适配下游应用[63]。其核心思想是通过端到端学习从数据中提取连续向量来建模每个上下文标记。具体而言,CoOp不采用“一张照片”作为上下文,而是引入M个可学习的上下文向量{v1,v2,...,vM},这些向量与词嵌入具有相同维度。第i类的提示词ti现在表示为ti = {v1,v2,...,vM,ci},其中ci是类别名称的词嵌入(s)。所有类别共享这些上下文向量。(CoOp有一个学习特定类上下文的替代版本,这里没有考虑它,因为将特定类上下文转移到未见过的类别并不简单。)设g(·)表示文本编码器,预测概率则为 \[p(y|x)=\frac{\exp(\mathrm{sim}(x,g(t_{y}))/\tau)}{\sum_{i=1}^{K}\exp(\mathrm{sim}(x,g(t_{i}))/\tau)}.\] ​  为了将CLIP模型适配到下游图像识别数据集,可以采用交叉熵损失作为学习目标函数。由于文本编码器g(·)具有可微性,梯度可以完整回传以更新上下文向量。需要特别说明的是,在整个训练过程中,CLIP的基础模型(包括我们提出的模型)始终保持冻结状态。

3.2. CoCoOp:条件上下文优化

​  CoOp是一种数据高效方法,仅需少量标注图像即可训练上下文向量。但正如讨论所示,该方法无法将泛化能力扩展到同一任务中的更广泛未见过类别。我们认为,实例条件上下文具有更好的泛化能力,因为它将关注点从特定类别集合——即减少过拟合——转移到每个输入实例上,从而适用于整个任务。
​  实现CoCoOp的直接方法是构建M个神经网络来获取M个上下文标记。但这种设计需要M×个神经网络单元,其规模远超CoOp中仅需M个上下文向量的架构。为此我们提出了一种参数效率更高的设计方案,该方案在实际应用中表现优异。具体而言,在M个上下文向量基础上,我们进一步学习了一个轻量级神经网络(称为Meta-Net),用于为每个输入生成条件标记(向量),随后将其与上下文向量结合。图2展示了该架构的示意图。

image-20250721215909226

​  令\(h_{\theta}(\cdot)\)表示由参数θ参数化的Meta-Net,此时每个上下文标记通过\(v_{m}(x)=v_{m}+\pi\)获得,其中\(\pi=h_{\theta}(x)\)\(m\in\{1,2,...,M\}\)。第i类的提示词ti(x)即根据输入条件生成,具体形式为\(t_{i}(x)=\{v_{1}(x),v_{2}(x),\cdot\cdot\cdot,v_{M}(x),c_{i}\}\)。预测概率的计算方式如下: \[p(y|\alpha)=\frac{\exp(\mathrm{sim}(x,g(t_{y}(x)))/\tau)}{\sum_{i=1}\exp(\mathrm{sim}(x,g(t_{i}(x)))/\tau)}.\] ​  在训练过程中,我们会同步更新上下文向量\(\{v_{m}\}_{m=1}^{M}\)和Meta-Net的参数θ。本研究采用双层瓶颈结构(线性-ReLU-线性)构建Meta-Net,其中隐藏层将输入维度缩减16×倍。Meta-Net的输入直接取自图像编码器生成的特征输出,至于更复杂的设计方案,我们将在后续研究中继续探索。