CLIP & VPT
最近主要在做多模态的工作,后续会连续出几期mm的论文记录下自己的思路
CLIP (Learning Transferable Visual Models From Natural Language Supervision)
CLIP是OpenAI给我最先留下印象的文章,也是第一次让学术界意识到数据集其实相比于模型本身的设计更加重要。可以说现在DL更多的靠近Feature Engine。
CLIP是基于4亿图像文本对训练出的ViT + Tokenizer的集合,最后的loss是NCE Loss,即相似性计算。
结构图里可以看出,在zero-shot的场景下,对分类任务的class和image分别进行编码然后计算最高相似度的匹配结果就是最终的预测值。
o
u
t
p
u
t
=
s
i
m
l
a
r
i
t
y
(
T
o
k
e
n
i
z
e
r
(
t
e
x
t
)
,
I
m
a
g
e
_
E
n
c
o
d
e
r
(
i
m
a
g
e
)
)
output=simlarity(Tokenizer(text), Image\_Encoder(image))
output=simlarity(Tokenizer(text),Image_Encoder(image))
目前使用较多的是OpenCLIP,它在更大的数据集上训练,性能也更好一些。
总结:
- 第一个大规模数据集进行预训练的多模态模型
- 在多个数据集上zero-shot性能极佳,原因是超大规模的数据集带来更robustness的特征理解
- 作为baseline和pretrained model进行使用,搭配prompt/adapter进行下游任务fine-tune
VPT (Visual Prompt Tuning) ECCV2022
对Meta的工作一直非常欣赏,这篇文章的概括就是VPT is a very solid work!!!
框架非常简单,ViT Backbone + Tunable Classifier Head。在Backbone内的每个transformer layer插入一组prompt。
结构
拆解来看,image经过patch embedding后变为一组patch tokens,头部额外concat一个cls token。进入transformer layer之前,在cls token和patch tokens之间插入N个trainable prompt tokens。
VPT使用了两种不同的tuning mode,VPT-Shallow仅在第一层transformer layer前插入prompt,VPT-Deep则是在backbone的每一个transformer layer前都插入prompt。
对比实验
- full fine-tune 即更新全部参数
- tune部分结构,包括
a. froze backbone - tune head
b. froze top-k backbone layer - tune last-k backbone layer & head
c. froze backbone - k-layer MLPs instead of a linear head - 添加辅助结构,包括
a. add a side network and linear interpolate their features before into head
b. tune the bias of backbone
c. insert MLP as the Adapter into backbone
可以发现,VPT的方法很有效,此外tune backbone’s bias也是性能提升很大的method。
个人理解是,pre-trained model包含了一个很大的latent feature embedding sapce,但是这个sapce更mean。调整bias/添加各种结构的本质都是在有限的参数范围内对原有的latent feature embedding sapce进行transfer,使model更focus在当前任务的feature sapce。
消融实验
在证明了prompt的优越性后,文章又进一步对prompt的插入方式进行了消融实验。主要包括
- 输入transformer layer前,append到cls token和patch tokens之间
- 和原有的patch tokens进行add
- 在patch embedding之前对原image进行扩充
- 将patch embedding解锁,对原图按channel concat
真的不能用方法4
如果是VPT-Shallow mode,prepend和add差别不大
以及对不同prompt tokens数量,prompt的插入位置方式和输出的形式进行了测试:
即使是prompt数量为1也非常好用!
浅层的prompt更重要,因为深层的feature对bias不敏感?
使用原始的cls token outputs和使用patch tokens pooling的结果相差不大,感觉方便使用的话就不用修改。
总结
这是多模态预训练模型的总结系列(一),CLIP和VPT作为最经典的backbone和prompt tuning已经深入人心,作者自己在将VPT-Deep的Backbone替换成OpenCLIP后效果更加出色,强推!