CLIP微调方式

CLIP微调方式:Prompt Engineering 与 Adapter

CLIP 利用互联网上大量的图像文本对作为训练数据,利用文本作为监督信号,展现出了令人惊叹的视觉 zero-shot 分类能力。同时,CLIP 的视觉编码器也是一个很强的视觉 backbone,在很多视觉任务上都能取得不错的性能。然而,互联网数据数据虽然规模巨大,但是数据质量终归不如人工标注数据。CLIP 模型受到预训练数据噪声和数据分布的影响,有着很大的 bias。在很多下游应用任务中,zero-shot 并不是唯一的选择。收集少量特定下游任务的数据,在 CLIP 预训练的基础上进行微调,也是一种有效的方式。

本文主要介绍 prompt engineering 和 adapter 两类 CLIP 微调方式。

Prompt Engineering

不同于常规的视觉预训练-微调范式(如在 ImageNet 1K 分类数据集上进行有监督预训练),文本塔的存在赋予了 CLIP 进行 prompt engineering 的能力,从而有极强的灵活性。首先,像原文中的做法一样,CLIP 可以直接通过手工构造 prompt 进行 zero shot 的图像分类;其次,我们也可以借鉴在 NLP 领域已经取得一些研究成果的 prompt engineering 的方式,来微调多模态模型。

CoOp

Zeroshot 是 CLIP 最令人惊艳的能力,原文作者通过使用一些简单的文本 prompt(如 A photo of [CLASS])来构造分类器,就在 ImageNet 上得到了不错的结果。然而,prompt 的设计比较繁琐,我们不知道什么样的 prompt 是合适的。对于神经网络而言,可能 prompt 中微小的措辞变化,就会造成结果的巨大差异。而且,对于不同的任务,不同的数据,我们往往需要设计不同的 prompt。在 CLIP 原文中,作者为了适应 ImageNet 一个数据集中的数据分布,就设计了 80 个 prompt 模板。

CoOp(Context Optimization)的出发点是让模型自己学习构建 prompt。最终模型学习出的 prompt 可能对于人类来说是无意义的、不可读的,但是对于模型来说,在给定数据上确实可以得到更优的结果。这与语义空间的连续性有关。

下图展示了同一个 CLIP 模型,使用各种不同的手工 prompt 和 CoOp 这种可学习 prompt 的性能对比,可以看到不同的 prompt 在不同的数据集上确实会造成巨大的性能差异,而使用 CoOp,让模型自己学习 prompt,性能有显著的提升。

在这里插入图片描述

CoOp 具体是怎么做的呢?其方法框架如下图所示。在 CLIP 使用图像文本对进行对比学习预训练之后,常规的 zeroshot 方法是设计一些 prompt 模板,如 A photo of [CLASS],将类别名填入构造出文本,然后比较图像特征和各个类别文本特征的相似度,预测图像的类别。而 CoOp 则是在类别名前面加上一组可学习的 token [ V ] M [V]_M [V]M。然后前向传播计算出文本特征和图像特征,再根据标签计算交叉熵损失,反向传播,更新可学习 token [ V ] M [V]_M [V]M 的参数。注意训练时原来预训练的 CLIP 权重是固定的,只更新可学习 token。

在这里插入图片描述

CoOp 有几种不同的变体,改变可学习 token 的个数,将类别名与可学习 token [ V ] M [V]_M [V]M 的位置关系,是否对不同的类别学习不同的 prompt token 等。

下图展示了 CoOp 在 11 个数据集上与 Linear Probe CLIP 的少样本对比实验。可以看到:

  1. 整体而言,CoOp 这种学习 prompt 的方式,相比于直接线性微调,在少样本时优势比较明显
  2. 不同的数据集(数据分布),对 prompt 的敏感程度差的比较大。如第三行第一列的 Food101,学习 prompt 的提升不大,但是线性微调还是有提升。
  3. 和 CLIP 原文中的结论一样,对于 CLIP 来说,很多时候给几个样本微调,还(远远)不如直接 zeroshot,比如 Food101 数据集。

在这里插入图片描述

消融实验的结果就不贴了,感兴趣可以直接去原文看。

我们不禁好奇,CoOp 中模型学到的 token embedding,到底与哪个自然语言的 embedding 比较接近呢?下表展示了 CoOp 在不同数据集上学习到的 prompt token 在词表中最接近的词。可以看到,几乎没啥可解释性。

在这里插入图片描述

CoCoOp

CoOp 虽强,但只能在微调数据集上出现过的类别上表现较好,如果是未曾见过的类别,CoOp 的泛化能力一般比较差。CoCoOp(Conditional Context Optimization)在 CoOp 的基础上,加入了一种实例级的条件。image encoder 先计算出图像特征,然后经过一个 MetaNet,得到 meta token,将这个 meta token 拼接到原本 CoOp 中可学习的 tokens [ v 1 , v 2 , … , v M ] [v_1,v_2,\dots,v_M] [v1,v2,,vM]​ 上,送入 text encoder 提取最终的文本特征,将这个文本特征再与图像特征计算相似度。这里之所以是叫 MetaNet,我理解是期望它学习到根据 image embedding 生成条件 meta token 的 ”元能力“。

