Prompting Learning在CV领域的进展

文章探讨了Prompt在NLP和CV领域的应用,从NLP中的文本分类到CV的图像识别。介绍了CLIP、CoOp、CoCoOp等模型如何利用Prompt改进预训练模型,强调了Prompt在不同任务中的适应性和灵活性,并讨论了未来可能的发展方向,如多模态Prompt学习和实例特定的上下文构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

始于NLP

prompt介绍

简单来讲,Prompt就是对原来的输入文本进行一定的处理,使得在不改变预训练模型参数的情况下,相应任务的性能变高。例如,原输入文本为:I received the offer from ETH. ,对于文本分类,我们将其修改为I received the offer form ETH, I’m so [MASK];[MASK]可以为一些表示情绪的词,比如happy,那么相对于原文,修改后的句子更容易被分为happy类。如果将其改为I received the offer from ETH. Chinese:[MASK],则对于翻译任务来讲,更容易取得正确的翻译效果。所谓的修改方式如下图:

 NLP中的Prompt算法步骤:

Prompt Addition: 这一步就是如何修改原文本。

Answer Search: 构建相应的answer空间,例如,文本分类,设置为(happy, good, terrible等)。

Answer Mapping: 在某些时候answer并不是我们最终想要的结果,比如我们最终想要的结果为positive和negative;那么则需要将happy,good映射为positive,将terrible映射为negative。

NLP领域提出了Prompt新范式,企图革新原先的Fine-tuning方法,而在CV领域prompt可以理解为图像的label设计,从这个角度看,prompt(预测文本中的mask字符,完形填空式)其实是介于Image caption(给出一幅图,生成一段描述的文字,迭代预测出每一个字符)和one-hot label (one-hot可以认为是prompt的特例,单字符通过文本编码器编码成one-hot)之间的任务。

prompt与fine-tuning

Prompt v.s. Fine-tuning

 

                     (1)Fine-tuning                                                         (2)prompting

其中,LM是预训练语言模型,矩形框表示各种下游NLP任务,他们的共同点是“希望预训练语言模型与下游任务靠的更近,只是实现方式不一样”。

  • Fine-tuning: 预训练语言模型“迁就”下游任务。具体通过引入各种辅助任务的loss,将其添加到预训练模型中,然后继续pre-training,以便让其更加适配下游任务,这个过程预训练语言模型做出了更多的牺牲。

  • Prompting:各种下游任务“迁就”预训练语言模型。具体对不同任务进行重构,使得它能够直接适配预训练语言模型,这个过程下游任务作出更多的牺牲。

Prompting Learning在CV领域的进展

CLIP(Learning Transferable Visual Models From Natural Language Supervision)

文章链接:http://proceedings.mlr.press/v139/radford21a/radford21a.pdf

CLIP是该领域的开山之作,其从网上收集了4亿个图片文本对用于训练,最后进行zero-shot transfer到下游任务达到了非常好的效果,主要流程如下:

 

 训练阶段:文本会通过Text Encoder(Transformer)编码成一些文本Embedding向量,图像会通过Image Encoder(ResNet50或VIT)编码成一些图像Embedding向量,然后将文本Embedding和图像Embedding归一化后通过点积计算出一个相似度矩阵,这里值越接近于1代表文本Embedding和图像Embedding越相似,即这个文本和图像是配对的。我们的目标是让这个相似度矩阵对角线趋向于1,其他趋向于0(对角线代表图像和文本配对)。

测试zero-shot阶段:会将一张没见过的图片通过image Encoder得到图像embedding,然后将所有可能的类别,通过构造a photo of a {object}的文本标签(prompt),将所有类别填入object处,通过text encoder,得到所有类别对应的文本embedding,将文本embedding和图像embedding归一化后进行点积,选择点积最大的一个文本-图像对,该类别则为预测类别(图像分类任务)。

CoOp: Learning to Prompt for Vision-Language Models

