导读:是否还在为设计CLIP模型的提词器(prompt)而烦恼😣?到底是“a photo of a [class]”还是“a [class] photo”🤨?对于特定任务(例如食物分类或是卫星图像识别),如何添加符合语境的上下文(context)🤔?用了本文提出的方法CoOp(中文名:琥珀),这些问题通通不需要烦恼🤩。
文章链接:https://arxiv.org/abs/2109.01134
项目链接:https://github.com/KaiyangZhou/CoOp
结合视觉和语言的预训练方法最近成为了视觉表征学习的一种有前景的替代方案。它抛弃了传统中使用图像和离散标签来学习一组固定数目类别的权重,转变成利用两个独立的编码器来对齐图像和原始文本。这种范式受益于更灵活且容易获取的多模态监督来源,并允许模型零样本迁移到下游任务。这是因为分类器的权重可以直接从文本(即提词器,prompt)直接生成。下图展示了具有代表性的CLIP模型结构。我们发现了在实践中部署此类模型的主要挑战是对提词器的设计,这是因为设计合适的提词器需要专业领域的知识,尤其是针对那些围绕类别名的上下文。同时,提词器的设计也需要花费大量时间来调整,因为微小的措辞变化可能会对性能产生巨大影响(例如下图a,在“a photo of [CLASS]”中的[CLASS]前加个“a”直接涨了将近6个点🤣)。此外,不同的下游任务需要不同的特别设计(例如图b-d中的“flower”,“texture”,和“satellite”),此举进一步阻碍了部署的效率。为了克服这一挑战,我们提出了一种名为上下文优化 (CoOp,中文名:琥珀) 的新方法。琥珀的主要思想是对提词器中的上下文用连续向量进行建模,这样做可以直接从数据中进行端到端学习,同时保持了预训练参数的不变。此举完全自动化了提词器的设计过程。下图展示了琥珀的模型结构。实验里我们使用了11个视觉数据集来验证琥珀的有效性:结果表明琥珀是一个十分高效的小样本学习方法,平均每个类别只需要一到两张图片就可以击败基于手工提词器的零样本识别模型。当每个类别的图片有16张时,琥珀比手工提词器平均高出了大约17个百分点(最高可达50个百分点🙀)。不仅如此,琥珀还对领域泛化表现出了极强的鲁棒性(见下图,M指代琥珀的提词器长度)。此时,读者一定与我们一样对琥珀学到的提词器充满兴趣。可惜的是,当我们在词空间中寻找与优化得到的词向量距离最近的现实词汇时,我们很难找到有实际含义的词,因为我们发现即便是最临近的现实词汇,其距离与优化得到的词向量仍然相距甚远,并且在词空间中,临近的词向量不一定具有相似的含义。下图展示了5个数据集对应的距离最优解最近的16词提词器。这进一步展示了人工设计的提词器可能始终无法达到琥珀的效果。鉴于以上提词器可视化的结果,我们大胆的推测,在一些数据集上,一些无厘头的提词器,例如“makka pakka akka yakka ikka akka [class]”甚至可能比“a photo of a [class]”在某些数据集上有更好的效果😂。