CoOp - CLIP 自适应Prompt工程 【一】

又开一坑,最近准备介绍 CLIP多模态大模型 相关的后续优化,首先我们可以聊一下在 Prompt Engineering(提示工程)上, 后面的作者都做了什么工作,因为 提示工程 是我们最容易实现&资源最友好的工作了。

下面会有如下几篇博文进行  Prompt Engineering 方面的工作的阐述:

         【1】 CoOp - CLIP 自适应 Prompt 工程 [本文]

         【2】CoCoOp - CLIP 自适应 Prompt 工程

一. 综述

由于大模型的推陈出新,大模型的资源消耗让很多人对于模型的重新训练 & 微调 难以实现。因此仅利用提示词,在没有或者极少量的数据下引导 模型对于我们业务下有更好的效果 的工程方式,简称 Prompt-Engineering。 被学术 & 工业界 大量应用。 但是由于 Prompt 词需要大量的人工来进行 微调和使用,该 分享 向大家介绍一个 基于 多模态模型 - Coop 自适应学习Prompt词汇,来做到符合业务预期, 带来更好效果的工作。

二. 背景

我们都知道,对于大模型来说。 Prompt Engineering [特征工程] 成为一个越来越重要的方向和工作, 在包括GPT【生成式大模型】以及 CLIP【对比式大模型】等工作都在采用相关的策略。可以做到无需训练 Or 少量数据进行微调的情况下。在 敢兴趣的业务中实现 SOTA 的效果。

虽然Prompt Engineering 成为了一个重要的工作,但是这通常需要花费极大量的时间。 因为 业务千人千面, 每一个不同的 子数据集 都需要花费大量的时间进行措辞的调优,一点点小小的改变都可能会对每一个数据集产生性能上巨大的影响, 这个对于多模态大模型 CLIP 的影响尤甚:

[1] 对于 Caltech101 数据集, 首先传统的CLIP训练的提示词 "a photo of [CLS]" 在 数据集中的准确率甚至 干不过 "a [CLS]", 但是如果在提示词中加入 "a", 准确率 就大幅提升。

[2] 在 Flowers102 和 DTD 数据集中。 由于数据集 分别是花朵 以及 纹理质地 的集合。对Flower 数据集 加入 "flower" 相关的语法组成; 在 DTD 中加入 和 "texture" 质地相关的词语, 准确率也大幅提升。

[3] 对于 EuroSAT 图集,因为图片的拍摄模式是来自于 卫星影像。 因此在这份数据集中对于提示词加入图片的来源 "statellite" 。 准确率也会显著提升。

所以我们可以看到,很多数据集都是千人千面的,想要在各种数据集获得最好的效果,需要因地制宜选择其合适的 Prompt词,Prompt词对于结果的影响非常大。

于是由于这个原因,我们能不能利用机器学习的梯度下降的方式,"自适应" 地去寻找到更合适的Prompt词呢? 于是作者 便提出来了 CoOp [Content Optimization] 这个方法,利用 模型训练的方法取自适应执行 Prompt 工程。以获得更好的结果。

三. CoOp 介绍

3.1 综述

本文对于预训练 Prompt 工程, 共提出了 四种不同的变形 :

[1] 待训练 Prompt 词,转换为 可学习的向量 后的 语句构成: 

 t =  [V]1[V]2 . . . [V]M[CLASS]                # 尾部添置 Class
 t =  [V]1[V]M/2 . . [CLASS][V]M/2+1 . . [V]M  # 中部添置 Class

[2] 待学习参数V 分为 [1] 随机初始化向量  [2] 预训练初始化向量,其中 随机初始化向量 为高斯随机采样后的 预训练向量。 预训练初始化即为利用 CLIP预训练Bert word2Vector 转换而成的变量.

[3] 预训练向量 梯度迭代方式, 分为 统一可学习向量 [所有的待识别Class 公用一套向量]; 特定可学习向量 [每一个标签都有自己的 可学习向量] 

  标签判断公式, 其中 ti 为经过 可学习Prompt 后返回的向量