文章链接:https://arxiv.org/pdf/2109.01134.pdf

 CoOp的motivation如上图所示:CLIP是固定prompt:a photo of a [class],但是不同prompt的影响很大,比如从图a可以看出,少了一个a,acc直接低了6个点。每次根据人工设计prompt太麻烦,设计的还不一定好,所以应该像Prefix Tuning一样,学一个连续的prompt。 CoOp从原来a photo fo a [class]转换成[V]1[V]2...[V]M[CLASS],这样可学习的连续的prompt,这样就不需要人工去设计prompt了。这里的prompt分为unifiedclass-specific两种,unified context即对所有类别都是学一组一样的prompt参数,class-specific context指的是对每一个类别学一个单独的prompt 参数,事实证明后者对一些细粒度的任务效果比较好。(还有instance-specific context这种更细粒度的可能,为啥这里没提呢?因为当时作者没想好怎么设计,想好之后又写了一篇CoCoOp)另外这里prompt里的[CLASS]不一定要放最后,也可以放句中,那这样学习明显更加灵活。

 

在实验这有一个有意思的发现:nlp领域有一篇叫OptiPrompt的文献,提出连续的prompt不一定要随机初始化,可以用人工设计的prompt的embedding初始化来引入专家经验,CoOp做实验发现就算prompt参数是随机初始化的也能到达一样的效果。

CoCoOp: Conditional Prompt Learning for Vision-Language Models

文章链接:https://openaccess.thecvf.com/content/CVPR2022/papers/Zhou_Conditional_Prompt_Learning_for_Vision-Language_Models_CVPR_2022_paper.pdf

 CoCoOp的motivation如上图所示:作者发现他们之前提的CoOp在训练过类别的数据集上表现的很好,但是面对新的类别,能力却很差,从80的acc降到65,而原版的CLIP却保持了还不错的泛化能力,引起了作者思考,作者认为这是因为CoOp在下游任务上训练时容易overfit base classes上。我认为本质原因一方面因为用的prompt是unified或者class-specific,而不是instance-specific context,另一方面我认为用unified也可以,但是要有足够的数据学到真正的unified的特征。

 CoCoOp的做法很简单,在CoOp的基础上,引入了一个轻量的网络Meta-Net(仅仅是Linear-ReLU-Linear),将image Encoder的输出通过Meta-Net得到一个M维的向量,将这M维的向量直接加在CoOp上的每一个prompt token上,通过这种方式做到instance-specific context。这种方式其实就是把每个图片的特征引入了prompt的构造里,所以CoCoOp的第一个Co就是指这种Conditional。

DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting

文章链接:https://openaccess.thecvf.com/content/CVPR2022/papers/Rao_DenseCLIP_Language-Guided_Dense_Prediction_With_Context-Aware_Prompting_CVPR_2022_paper.pdf

 

作者提出了prompt构造的2种方式。

Pre-model prompting:即将图像通过image encoder之后得到图像embedding,这个embedding将作为Transformer的k和v输入进一个Decoder里面生成一个prompt的模板。这种方式和CoCoOp就挺像的,只不过CoCoOp是用一个很简单的backbone生成一个M维的token,再把这个token加在原来CoOp上生成的每一个prompt向量,这里是直接用一个更复杂的backbone直接生成一个prompt。

Post-model prompting:即将图像通过image encoder之后得到图像embedding,然后作为k和v输入进decoder,这里decoder的query是CoOp生成模板加上[class]后的文本通过text encoder的文本embedding,通过decoder生成一个Vpost和文本向量做相加来更新文本特征,经过实验发现第二种方式更好。从直观上也很好理解,因为这样的prompt image encoder和text encoder都参与了。

Unifying Vision-and-Language Tasks via Text Generation

文章链接:http://proceedings.mlr.press/v139/cho21a/cho21a.pdf

 现在vision-language learning的方法都是task-specific的,即要为每个下游任务特别设计,本文利用prompt设计来兼容7个下游任务的学习,如上图所示,对不同的下游任务只需要加上不同的文本前缀即可,比如一个视觉问答的任务就加上vqa,对visual grounding的任务就加上visual grounding即可。具体模型如下所示:

 整体流程是一个encoder-docoder的结构,encoder部分将prefix prompt、text embedding、 visual embedding作为输入,其中visual embedding由faster-rcnn提取的ROl features、Box coordinates, image ids, region ids构成,把encoder输出的结果传递给一个自回归的decoder得到模型的输出。不同下游任务模板如下所示:

 MAPLE: MULTI-MODAL PROMPT LEARNING

