当前位置: 首页 > news >正文

Clip微调系列:《coOp: learning to prompt for vision-language models》

论文链接:arxiv.org/pdf/2109.01134v1

推荐视频(clip_coop的代码逻辑讲解,代码简单,有助于理解):CLIP和CoOp工作的简单Pytorch复现和理解_哔哩哔哩_bilibili

其他参考链接:CoOp - CLIP 自适应Prompt工程 【一】_coop clip-CSDN博客 


 动机

如下图所示,有三种手工设计的prompt提示词:

  1. a [class]
  2. a photo of [class]
  3. a photp of a [class]

用这三种提示词去做zero-shot测试,实验发现尽管这三种提示词在我们人为看来区别不大,但是实际结果却不同------>文本输入(即提示词)对下游数据集性能起关键作用。

因此,作者提出:想让机器自己学习到最合适的prompt提示词来获得更好的结果


具体方法

如下图所示,原本在CLIP中,文本端的输入就是人为手工设计的prompt + class(A photo if a [class]);

具体而言,就是

1. 先给定所有的标签labels,然后加上prompt(A photo of) 变成完整的input

2. 再使用tokenizer(bert中先wordpieces)将人能看懂的词语映射成为768维的向量,这里又10个labels,所以是[10,768]维的输入到Text Encoder。

下图是coOp的方法,文本输入端的prompt 变成了 可学习的向量 + class。

具体而言:

1. 刚开始给的还是 a photo of [class]

2. 将这个a photo of [class] 传给预训练好的模型,加载预训练权重,得到学习好的这个句子对应的向量(10,4,768);

3. clip中原本就直接用这个得到的向量去和图片做交叉熵损失找出相似度最大的类别;

4. coOp得到预训练模型学习好的向量以后,把class类别的向量冻结住;

5. 将得到的4(A photo of [class])的前三个向量当作初始值,然后去学习;

 6. 将学习后得到的这三个向量再和[class]拼接回原来的模样,再去 做相似度计算。

最终得到的前三个向量也就是我们学习得到的prompt,作者将每个词向量与预训练词典进行欧式距离计算。 选择最接近的向量词,作为填充,最终构成一句话,发现其实没有语言逻辑,人是看不懂的。


细节

其实作者考虑了两种可学习prompt:unified context统一可学习 , class-specific context特定类别可学习

我们上面举的例子是 unified context,也就是虽然有十个类别,但是学习到的learnable prompt 都是相同的;

还有一种class-specific context就是不同的类别对应一种learnble prompt。

还考虑了[class]在句子中的不同位置:mid or end.

下面是实验结果:

都是少样本训练(0-16个样本量)

  1.  大部分数据集下, CoOp的效果会明显好于 Linear Probe 形式。且对于 Base model,只有在 8 到 16个 数据集以上的 Few-Shot 才会比 CLIP 的 Zero-Shot 更具优势。
  2. Prompt词语的 语句序列构成, [CLASS] 在中间 和 在末尾 影响较少,说明 文本Encoder 对于 Prompt词的排序序列 有更强的鲁棒性。
  3. 统一可学习向量unfiied context 与特定可学习向量class-specific context 相比,  明显发现 unified context 的效果会更好一些。

结果3 是因为:训练的数据参数比 统一可学习向量 多的多,然而在 Few-Shot 数据量明显不够,如果要对class-specific context有更好的效果,就需要更多的参数来去拟合。

http://www.lryc.cn/news/589859.html

相关文章:

  • Python 进阶学习之全栈开发学习路线
  • Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中创建甘特图
  • Apache RocketMQ + “太乙” = 开源贡献新体验
  • 【C#】实体类定义的是long和值识别到的是Int64,实体类反射容易出现Object does not match target type
  • 查看.bin二进制文件的方式(HxD十六进制编辑器的安装)
  • Golang学习之常见开发陷阱完全手册
  • 【深度学习】神经网络-part3
  • 第一章 【vue】基础(超详细)
  • 解锁高效Excel技能:摆脱鼠标,快速编辑单元格
  • Git远程仓库与协作技巧详解
  • 如何关闭Elasticsearch的安全认证的解决方法
  • 机器学习sklearn入门:归一化和标准化
  • CG--资料分析1
  • 【后端】配置SqlSugar ORM框架并添加仓储
  • Three.js 实战:使用 PBR 贴图打造真实地面材质
  • 《Qt实战开发》:从计算器到音乐播放器的全栈实现指南
  • 从理论到实践:操作系统进程状态的核心逻辑与 Linux 实现
  • echarts 自定义图例,并且一个图列控制多个系列
  • 在 kubernetes 上安装 jenkins
  • argo-rollouts部署
  • 分块(chunked) vs 滑动窗口(windowed)
  • 开源模型应用落地-qwen模型小试-Qwen3-Embedding 模型集成 vLLM 实战解析(二)
  • 产品更新丨谷云科技 iPaaS 集成平台 V7.6 版本发布
  • Grok 系列大模型:xAI 的智能宇宙探秘
  • 使用 CrewAI 进行股票分析:自动化投资决策的新途径
  • 压力测试Apache Bench(ab)
  • Anspire Open暑期上新季 - 第二弹Anspire Browser Agent,开启云端自动化新纪元
  • Go语言自学笔记(2.3-2.6)
  • iOS 性能监控工具全解析 选择合适的调试方案提升 App 性能
  • 【游戏引擎之路】登神长阶(十九):3D物理引擎——岁不寒,无以知松柏;事不难,无以知君子