目录
3.1 Generalization From Base to New Classes
CoOp:
1.背景
对于预训练的V-L模型,文本输入(即prompt)在下游数据集中起着关键作用。然而,确定正确的提示是一项困难的任务,通常需要花大量的时间进行单词调优——措辞上的细微变化可能会对性能产生巨大的影响(如图1)。
受NLP领域中的prompt learning研究的启发,本文提出了Context Optimization(CoOp),具体来说,就是固定整个预训练模型(CLIP)的参数,然后对text encoder中的提示词进行学习,实现自动地对提示模板寻优,从而实现更加高效和任务相关的迁移学习。
2.本文的贡献
1.我们对最近提出的视觉语言模型在下游应用程序中的适应性进行了及时的研究,并确定了与部署效率相关的关键问题,即提示工程。
2.为了实现针对预先训练的视觉语言模型的提示工程自动化,我们提出了一种基于持续提示学习的简单方法,并提供了两种可以处理不同识别任务的实现。
3.我们首次表明,对于大型视觉语言模型,所提出的基于提示学习的方法在域移位下的下游迁移学习性能和鲁棒性方面优于手工提示和线性探测模型。
4.开源了代码 https://github. com/KaiyangZhou/CoOp.
我们希望这些发现和开源代码可以启发和促进未来对大型视觉语言模型的有效适应方法的研究,这是一个与基金会模型民主化相关的新兴主题(Bommasani等人,2021),即使它们更容易、更便宜地适应更广泛的社区。
3.方法
本文提出了CoOp模型,在介绍CoOp之前,回顾一下CLIP模型在下游任务上的zero-shot prediction。zero-shot预测中,text-encoder输入的text是固定的(手工提示),如“a photo of a {object}.”。
本文的方法:
提出了上下文优化(CoOp),主要思想是使用一组可学习向量对提示的上下文进行建模来避免手动提示调整,这些连续向量是在冻结大量预训练参数的同时从数据中端到端学习的。图2显示了一个概述。
下面我们提供了几种不同的实现:
1.Unified Context,统一上下文,所有类共享相同的上下文向量:
其中每个[V]m (m∈{1,…, M})是与word embeddings具有相同维度的向量(例如,CLIP为512),M是指定上下文令牌数量的超参数。通过将提示t转发给文本编码器g(·),我们可以获得代表视觉概念的分类权重向量(仍然来自[EOS]令牌位置)。预测概率计算为:
还可以把[Class]放中间位置,增加了学习的灵活性——提示符可以用补充的描述填充后面的单元格,也可以通过使用终止信号(如句号)提前切断句子。:
2.Class-Specific Context,类-特定上下文,为每个类学习一组特定的上下文向量。
训练:
基于交叉熵来最小化标准分类损失,并且梯度可以通过文本编码器g(·)一直反向传播,利用参数中编码的丰富知识来优化上下文。连续表示的设计还允许在单词嵌入空间中进行充分的探索,这有助于学习任务相关的上下文。
4.实验
4.1Few-shot learning
数据集:选择了11个用于CLIP的公开可用的图像分类数据集。这些数据集涵盖了一系列不同的视觉任务,包括对通用对象、场景、动作和细粒度类别的分类,以及识别纹理和卫星图像等专门任务。
分别使用1,2,4,8,16shots训练,上下文标记都设置为16,然后在完整的测试集中部署模型,最终显示运行3次的平均值。
训练是用SGD完成的,初始学习率为0.002,由余弦退火规则衰减。对于16/8shots,最大epoch设置为200;对于4/2shots,最大epoch设置为100;对于1shots,最大epoch设置为50
(ImageNet除外,其中最大epoch设置为50)。为了减轻在早期训练迭代中观察到的爆炸梯度,我们使用预热技巧,将学习率固定为1e−5,仅在第一个阶段。
实验中的CoOp有四个版本,将类标记定位在末尾或中间;unified text vs CSC。在实验中使用ResNet-50作为image encoder,实验结果图如下所示:
实验效果:
(1)与手工提示比较(CoOp unified context(默认))
(2)与Linear Probe CLIP的比较
(3)Unified vs Class-Specific Context
4.2 Domain Generalization
CoOp是在一个特定的数据上学习,不利于在没见过分布上的泛化。但CLIP没有这样的问题,CLIP与特定的数据分布无关,有较强的迁移能力。本节目标是揭示与zero-shotCLIP和Linear probe model相比,CoOp对分布变化的鲁棒性。
数据集:源数据集是ImageNet。目标数据集是ImageNetV2 ,ImageNet- Sketch,ImageNet- A和ImageNet-R。目标数据集与源数据集的类名兼容,所以学到的提示可以直接拿过去使用。
结果:
表1总结了结果(包含各种视觉主干)。令人惊讶的是,CoOp增强了CLIP对分布变化的健壮性,尽管暴露于源数据集。这表明习得的提示也是可泛化的。此外,有趣的是,使用更少的上下文标记可以获得更好的健壮性。相比之下,线性探测模型在这些目标数据集上的结果要差得多,暴露了其在领域泛化方面的弱点。
4.3Further Analysis(一些消融实验)
Context Length:对上下文的长度设置进行实验,结果是长度越长,性能越好;但是较短的Context length有利于distribution shifts。所以选择完美的上下文长度没有黄金法则,因为需要在性能和对分布迁移的鲁棒性之间取得平衡。
Vision Backbones:图5(b)总结了使用包括cnn和vit的各种视觉主干的11个数据集上的结果。结果表明:骨干网越先进,性能越好。CoOp和手工提示符之间的差距在所有架构中都是显著的。
Comparison with Prompt Ensembling:CLIP的作者建议,可以通过对使用不同手工提示生成的多个zero-shot分类器进行集成来获得额外的改进。下图的结果显示CoOp学习的提示仍然保持优势,但考虑到prompt ensembling的潜力,未来的工作可以从ensembling的角度研究如何提高CoOp。
Comparison with Other Fine-tuning Methods:
Initialization:比较随机初始化和手动初始化。后者使用“a photo of a”的嵌入来初始化11个数据集的上下文向量。为了公平比较,在使用随机初始化时,我们还将上下文长度设置为4。“良好的”初始化不会有太大区别。尽管进一步调整初始化词可能会有所帮助,但在实践中,我们建议使用简单的随机初始化方法。
Interpreting the Learned Prompts(可解释性不强):无法根据观察得出任何坚定的结论,因为使用最近的单词来解释学习到的提示可能是不准确的——向量的语义不一定与最近的单词相关。
5.总结
本文揭示了CLIP模型如何使用提示学习转化为数据高效的学习者(在few-shot的例子中,其性能超过Linear probe CLIP和zero-shot CLIP),CoOp在领域泛化方面比手动提示表现得更好。这一结果有力地证明了提示学习在大型视觉模型中具有潜力。CoOp不算完美,但是是第一个在Vision-Language pretained model中用prompt learning。
CoOp的limitations:
1.学到的结果(learned prompts)无法解释,因为把它们连起来似乎都不是什么正常语言表达。
2.鉴于Food101上的弱表现,CoOp对noisy label很敏感。
CoCoOp:
1.动机
CoOp将可学习模板引入CLIP,带来了性能上的提升。但是,CoOp的可学习提示向量,对于Unseen classes泛化性不强,在Base classes上可能产生了过拟合。为了解决CoOp过拟合的问题,作者团队进而提出了CoCoOp,具体做法是让可学习向量考虑每一个输入,这样对于每个样本都有一个特定的prompt让context focus在样本的一些特征或者属性上,CoCoOp的这种提示向量也叫dynamic prompt。
2.方法
CoOp是一种数据效率高的方法,允许使用下游数据集中的少量标记图像来训练上下文向量。然而,如前所述,CoOp不能推广到同一任务中更广泛的不可见类。我们认为实例条件上下文可以更好地泛化,因为它将焦点从特定的一组类转移到每个输入实例,从而转移到整个任务。
相比于CoOp,CoCoOp增加了一个轻量级的网络(Meta-Net,一个两层的MLP),Meta-Net的输入是image feature x,输出是一个instance-conditional token π 。训练、推理均与CLIP和CoOp相同。
预测概率计算:
3.实验
实验分为三部分:从基类到新类的泛化性、跨数据集的迁移以及域泛化。
数据集:对于前两个设置,即基础到新泛化和跨数据集传输,使用了11个图像识别数据集。在域泛化实验中,以ImageNet作为源数据集,以ImageNet的其他四个包含不同类型domain shift的变体作为目标数据集。
训练细节:使用了CLIP中可用的best available vision backbone,即ViT-B/16;上下文长度固定为4。
3.1 Generalization From Base to New Classes
解决CoOp的弱泛化问题是本研究的重点。在11个数据集上,将类平均分为两组,一组作为基类,另一组作为新类。16-shot training;基于学习的模型,即CoOp和CoCoOp,只使用基类进行训练,而分别对基类和新类进行评估,以测试泛化性。详细结果如表1所示。
平均来看,CoCoOp的泛化性强于CoOp,但是弱于CLIP。在ImageNet上,CoCoOp的泛化性最好。CoCoOp在基类上的性能下降很多。但比起在基类上的性能损失,CoCoOp的泛化性足以弥补这一缺点。
3.2Cross-Dataset Transfer
在ImageNet上训练(16 shots,每个类16个图像),把学到的context直接用到剩下的10个数据集上。得到的结果如下表所示,CoCoOp在跨数据集迁移上明显好于CoOp。
3.3 Domain Generalization
CoOp和CoCoOp使用ImageNet上1000个类中的每个类中的16张图像作为训练数据,将从ImageNet学习到的上下文转移到四个专门设计的基准测试来评估CoCoOp的域泛化性能。实验还包括与CLIP的比较,表3显示了结果。可见在域泛化方面,CoCoOp也是优于CoOp。
3.4 Further Analysis(一些消融实验)
(1)Initialization:比较基于word embeddings-based initialization和随机初始化来进行消融研究。表明适当的初始化对基础类和新类都更有利。结果仅代表总体趋势,而每个单独的数据集可能具有不同的结果。
(2)Context Length:研究了4、8和16个context tokens。为了公平的比较,对所有的上下文标记都使用随机初始化。context tokens为4的结果是最好的。
(3)CoCoOp vs a Bigger CoOp:CoCoOp比CoOp引入了更多的参数,即Meta-Net。消融实验将CoOp中的上下文标记数量增加到最大值,以便CoOp和CoCoOp的大小相似。结果表明增加参数大小并不是关键。
4.局限性
(1)CoCoOp的缺点在于不好训练。需要更多的GPU资源,收敛速度也更慢。原因是因为CoCoOp基于实例条件设计,要求每个图像通过文本编码器独立地向前传递实例特定的提示,训练时,只能将batch size设为1。
(2)CoCoOp在未见过的类别上,准确度仍然低于CLIP。
5.Discussion and Conclusion
CoCoOp这篇文章的动机来源于作者的上一篇CoOp,CoOp的泛化性不强,存在过拟合的问题,因此,CoCoOp尝试解决这一问题。但问题并没有得到彻底的解决。引入了轻量的网络来考虑输入,生成动态的提示信息,理应比CLIP效果要好,但是CoCoOp并没有做到。
CLIP的泛化能力被发挥到了极致,CoOp更加关注在特定数据集上的性能,CoCoOp较为尴尬,泛化性上比CoOp强,但是又不如CLIP,基类上的性能不如CoOp。
CoCoOp给我们带来的启发,更多的是模板的设计上,以及如何平衡泛化性和基准类的性能上。