文章链接:https://arxiv.org/pdf/2210.03117.pdf

这篇文章的出发点很有新意,一直以来我们做prompt都是在图片或者文本一个模态做prompt,这篇文章觉得只在其中一个模态(分支)做prompt只能达到次优的性能,所以他们提出应该在每一个模态都应该做prompt,示意图如上所示。

 模型架构图如上所示:首先文本端除了文本的输入embedding,会拼接一些文本prompt向量,图像端同样除了图像的embedding输入,也会拼接一些图像prompt向量。这里要注意,这两个prompt向量是有交互的,因为作者认为为了让prompt发挥拉近不同模态距离的作用,不同模态的prompt应该要深层交互。具体交互的做法就是将文本prompt的embedding,通过一个linear层映射到图像embedding维度,转换成图像prompt向量,但这个交互只会发生在前K层,后面J-K层就不需要交互了,因为作者认为经过前面的交互,后面层的特征已经不是各自独立模态的特征了,自然不需要交互了。

 CPT:Colorful Prompt Tuning for Pre-Training Vision-Language Models

文章链接:https://arxiv.org/pdf/2109.11797.pdf

这篇文章是prompt用在image grounding(利用指定描述的语句进行标定图片中所显示的物体)的工作,我认为他的出发点十分值得思考:

一般用Pre-Training Vision-Language Models做image grounding的做法如上图b所示,他们的做法是去随机mask一些词然后通过预测这个随机的MASK来完成预训练的任务。在预测即下游任务时,对没有mask的token做语义分类,来完成grounding的任务。那这样就会存在一个gap:因为你预训练的时候是去预测一些mask的token,而到下游任务时预测的token是非mask,那这样上下游的迁移就有可能会有问题,那为什么nlp不会有问题呢?我认为是对于文字来说,理解哪里的文字理解的方式是一样的,但是对于视觉是不一样的,比如我学会了人在“看”马这个看的概念,那和哪个是人,哪个是马来说这两个问题来说,我认为学会人在“看”马是一个不同等级的概念(可能是更高的),那这么来做效果就不一定会好了。所以CPT把问题转换为颜色预测的任务:看一些被涂上不同颜色的图片,然后把文本当作问题,最后回答什么颜色的图片是问题的答案并填空,再换句话说,原来想问你在一张人在看马的图片里,哪个是人,现在直接问你,“女人看的马是什么颜色”,因为我们知道哪块被填上了颜色,所以解决了这个问题。

这个方法在zero shot、few shot 场景下取得了非常好的表现,除了image grounding,CPT也提出了别的下游任务建模方式:对目标分类任务,可以建模为红颜色的物体是一个什么,具体如上所示。

Multimodal Few-Shot Learning with Frozen Language Models

文章链接:https://proceedings.neurips.cc/paper/2021/file/01b7575c38dac42f3cfb7d500438b875-Paper.pdf

这篇文章讲故事的点很有意思,他认为之前对于文本大模型的prompt,都是在前面加上prefix prompt来提示做什么下游任务,可能和视觉模型一起微调或者冻住文本大模型来完成。这篇文章认为配对的图像特征本身就是一种prompt,我们可以利用这个文本配对的图像提取特征作为我们的prompt,具体结构如下所示:

将图像通过一个NF-ResNet50提取特征,然后将一些文本通过一个text embedder提取特征,然后一起输入进一个在大数据集下预训练好的7billion参数的Transformer进行自回归预测完成训练,其中只有vision Encoder是可训练的,其他模块皆冻结。这样prompt的模型可以在很多场景的zero-shot和few-shot达到一个好的效果。其中作者还提到,在面对一个新的下游任务时,我们可以输一些图像文本对让模型学习到新的概念,这样会在下游任务上表现的更好,具体如下所示:

VPT:Visual Prompt Tuning

文章链接:https://arxiv.org/pdf/2203.12119.pdf

