VPT是一篇在视觉领域应用prompt tuning的文章,以往计算机视觉是先预训练好一个大模型,然后针对不同的下游任务去微调,VPT只需要引入少量的prompt参数(少于原来模型参数的1%)进行训练,就可以在很多下游任务上表现出比原来整体微调更好的效果。
从上图我们可以看到VPT和现有别的tuning方式的差别:现在的tuning分为2种类型,第一种就是固定好backbone,微调分类头、微调模型主干的最后k层等;第二种就是在backbone那里,仅微调backbone的bias或者插入Adapter这样的结构。VPT的思想是在输入那里引入prompt参数,把backbone冻住,整个训练过程仅仅需要微调引入的prompt参数和分类头即可。从右图的效果也能看出VPT确实比其他方法要好,甚至比Full(整体微调)更好。
我们来具体看看VPT是怎么做的:
VPT分为deep和shallow两个版本,如果数据不充裕,就使用shallow版本,如果数据充裕,就使用Deep版本。我们可以看到VPT真的很简单,shallow版本只需要在第一层输入层之前,引入一些prompt参数,和CLS和其他输入embedding一起拼接起来输入进第一个Transformer的encoder即可。但是如果数据充裕,那自然我们觉得仅仅在输入引入prompt没法很好的利用这么多数据(说白点就是可学习参数少了),所以在每一层Transformer的输入层前都加入一些prompt参数学习。不管是shallow还是deep版本,都只需要学习输入的prompt参数和分类头。
当然作者还做了一个实验,关于prompt加在哪里比较合适,比如VPT本来的做法是加在embedding层后面,还尝试了Add(在Embedding层后学一个prompt参数直接加在原始像素对应的embedding上),Prepend-pixel(在输入图像块的时候输入prompt参数),concat-channel(在输入图像块的时候,将prompt参数和图像块在通道维concat)。最后结果是在embedding后拼接prompt参数最好。
熟悉nlp prompt learning的小伙伴这时候应该看出来了,视觉的VPT和nlp的P-Tuning真的很像,我们看看P-Tuning v2:
P-Tuning v2固定住了所有其他token对应的参数,每一层输入进transformer的时候只有prompt参数需要训练;而P-Tuning v1则只有transformer第一层对应的prompt需要训练。所以可以说P-Tuning v1对应着VPT-Shallow,P-Tuning v2对应着VPT-Deep。这也给了我们一个提示:nlp的prompt发展了那么久,虽然CV的prompt和nlp的prompt会不一样,但是很多方法我们可以借鉴过来CV,说不定会起到奇效。
参考
https://arxiv.org/pdf/2203.12119.pdf