论文《Exploring to Prompt for Vision-Language Models》阅读
- 论文概况
- 论文动机(Intro)
- Methodology
- Preliminary
- CoOp
- [CLASS]位置
- Context 是否跨 class 共享
- 表示和训练
- Experiments
- Overall Comparison
- Domain Generalization
- Context Length (M) 和 backbone选择
- 和 Prompt Ensembling的比较
- 与精调模型进行比较
- 可解释性
- 总结
论文概况
今天带来的论文是《Exploring to Prompt for Vision-Language Models》,主题是基于CLIP的VLPT(Vision-Language Pre-Training)模型的提示学习(Prompt Learning),论文提出框架 CoOp (Context Optimization),通过一个简单的提示向量自动学习的idea,完成了相当不错的结果。
论文由南洋理工S-Lab发表,发表在IJCV上(2022)。
论文地址:https://arxiv.org/abs/2109.01134
代码地址:https://github.com/KaiyangZhou/CoOp
论文动机(Intro)
诸如 CLIP 和 ALIGN 等 VLPT模型证明了这种 文本-图像对齐的大模型的巨大潜力。通过 提示 (Prompting),VLPT可以很好地用于下游任务。
提示学习的重要性:随随便便改动一下prompt,即使意思相同,模型的表现也会有很大的不同。如下图所示:
a photo of [CLASS]
a photo of a [CLASS]
即使只是差一个“a”,在结果上也能体现出5个点左右的差异。
其余的观察:
(1)如加入描述性后缀,如“a type of flower”,“texture”,也会影响分类表现;
(2)加入描述性前缀也会影响推荐性能,如“a centered satellite photo”
基于上述观察,作者提出了CoOp,共包含两个implementations:
- Unified Context,即针对不同的class使用同一套prompt,不单独进行区分
- Class-specific Context,即针对单独的分类class单独一套prompt embedding
Methodology
Preliminary
CLIP的大致流程:
text encoder(通常为Transformer)负责对文本进行编码(对于分类任务,具有多个分类class的文本,通过将其融入prompt,输入text encoder);
image encoder(通常为ResNet或ViT)负责对图片进行编码;
通过cosine对比相似度,完成下游的分类任务
这里统一介绍一下符号并介绍一下基本设置:
(1)prompt处理:对于模板“a photo of [CLASS]”,当前的label如果是“dog”,那么先替换进去,生成“a photo of dog”,在前面后面分别加上特殊标记token,生成“[SOS] a photo of dog [EOS]”,prompt最多容纳77个token(CLIP限制)。Transformer将其映射成512维的embedding,[EOS]作为整个prompt句子的代表被用于后续的对比(需要通过 Layer Normalization 操作和 Linear Projection Layer)
(2)Training: CLIP经历了共计 400 million个 高质量 图片-文本对的预训练过程
(3)Zero-Shot 推理:CLIP蕴含了大量的先验知识, f \mathbf{f} f 代表图片 x x x 的 encoding 向量,对于 K K K 个分类对应的prompt,CLIP 输出了 { w } i = 1 K \{\mathbf{w}\}_{i=1}^{K} {w}i=1K 共 K K K 个 text encoding embedding。然后通过一个 softmax 进行相似度计算:
p
(
y
=
i
∣
x
)
=
exp
(
cos
(
w
i
,
f
)
/
τ
)
∑
j
=
1
K
exp
(
cos
(
w
j
,
f
)
/
τ
)
,
p(y=i \mid \boldsymbol{x})=\frac{\exp \left(\cos \left(\boldsymbol{w}_{\boldsymbol{i}}, \boldsymbol{f}\right) / \tau\right)}{\sum_{j=1}^K \exp \left(\cos \left(\boldsymbol{w}_{\boldsymbol{j}}, \boldsymbol{f}\right) / \tau\right)},
p(y=i∣x)=∑j=1Kexp(cos(wj,f)/τ)exp(cos(wi,f)/τ),
其中,
τ
\tau
τ 是温度系数,这个宏参一般还挺重要。
CoOp
事实上,CoOp 就只是把原来离散的 prompt (是指通过人手动输入)更改为一些需要学习的连续向量。形式上表现为以下格式:
[CLASS]位置
(1)放在末尾:
t = [ V ] 1 [ V ] 2 … [ V ] M [ C L A S S ] \boldsymbol{t}=[\mathrm{V}]_1[\mathrm{~V}]_2 \ldots[\mathrm{V}]_M[\mathrm{CLASS}] t=[V]1[ V]2…[V]M[CLASS]
(2)放在中间:
t
=
[
V
]
1
…
[
V
]
M
2
[
C
L
A
S
S
]
[
V
]
M
2
+
1
…
[
V
]
M
\boldsymbol{t}=[\mathrm{V}]_1 \ldots[\mathrm{V}]_{\frac{M}{2}}[\mathrm{CLASS}][\mathrm{V}]_{\frac{M}{2}+1} \ldots[\mathrm{V}]_M
t=[V]1…[V]2M[CLASS][V]2M+1…[V]M
Context 是否跨 class 共享
(A)多个 class 共享一套参数,即:
[
V
]
1
i
[
V
]
2
i
…
[
V
]
M
i
=
[
V
]
1
j
[
V
]
2
j
…
[
V
]
M
j
[\mathrm{V}]_1^i[\mathrm{~V}]_2^i \ldots[\mathrm{V}]_M^i = [\mathrm{V}]_1^j[\mathrm{~V}]_2^j \ldots[\mathrm{V}]_M^j
[V]1i[ V]2i…[V]Mi=[V]1j[ V]2j…[V]Mj
其中
i
≠
j
i \neq j
i=j and
i
,
j
∈
{
1
,
…
,
K
}
i, j \in\{1, \ldots, K\}
i,j∈{1,…,K}.
这种叫做 Unified Context;
(B)不同 class 不共享,单独一套embedding,即:
[
V
]
1
i
[
V
]
2
i
…
[
V
]
M
i
≠
[
V
]
1
j
[
V
]
2
j
…
[
V
]
M
j
[\mathrm{V}]_1^i[\mathrm{~V}]_2^i \ldots[\mathrm{V}]_M^i \neq[\mathrm{V}]_1^j[\mathrm{~V}]_2^j \ldots[\mathrm{V}]_M^j
[V]1i[ V]2i…[V]Mi=[V]1j[ V]2j…[V]Mj
其中
i
≠
j
i \neq j
i=j and
i
,
j
∈
{
1
,
…
,
K
}
i, j \in\{1, \ldots, K\}
i,j∈{1,…,K}.
这种叫做 Class-Specific Context (CSC)。
表示和训练
上述两个分别进行排列组合,得到 1A ; 1B; 2A; 2B 四种格式,用于后面实验进行分析。
针对不同的 class 进行相似度比照:
p ( y = i ∣ x ) = exp ( cos ( g ( t i ) , f ) / τ ) ∑ j = 1 K exp ( cos ( g ( t j ) , f ) / τ ) p(y=i \mid \boldsymbol{x})=\frac{\exp \left(\cos \left(g\left(\boldsymbol{t}_i\right), \boldsymbol{f}\right) / \tau\right)}{\sum_{j=1}^K \exp \left(\cos \left(g\left(\boldsymbol{t}_j\right), \boldsymbol{f}\right) / \tau\right)} p(y=i∣x)=∑j=1Kexp(cos(g(tj),f)/τ)exp(cos(g(ti),f)/τ)
通过 cross-entropy 计算分类损失,通过梯度传播更新提到的 { [ V ] 1 i [ V ] 2 i … [ V ] M i } i = 1 K \{[\mathrm{V}]_1^i[\mathrm{~V}]_2^i \ldots[\mathrm{V}]_M^i\}_{i=1}^{K} {[V]1i[ V]2i…[V]Mi}i=1K。
Experiments
这部分简要介绍结果,不再过多赘述
Overall Comparison
整体上来讲,CoOp表现随着 k-shot 中 k 的提高性能不断提高,且基本能够超过 zero-shot 的 CLIP 的表现,一开始比不过应该也正常,毕竟 embedding 还没学到什么东西;在OxfordPets和Food101上不太理想,作者推测是数据集质量不太高;另外,unified基本好过CSC(大部分情况,也有例外)。
具体提高统计为:
如上所说,Food101表现失准。
Domain Generalization
可迁移性,分别通过在 ImageNet 上训练,并在相关的 ImageNetV2,ImageNet-Sketch,ImageNet-A,ImageNet-R 数据集上进行测试,结果如下:
Context Length (M) 和 backbone选择
基本上,
M
=
8
M=8
M=8 或者
M
=
16
M=16
M=16 效果较好;
ViT-B/16 作为 图像编码器 效果更好些。
和 Prompt Ensembling的比较
Prompt Ensembling 就是将 好几个 prompt 对应的分类器进行组合,从而用于提高分类效果。
结果如下:
与精调模型进行比较
CoOp表现好于其他精调结果,而且精调结果提升不大,退步反而不小。
可解释性
作者在语义空间中,通过比较相似性(欧氏距离),找到与最终任务最相关的 token,看看有没有语义上的可解释性。
总结
本文提出了 CoOp, 一个针对 CLIP 的 Prompt Learning 方法,方法简单但是有效。