前言
- 《Visual Prompting: Modifying Pixel Space to Adapt Pre-trained Models》是3月22号放在arxiv上的一篇关于visual prompting的文章,文章的主要目的是证明了prompting在CV中的可行性,为未来CV领域使用预训练模型提供了新的角度。以下纯属个人理解,望指正
始于NLP
-
灵感: 正如随着attention机制和transformer在NLP成为主流,attention+CNN、Vit、Swin-transformer、ShiftVit等基于attention和transformer的CV模型不断涌出一样;在看到prompting在NLP变得越来越火时,作者自然问道:Why not visual prompting?
-
Prompt in NLP: Prompt目前在NLP领域有很多工作,在《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing》这篇survey里面,作者大佬系统地介绍了NLP的发展历程(如下图) 从依赖特征工程的传统机器学习,到大量依赖数据集的深度学习,再到基于预训练模型的Fine-tune类型算法,再到现在的基于预训练模型的Prompt类型算法。作者在文章中系统地介绍了Formulation、Pre-trained models、Prompt engineering、Answer Engineering 等相关问题,写得非常的简介明了,推荐感兴趣的去阅读一下。
-
NLP中的Prompt: 那么,prompt到底是什么呢?简单来讲,就是对原来的输入文本进行一定的处理,使得在不改变预训练模型参数的情况下,相应任务的performance变高。例如,原输入文本为: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。
Visual Prompting
- Why Visual Prompting: 在前言中提到过,作者文章的目的是证明在CV领域,Prompt是可行的,并且在某些任务和数据集上效果是不错的。
- 使用(迁移)预训练模型的方法: 在CV中,将一个预训练模型迁移到新任务上的方法主要包括Fine-tuning,Linear Probe,Visual Prompting ;三种方法的不同如下图 Fine-tuning会修改预训练模型参数,Linear Probe不会修改预训练模型参数,但是会在预训练模型后增加和任务相关的线性层,Visual Prompting则是不修改预训练模型参数,只修改原图像。
Methods
- Prompt形式: 对于图片,给原图增加prompt,自然想到的是添加一些像素;其实以像素形式添加prompt的好处就是可以做到task-special和input-agnostic;也就是因为prompt中含有大量数据中学到的信息,所以是任务相关的;因为对于同一个任务,在测试时,直接使用得到的prompt就可以,不管你输入哪张图片,因此时输入无关的。
- 如何添加: 作者提到了三种方式:1)在随机位置添加像素块(pixel patch);2)在固定位置添加像素块(pixel patch);3)在图像内部边缘pad一些像素(类似卷积中的padding)第三种方式效果最好
- Padding: 使用pad方式添加,添加的宽度为 p p p;图像的尺寸为 C , H , W C,H,W C,H,W;则一共需要添加 2 ∗ C ∗ p ∗ ( H − p ) + 2 ∗ C ∗ p ∗ ( W − p ) 2*C*p*(H-p)+2*C*p*(W-p) 2∗C∗p∗(H−p)+2∗C∗p∗(W−p),如图
- 如何得来: 对于一个任务,需要通过训练得到于该任务相关的prompt,得到之后就可以直接应用了。
效果
疑问
- 在文章的What Properties Make for a Good Visual Prompt?部分,我觉得他没有在原理上讲清楚到底是什么使得一个prompt是一个有效的prompt,对此有比较清楚的看法的小伙伴欢迎评论交流。