CoOp 向量的学习方式为 基于 交叉熵损失,利用 文本 Encoder 进行反向传播。从而优化 Vi。总体方式和 CLIP 类似。 但在训练过程中利用了 warm-up 知识 [第一个 Epoch 时将学习率 hold 在 1e-5 下] 

CoOp 图示,可以看到整体保持了CLIP的算法结构, 添加了 可学习的 Prompt 参量

 3.2 效果描述

论文中采用了 Zero-Shot & Few-Shot 的形式 [每个 Class 最多 0 ~ 16 个数据进行更新] , 对于11个数据集下进行了效果的评价。 

在 11 个标准的图像数据集中实验的效果比较。 可以说 CoOp 是遥遥领先.

基准测试中利用了 Linear probe 方式,以 "a photo of a [CLASS]"  来进行 Few-shot 预测,我们可以明显的感受到:
[1] 大部分数据集下, CoOp的效果会 明显好于 Linear Probe 形式。且对于 Base model,只有在 8 到 16个 数据集以上的 Few-Shot 才会比 CLIP 的 Zero-Shot 更具优势。
[2] Prompt词语的 语句序列构成, [CLASS] 在中间 和 在末尾 影响较少,说明 文本Encoder 对于 Prompt词的排序序列 有更强的鲁棒性。
[3] 统一可学习向量CSC[特定可学习向量]相比,  明显发现统一可学习向量的效果会更好一些。因为CSC对于每一个 类别,向量都是单独需要训练的,因此训练的数据参数比统一可学习向量多的多,然而在 Few-Shot 数据量明显不够,如果要对CSC有更好的效果,就需要更多的参数来去拟合之。

同时作者也对 Prompt词汇的长度做了一些验证。 如下图所示, 可以看出来一般来说 越长的词汇 会带来更好的性能,但是也会因为 可训练参数的增多,而有效果折损的风险。

文本长度对效果的影响 & CoOp 与 CLIP 原始模型的效果比较

3.3 向量结果可视化分析

我们现在知道了 CoOp 会比 CLIP 带来更好的效果。且学习的 Prompt词是合适的。所以我们就更想探求一下, 这个训练后的prompt语句 是长得什么样的, 可视化后是不是更好的句子呢? 

因此这边作者为了解答这个疑惑,利用CoOp训练后的词向量,利用每个词与预训练词典进行欧式距离计算。 选择最接近的向量词,作为填充,最终构成一句话。

最后计算的结果如图所示:

可以发现 利用 CoOp 训练出来的prompt 词语 并没有更多的 语言逻辑。 作者推测是 学习到的向量可能 超过了 现有的词表 [意思是 word2Vec 在此处并未试], 所以我们这种 可视化方法 是没有意义的。 无法通过 欧式距离来推测 最终prompt 词语 应该是一句什么话语。 

由此可见 CoOp 训练后的 Prompt 词语也是一个 黑盒,他的效果好,但是他是一个我们常人所无法直观理解的方式来做到的。

四. 瓶颈问题

作者在提出了 CoOp 能力后,带来了很不错的效果。但是随着 项目的继续调研,他们发现了一个 CoOp 的关键瓶颈问题:    泛化性折损

对于经过 CoOp 学习过的数据集, 如果说是 CoOp Few-Shot 过的 标签,会带来很好的效果。但是对于 没有 Few-Shot 过的标签, 如图 (b) 所示, CoOp的效果会相比 Zero-Shot 要变差 [说明比Base能力要弱],说明 CoOp会导致 CLIP 泛化性折损。

而作者通过一些方法,就解决了这个问题,而解决的方法就是 模型条件化,以此保证模型本身的泛化性。 于是便产生了论文:  CoCoOp [Conditional Context Optimization] , 这篇论文我们在后面的论文中,对他进行解析~

  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值