一篇不用文本来做视觉prompt的文章。VPT分为deep和shallow两个版本,如果数据不充裕,就使用shallow版本,如果数据充裕,就使用Deep版本。我们可以看到VPT真的很简单,shallow版本只需要在第一层输入层之前,引入一些prompt参数,和CLS和其他输入embedding一起拼接起来输入进第一个Transformer的encoder即可。但是如果数据充裕,那自然我们觉得仅仅在输入引入prompt没法很好的利用这么多数据(说白点就是可学习参数少了),所以在每一层Transformer的输入层前都加入一些prompt参数学习。不管是shallow还是deep版本,都只需要学习输入的prompt参数和分类头。这篇文章的做法可以说是mainly-motivated by prefix-tuning/p-tuning的了,所以提示我们可以再找找nlp里work的prompt方法,看看怎么在cv上做work。

Exploring Visual Prompts for Adapting Large-Scale Models

对于图片,给原图增加prompt,自然想到的是添加一些像素;其实以像素形式添加prompt的好处就是可以做到task-special和input-agnostic;也就是因为prompt中含有大量数据中学到的信息,所以是任务相关的;因为对于同一个任务,在测试时,直接使用得到的prompt就可以,不管你输入哪张图片,因此时输入无关的。

如何添加: 作者提到了三种方式:1)在随机位置添加像素块(pixel patch);2)在固定位置添加像素块(pixel patch);3)在图像内部边缘pad一些像素(类似卷积中的padding)第三种方式效果最好。

Padding: 使用pad方式添加,添加的宽度为p ;图像的尺寸为C,H,W;则一共需要添加 2*C*p*(H-p)+2*C*p*(W-p),如图:

如何得来: 对于一个任务,需要通过训练得到于该任务相关的prompt,得到之后就可以直接应用了。

Prompting Learning在伪造检测领域的一些想法

  1. 以图搜图(Image Retrieval)作为prompt:将真实图片作为查询图片,通过图像检索技术从一个大型图像库中检索出与之相似的伪造图片,将这些伪造图片作为训练数据输入到深度伪造检测模型中,从而提高模型的准确性。此外,还可以将伪造图片作为查询图片,从真实图片库中检索相似的真实图片,这样可以帮助模型更好地区分真实图片和伪造图片之间的细微差别。
  2. 以图做prompt(Image Prompting):将图片作为输入到深度伪造检测模型中,并将其作为prompt,帮助模型更好地学习区分真实图片和伪造图片之间的差异。例如,可以使用对比学习技术,将真实图片和伪造图片作为输入,并设计相应的prompt,使模型学习如何将它们区分开来。此外,还可以通过图像增广技术,对图片进行旋转、缩放、裁剪等处理,从而增加模型对不同类型伪造图片的鲁棒性。

### Visual Prompting in Machine Learning and Computer Vision Techniques Visual prompting refers to the process where a model receives additional visual information or context that guides its decision-making processes. This technique enhances how models interpret input data, particularly images, leading to more accurate predictions and classifications. In computer vision applications, visual prompts can take several forms including: - **Textual Prompts**: Providing textual descriptions alongside image inputs helps guide neural networks towards specific features they should focus on during analysis[^1]. - **Attention Maps**: Highlight areas within an image which are most relevant for making decisions. These maps allow models to concentrate processing power only on important sections rather than analyzing entire pictures uniformly. - **Object Masks**: By masking out irrelevant parts of images before feeding them into algorithms, performance improvements occur because less noise interferes with key elements necessary for correct identification tasks. Implementations often involve modifying existing architectures like Convolutional Neural Networks (CNNs) so these systems understand not just raw pixel values but also contextual clues provided through prompts. For instance, when detecting objects within scenes, applying appropriate masks ensures better recognition rates even under challenging conditions such as occlusions or varying lighting environments[^2]. Moreover, integrating mobile sensing technologies could further enhance visual prompting mechanisms by dynamically adjusting cues based on real-time environmental changes around devices used for capturing imagery[^3]. ```python import torch from torchvision import transforms, models def apply_visual_prompt(image_tensor, prompt_mask): """ Applies a binary mask over an input tensor representing an image. Args: image_tensor (torch.Tensor): Input image converted to PyTorch Tensor format. prompt_mask (torch.Tensor): Binary mask indicating regions of interest. Returns: torch.Tensor: Modified version of original image after applying mask. """ masked_image = image_tensor * prompt_mask.unsqueeze(0).expand_as(image_tensor) return masked_image ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值