CLIP微调方式
CLIP 利用互联网上大量的图像文本对作为训练数据,利用文本作为监督信号,展现出了令人惊叹的视觉 zero-shot 分类能力。同时,CLIP 的视觉编码器也是一个很强的视觉 backbone,在很多视觉任务上都能取得不错的性能。然而,互联网数据数据虽然规模巨大,但是数据质量终归不如人工标注数据。CLIP 模型受到预训练数据噪声和数据分布的影响,有着很大的 bias。在很多下游应用任务中,zero-shot 并不是唯一的选择。收集少量特定下游任务的数据,在 CLIP 预训练的基础上进行微调,也是一种有效的方式。
本文调研了几种对 CLIP 进行微调的方式。不同于常规的视觉预训练方式(如在 ImageNet 1K 分类数据集上进行有监督预训练),文本塔的存在赋予了 CLIP 极强的灵活性。首先,像原文中的做法一样,CLIP 可以直接进行 zero shot 的图像分类,这在 CV 领域是极其少见的;其次,文本塔的存在使得我们也可以借鉴在 NLP 领域已经取得一些研究成果的 prompt engineering 的方式,来微调多模态模型。除此之外,最近流行的 Adapater 的方式也很适合 CLIP 模型,通过少量参数微调达到 SOTA 的性能。
CoOp
导言
Zeroshot 是 CLIP 最令人惊艳的能力,原文作者通过使用一些简单的文本 prompt(如 A photo of [CLASS])来构造分类器,就在 ImageNet 上得到了不错的结果。然而,prompt 的设计比较繁琐,我们不知道什么样的 prompt 是合适的。对于神经网络而言,可能 prompt 中微小的措辞变化,就会造成结果的巨大差异。而且,对于不同的任务,不同的数据,我们往往需要设计不同的 prompt。在 CLIP 原文中,作者为了适应 ImageNet 一个数据集中的数据分布,就设计了 80 个 prompt 模板。
CoOp(Context Optimization)的出发点是让模型自己学习构建 prompt。最终模型学习出的 prompt 可能对于人类来说是无意义的、不可读的,但是对于模型来说,在给定数据上确实可以得到更优的结果。这与语义空间的连续性有关。
观察图 1,我们可以发现不同的 prompt 在不同的数据集上确实会造成巨大的性能差异,而使用 CoOp,让模型自己学习 prompt,性能有显著的提升。
方法
CoOp 的方法框架如图 2 所示。在 CLIP 使用图像文本对进行对比学习预训练之后,常规的 zeroshot 方法是设计一些 prompt 模板,如 A photo of [CLASS],将类别名填入构造出文本,然后比较图像特征和各个类别文本特征的相似度,预测图像的类别。而 CoOp 则是在类别名前面加上一组可学习的 token [ V ] M [V]_M [V]M。然后前向传播计算出文本特征和图像特征,再根据标签计算交叉熵损失,反向传播,更新可学习 token [ V ] M [V]_M [V]M 的参数。
几点细节说明:
- 网络的其他部分都是固定的,只更新 prompt token [ V ] M [V]_M [V]M 的参数
- CoOp 有几种不同的变体,
- 改变可学习 token 的个数
- 将类别名加到 [ V ] M [V]_M [V]M 中间
- 对不同的类别学习不同的 prompt token
实验
图 3 展示了 CoOp 在 11 个数据集上与 Linear Probe CLIP 的少样本对比实验。可以看到:
- 整体而言,CoOp 这种学习 prompt 的方式,相比于直接线性微调,在少样本时优势比较明显
- 不同的数据集(数据分布),对 prompt 的敏感程度差的比较大。如第三行第一列的 Food101,学习 prompt 的提升不大,但是线性微调还是有提升。
- 和 CLIP 原文中的结论一样,对于 CLIP 来说,很多时候给几个样本微调,还(远远)不如直接 zeroshot,比如 Food101 数据集。
消融实验的结果就不贴了,感兴趣可以直接去原文看。
表 1 展示了CoOp在不同数据集上学习到的prompt token在词表中最接近的词。可以看到,几乎没啥可解释性。
总结
以学习 prompt 的方式来进行少样本学习,性能提升的同时还能保持 CLIP 模型本身参数不动。挺有用的一篇工作,虽然这种 prompt 的方式在 NLP 中早就有了,但应用到多模态 CLIP 中还是有一些意义的。
CLIP Adapter
导言
本文通过在 CLIP 的文本编码器、图像编码器中插入 adapter 模块,对比 CoOp 实现了更优的微调性能。
方法
CLIP Adapter的架构及其与其他方式的对比如图 4 所示。一张图片经过 CNN / ViT 得到视觉特征 f f f ,即图中彩色的 embedding 条。
- 朴素的分类器是直接学习一个分类器矩阵权重 W W W
- CLIP 是人工设计一些 prompt,与类别名一起构建文本,并通过文本编码器提取出文本特征,多个类别的文本特征组成矩阵 W W W
- CoOp 也是通过学习 prompt token 构造文本,得到文本特征,组成矩阵 W W W
- 最下方的 CLIP-Adapter 则是通过在文本塔和视觉塔中插入一个可学习的 adapter,并将其得到特征与原特征残差相加,得到最终的输出特征。
实验
主要结果和 CoOp 差不多,稍高一点。
TIP-Adapter
导言
Tip-Adapter 是 Training-free CLIP-Adapter 的简写,顾名思义,Tip-Adapter 可以做到在不学习任何参数的条件下,将 CLIP 适配到 few-shot 分类任务。Tip-Adapter 通过构建 key-value cache model 来将 few shot 样本的知识结合进来,再加上 CLIP 本身的图文相似度计算能力,完成下游分类任务。无需任何参数更新的 Tip-Adapter 就达到了与当时微调 SOTA 接近的性能。而 Tip-Adapter 再加上参数微调的版本 Tip-Adapter-F 则能取得更高的性能。
方法
给定一个训练好的 CLIP 模型和 N-way K-shot(N 个类,每类 K 个样本) 的 few-shot 分类任务训练集,目标是同时利用 CLIP 的图文相似度计算能力和 NK 个样本的特定知识来创建一个 N 类的分类器。Tip-Adapter 的方法框架如图 5 所示。
few shot训练集中有 NK 张图像,经过 CLIP 视觉编码器,得到视觉特征 F t r a i n ∈ R N K × C \bf{F}_{train}\in\mathbb{R}^{NK\times C} Ftrain∈RNK×C ,其中 C 是视觉特征的维度。对 N 个类别取 OneHot 标签,得到 L t r a i n ∈ R N K × N \bf{L}_{train}\in\mathbb{R}^{NK\times N} Ltrain∈RNK×N 。将 F t r a i n \bf{F}_{train} Ftrain 作为 keys,将 L t r a i n \bf{L}_{train} Ltrain 作为 values,我们就能够构建出 key-value cache model 了,这个 cache model 中包含了 few shot 训练集中的全部知识,与预训练的 CLIP 结合,进行下游分类任务。这个过程中没有任何的参数训练。
在测试时,给定一张测试图片,先用 CLIP 的视觉编码器得到其特征
f
t
e
s
t
∈
R
1
×
C
f_{test}\in\mathbb{R}^{1\times C}
ftest∈R1×C ,分别经过 cache model 和 clip classifier,将得到的 logits 进行加权融合,得到最终的 logits,用于图像分类。最终的 logits 的计算公式为:
logits
=
α
⋅
exp
(
−
β
(
1
−
f
t
e
s
t
F
t
r
a
i
n
T
)
L
t
r
a
i
n
+
f
t
e
s
t
W
c
T
\text{logits}=\alpha\cdot\text{exp}(-\beta(1-f_{test}F_{train}^T)L_{train}+f_{test}W_c^T
logits=α⋅exp(−β(1−ftestFtrainT)Ltrain+ftestWcT
其中
α
\alpha
α 是权重系数,
W
c
W_c
Wc 是 CLIP 预训练的分类器(即 CLIP 原文中进行 zero-shot 分类的方式),
exp
(
−
β
(
1
−
f
t
e
s
t
F
t
r
a
i
n
T
)
L
t
r
a
i
n
\text{exp}(-\beta(1-f_{test}F_{train}^T)L_{train}
exp(−β(1−ftestFtrainT)Ltrain 则是 cache model 的工作方式。其中
(
1
−
f
t
e
s
t
F
t
r
a
i
n
T
)
(1-f_{test}F_{train}^T)
(1−ftestFtrainT) 相当于计算测试图像的特征与 few shot 训练集各个图像特征的欧氏距离,取指数保证值全正,
β
\beta
β 用于调制分布的锐度。这个过程相当于在 cache model 中检索出最相似的 value。
实验
观察在10个数据集上的 few shot 分类实验结果,Tip-Adapter 不训练任何参数,在多个数据集上得到了与 CoOp、CLIP-Adapter 等微调方式接近的性能,甚至在某些数据集上更高。而加上参数微调的 Tip-Adapter-F 优于现有的 CLIP few shot 微调方法,达到 SOTA 性能。
总结
cache model 的思路类似于 proto(原型) 的方法,在很多 few shot、meta learning 的方法(如 MAML、matching network 等)中早已经出现,Tip-Adapter 将其用于 CLIP few shot learning 中,再借鉴 CLIP-Adapter 中残差连接的方式,将 key-value cache model 中的 few-shot 样本知识与预训练 CLIP 中图文相似度计算的能力综合起来,取得了 CLIP few shot 微调的 SOTA 性能。