Prompting Learning在CV领域的进展

news2024/10/6 22:33:44

始于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,使模型学习如何将它们区分开来。此外,还可以通过图像增广技术,对图片进行旋转、缩放、裁剪等处理,从而增加模型对不同类型伪造图片的鲁棒性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3D介绍和VR领域的使用说明

目录 Unity3D介绍 Unity3D 是否能用在VR游戏开发? Unity3D 跟虚幻引擎比,优缺点? Unity3D 可以开发微信游戏小程序吗? Unity3D可以自学吗? Unity3D视频分享图 Unity3D介绍 Unity3D是一种跨平台游戏引擎&#xff…

会声会影2023帧率在哪里设置 会声会影2023怎么改帧率

对于帧率的概念,可能大家会比较陌生。在会声会影编辑视频时,我们一般会选择与素材相同的参数设置。因此,很少会去单独设置视频帧率。本文会给大家介绍一下帧率的概念,以及会声会影帧率在哪里设置,会声会影2023怎么改帧…

数智财资,智慧金融 用友联合工行青海分行举办主题论坛圆满落幕

2023年5月10日,用友网络联合中国工商银行青海省分行于青海西宁举办的“数智财资,智慧金融——工行财资云助力企业构建一流财资体系”主题论坛圆满落幕。金融机构领导,行业财资专家,各企业领导、财务负责人齐聚一堂,分享…

apple pencil一定要买吗?平价好用的电容笔合集

这些年来,iPad已经成为了很多人的首选。而iPad的使用者,更看重的是它的功能,很多人都会选择电容笔搭配来做笔记。实际上,Apple Pencil还有许多其他版本,如果只是为了记笔记,那么你不需要买一支价格不菲的苹…

图片转为base64格式的优缺点分析

1. 优点 (1)网页中使用base64格式的图片时,不用再请求服务器调用图片资源,减少了服务器访问次数。 (2)base64编码的字符串,更适合不同平台、不同语言的传输; (3&#…

【源码解析】SpringBoot接口参数校验原理

使用示例 入门 web接口 RestController public class HelloController {PostMapping("/t1")public void t1(Validated RequestBody Request request) {System.out.println(11);} }实体类 Data public class Request {NotEmpty(message "title不为空")…

Qwik 1.0 发布,全栈式 Web 框架

Qwik 是一个全栈式 Web 框架,Qwik 基于 React、Angular 和 Vue 等其他 Web 框架的概念,但以 JavaScript 流等更新的方法脱颖而出,允许以高性能向用户交付复杂的 Web 应用程序。 随着 Web 应用程序变得越来越大,它们的启动性能会下…

百度文心一言在国产模型中倒数?我看懵了

最近几天,我们公众号的社群在纷纷转发一张名为SuperClue 评测的截图。科大讯飞甚至在官号进行了宣传: 由于讯飞星火大模型刚发布,笔者玩的少,它是不是真的是国产最强这个笔者不敢下结论。 各个大模型的研究测试传送门 阿里通义千问…

揭开Facebook数据抓取的面纱,深入了解其运作机制

在互联网时代,数据是一切的基础。而社交媒体作为数据存储与传输的重要渠道,其数据价值不言而喻。 那么,Facebook数据抓取是如何进行的呢? 1.API接口 首先,我们需要了解一些基本的概念。Facebook的API(Ap…

微服务#2 Feign 和 Gateway

一. Feign Feign远程调用 Feign的使用步骤 引入依赖 <!--feign客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 添加Ena…

数组和指针

文章目录 指针和数组指针为什么要有指针如何理解编址指针的内存布局指针解引用如何将数值存储到指定的内存地址栈随机化 数组数组的内存布局&a[0] VS &a步长问题 指针和数组无关C为何要这样设计 指针数组和数组指针数组元素个数是否是数组类型的一部分?是地址的强制转…

国赛推荐方向!Prompt工程设计大赛

近期&#xff0c;大型语言模型&#xff08; LLM&#xff0c;Large Language Model &#xff09;的魅力&#xff0c;让大家惊艳于 AI 的天花板还能继续抬升。具备“涌现能力”的 LLM &#xff0c;许多能力都将被解锁&#xff0c;带来意想不到的精彩礼物。对于用户来说&#xff0…

maven学习总结

生命周期 每个生命周期的各个环节都是由各种插件完成&#xff01;&#xff01;&#xff01;Maven有三个相互独立的生命周期&#xff08;Maven的这三个生命周期不能看成一个整体&#xff09;&#xff01;&#xff01;&#xff01; 我们在开发中描述的项目的生命周期&#xff0…

Java之阻塞队列和消息队列

目录 一.上节复习 1.什么是单列模式 2.饿汉模式 3.懒汉模式 二.阻塞队列 1.什么是阻塞队列 三.消息队列 1.什么是消息队列 2.消息队列的作用 1.解耦 2.削峰填谷 3.异步 四.JDK中的阻塞队列 1.常见的阻塞队列 2.向阻塞队列中放入元素---put() 3.向阻塞队列中拿出元…

python url拼接的方法

Python的 url是一个常用的文件链接&#xff0c;一个文件包含多个 url&#xff0c;在很多网站中&#xff0c;我们都需要拼接多个 url。 在网上我们经常可以看到关于 Python拼接的方法介绍&#xff0c;但是很多都是非常不完整的&#xff0c;今天我们就来了解一下&#xff0c;比较…

晨控CK-FR208-EIP与欧姆龙PLC工业Ethernet/IP协议通讯指南

CK-FR208-EIP 是一款支持标准工业 Ethernet/IP 协议的多通道工业 RFID 读写器&#xff0c;读卡器 工作频率为 13.56MHZ&#xff0c;支持对 I-CODE 2、I-CODE SLI 等符合 ISO15693 国际标准协议格式标签的读写。 读卡器同时支持标准工业通讯协议 Ethernet/IP&#xff0c;方便用…

Linux使用rsync同步文件

1.rsync的概念 rsync&#xff0c;remote synchronize顾名思义就知道它是一款实现远程同步功能的软件&#xff0c;它在同步文件的同时&#xff0c;可以保持原来文件的权限、时间、软硬链接等附加信息。 2.查看rsync 查看服务器端rsync版本 rsync --version rsync命令选项 -…

从GFS到GPT,AI Infra的激荡20年

导读 最近AIGC和LLM的浪潮层层迭起&#xff0c;大有把AI行业过去十年画的饼&#xff0c;一夜之间完全变现的势头。而AI Infra&#xff08;构建AI所需的基础设施&#xff09;&#xff0c;也成了讨论的焦点之一。大众对AI Infra的关注点&#xff0c;往往放在AI算力上——比如A100…

创作纪念日|我在CSDN的第365天(内含粉丝福利)

创作纪念日 大家好&#xff0c;我是陈橘又青&#xff0c;最近因为一直在备考&#xff0c;所以没怎么更新博客&#xff0c;今天起来和往常一样看了一眼私信&#xff0c;发现了一条来自CSDN官方的私信。 打开一看&#xff0c;原来是创作一周年的通知&#xff0c;回想起来&#…

Python数据分析:NumPy、Pandas和Matplotlib的使用和实践

在现代数据分析领域中&#xff0c;Python已成为最受欢迎的编程语言之一。Python通过庞大的社区和出色的库支持&#xff0c;成为了数据科学家和分析师的首选语言。在Python的库中&#xff0c;NumPy、Pandas和Matplotlib是三个最为重要的库&#xff0c;它们分别用于处理数值数组、…