这样,CoCoOp 不仅在微调时见过的类别上有更好的分类能力,还能借助 MetaNet 学习到实例级的条件能力,根据不同图片,使用不同的 context prompt tokens。

在这里插入图片描述

下表对比了 CLIP、CoOp 和 CoCoOp 在不同的分类数据集上的性能。其中训练时仅使用 Base 类别训练,测试时在 Base 类别和为见过的 New 类别上都进行测试。可以看到,虽然 CoCoOp 可能在 Base 和 New 两种类别上的综合性能明显更强。

在这里插入图片描述

MaPLe

之前的工作都是在文本侧进行单模态的 prompt engineering ,MaPLe 探究了在图文双塔进行多模态的 prompt engineering。并且,相比于之前只在输入上进行 prompt engineering,MaPLe 做的更深,在 Transformer 的前面多层都添加了可学习的 token。为了增强两种模态可学习 token 的协同作用,还加入了一个线性层 F \mathcal{F} F 来将文本侧的额外 token 映射为图像侧的额外 token,而不是两种 token 各自独立。

总结起来,MaPLe 的改进点有三:1. 在图文两侧都加入了可学习的 token;2. 加深,在前面多层都加;3. 使用一个线性层提高图文两侧额外 token 的交互。

在这里插入图片描述

MaPLe 在泛化能力上相比于 CoCoOp 又有了较大的提升。

在这里插入图片描述

Adapter

除了 Prompt Engineering 之外,最近流行的各种 Adapater 的高效微调方式也很适合 CLIP 模型,通过少量参数微调达到即可达到与全量微调相当的性能。

CLIP Adapter

本文通过在 CLIP 的文本编码器、图像编码器中插入 adapter 模块,对比 CoOp 实现了更优的微调性能。

CLIP Adapter的架构及其与其他方式的对比如下图所示。一张图片经过 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 train ∈ R N K × C \mathbf{F}_\text{{train}}\in\mathbb{R}^{NK\times C} FtrainRNK×C ,其中 C 是视觉特征的维度。对 N 个类别取 OneHot 标签,得到 L train ∈ R N K × N \mathbf{L}_\text{train}\in\mathbb{R}^{NK\times N} LtrainRNK×N 。将 F train \mathbf{F}_\text{train} Ftrain 作为 keys,将 L train \mathbf{L}_\text{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} ftestR1×C ,分别经过 cache model 和 clip classifier,将得到的 logits 进行加权融合,得到最终的 logits,用于图像分类。最终的 logits 的计算公式为:
logits = α ⋅ exp ( − β ( 1 − f t e s t F train T ) L train + f t e s t W c T \text{logits}=\alpha\cdot\text{exp}(-\beta(1-f_{test}\mathbf{F}_\text{train}^T)\mathbf{L}_\text{train}+f_{test}W_c^T logits=αexp(β(1ftestFtrainT)Ltrain+ftestWcT
其中 α \alpha α 是权重系数, W c W_c Wc 是 CLIP 预训练的分类器(即 CLIP 原文中进行 zero-shot 分类的方式), exp ( − β ( 1 − f t e s t F train T ) L train \text{exp}(-\beta(1-f_{test}\mathbf{F}_\text{train}^T)\mathbf{L}_\text{train} exp(β(1ftestFtrainT)Ltrain 则是 cache model 的工作方式。其中 ( 1 − f t e s t F train T ) (1-f_{test}\mathbf{F}_\text{train}^T) (1ftestFtrainT) 相当于计算测试图像的特征与 few shot 训练集各个图像特征的欧氏距离,取指数保证值全正, β \beta β 用于调制分布的锐度。这个过程相当于在 cache model 中检索出最相似的 value。

在这里插入图片描述

观察在10个数据集上的 few shot 分类实验结果,Tip-Adapter 不训练任何参数,在多个数据集上得到了与 CoOp、CLIP-Adapter 等微调方式接近的性能,甚至在某些数据集上更高。而加上参数微调的 Tip-Adapter-F 优于现有的 CLIP few shot 微调方法,达到 SOTA 性能。

在这里插入图片描述

图6. Tip-Adapter在10个数据集上的few shot分类性能

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 性能。

总结

本文介绍了 Prompt Engineering 和 Adapter 两类 CLIP 微调方法。CLIP 可以说是多模态领域奠基之作,其借助文本塔构建的图文多模态联合语义空间赋予了图片理解更多的灵活性和想象空间,使得视觉领域的 zeroshot 分类成为了可能。并且,这种自然语言带来的灵活性在微调时也提供了更多的可能,尤其是 Prompt Engineering 这一类方法。

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值