CoCoOp(论文解读):Conditional Prompt Learning for Vision-Language Models

摘要

随着预训练的视觉语言模型(如 CLIP)的兴起,研究使这些模型适应下游数据集的方法变得至关重要。最近CoOp方法将NLP领域中的提示学习引入到视觉领域中,来调整预训练的视觉语言模型。具体来说,CoOp 将提示中的上下文转换为一组可学习的向量,并且只需少量带有标签的图像进行学习,就实现比手动修改提示更大的提升。

本文发现 CoOp 的一个关键问题:学习的上下文提示无法扩展到同一数据集中更广泛的未见的类,这表明 CoOp 在训练过程中对基础类别的数据产生了过拟合。

为了解决这个问题,本文提出了条件上下文优化(CoCoOp),它通过学习一个轻量级的神经网络来扩展CoOp,为每个图像生成一个输入条件token(vector)。

与 CoOp 的静态提示相比,本文的动态提示会适应每个实例,因此对类偏移的敏感度较低。大量实验表明,CoCoOp 比 CoOp 对不可见的类别的泛化效果要好得多,甚至显示出超越单个数据集的可转移性,并且还会产生更强的领域泛化性能。

Introduction

最近在大规模的视觉-语言预训练方面的研究在zero-shot图像识别方面取得了惊人的性能,证明了在这种范式下学习开放世界视觉概念的潜力。其中关键设计在于如何对视觉概念进行建模。在传统的监督学习中,标签是离散化的,每个类别都与一个随机初始化的权重向量相关联,该权重向量被学习来最小化相同类别的图像的距离。这种学习方法侧重于封闭集的视觉概念,将模型限制在预定义的类别列表中,当涉及到训练过程中不可见的新类别时是不可扩展的。

相比之下,对于CLIP 和ALIGN等视觉语言模型,分类权重由参数化的文本编码器(如Transformer)通过提示生成。例如,为了区分包含不同品种的狗和猫的宠物图像,可以采用类似“A photo of {class},a type of pet”这样的提示模板作为文本编码器的输入,因此,可以用真实的类别名称填充“{class}”标记来合成用于分类的类特定权重。与离散标签相比,视觉语言模型的监督来源来自自然语言,这使得开放集的视觉概念可以被广泛探索,并已被证明在学习可转移表示方面是有效的。

随着视觉语言模型的兴起,最近开始研究模型如何有效地适应下游数据集。为了适应网络规模的数据,例如CLIP使用的4亿对图像和文本,视觉语言模型被专门设计为具有超高容量,这意味着模型大小是巨大的,通常具有数亿个参数甚至数十亿个参数。因此,对整个模型进行微调,正如深度学习研究中经常采用的那样,是不切实际的,甚至可能损害学习良好的表征空间。

一种更全面的方法是添加一些对任务有意义的上下文来调整提示,例如上述宠物数据集的“a type of pet ”,这已被证明可以提高性能。然而,提示工程非常耗时且效率低下,因为它必须基于反复试验,并且也不能保证最佳提示。为了自动化提示工程,周等最近探索了提示学习的概念,用于调整预训练的视觉语言模型。其方法是上下文优化(CoOp),利用神经网络的可微性,将提示中的文本单词转化为一组可学习的向量。只用少数标记图像用于学习,CoOp 在广泛的图像识别数据集中比密集调整的手动提示取得了巨大的改进。

本文发现 CoOp 的问题:可学习的上下文向量无法泛化到同一任务中不可见的类别。解释图1:CoOp 学习的上下文提示在区分“到达门”和“大教堂”等基类方面效果很好,但当它被迁移到新的类别(如“风电场”和“火车铁路”)时,准确性会显著下降,即使任务的性质保持不变,比如识别场景变化。结果表明,学习到的上下文向量过拟合到基类,因此无法捕获对扩展场景识别至关重要的元素。本文认为该问题是由 CoOp 的静态设计引起的,一旦学习上下文就会固定,并且仅针对一组特定的(训练)类进行优化。相反,zero-shot方法采用的手动设计的提示具有相对的通用性。

为了解决泛化性弱问题,本文引入了一个新概念:条件提示学习。其关键思想是根据每个输入实例(图像)进行提示,而不是一旦学习后固定。为了使模型的参数效率高,本文引入了一种简单而有效的条件提示学习实现。具体来说,本文通过学习一个轻量级神经网络来扩展 CoOp,为每张图像生成一个输入条件token,该token与可学习的上下文向量相结合。本文方法称为条件上下文优化 (CoCoOp)。有趣的是,CoCoOp的范式类似于图像描述,这解释了实例条件提示更具有普遍性的原因:它们经过优化以表征每个实例(对类偏移更有鲁棒性),而不是仅服务于某些特定类。

本文在 11 个数据集上进行了全面的实验,其中涵盖了各种视觉识别任务。具体来说,本文设计了一个从基础类别到新类别的泛化设置,其中首先使用基类学习模型,然后在新类上进行测试。与zero-shot方法和CoOp相比,该方法取得了最佳的整体性能(表1)。重要的是,在不可见类中,CoCoOp 比 CoOp 有了显著的改进(图 3(a)),从而大大缩小了手动提示和可学习提示之间的差距。

在更具挑战性的场景中,为一个任务学习的上下文迁移到一个含有若干不同类别的任务中,CoCoOp仍然比CoOp更具优势(表2),这表明实例条件提示更具可迁移性,并且有潜力在更大规模上取得成功。CoCoOp 还获得了比 CoOp 更强的领域泛化性能(表 3),进一步证明了动态提示的优势。

Methodlogy

3.1. Reviews of CLIP and CoOp

Contrastive Language-Image Pre-training

CLIP已经很好地展示了学习开放集中视觉概念的潜力。CLIP 包含图像编码器和文本编码器。图像编码器可以是 ResNet或ViT,用于将图像转换为特征向量。文本编码器是一个Transformer,一系列单词嵌入作为输入,输出文本特征向量。

在训练过程中,CLIP 采用对比损失来学习两种模态的联合嵌入空间。具体来说,对于batch_size图像-文本对,CLIP 最小化每张图像与匹配文本的余弦相似度,同时最大化与所有其他不匹配文本的余弦相似度,并且每个文本的损失也以类似的方式计算。经过训练后,CLIP可用于zero-shot图像识别。x代表图像编码器生成的图像特征, 为文本编码器生成的一组权重向量,每个权重向量代表一个类别(假设总共有 K 个类别)。具体而言,每个 wi 都来自于一个提示,例如“A photo of {class}”,其中“{class}”标记填充了第 i 个类名。预测概率为:

Context Optimization (CoOp)

CoOp旨在克服提示工程中的低效率问题,以便更好地将预训练的视觉语言模型适应下游任务。CoOp 的关键思想是使用可以从数据中端到端学习的连续向量对每个上下文token进行建模。具体来说,CoOp 没有使用“a photo of a”作为上下文向量,而是引入了 M 个可学习的上下文向量 {v1, v2, . . . , vM },每个向量都与单词嵌入具有相同的维度。第 i 个类的提示内容变为 ti = {v1, v2, . . . , vM , ci},其中 ci 是类别名称的单词嵌入。设g(·) 表示文本编码器,则预测概率为

为了使 CLIP 适应下游图像识别数据集,可以使用交叉熵损失作为学习目标。由于文本编码器 g(·) 是可微分的,因此梯度可以反向传播以更新上下文向量。CLIP 的基础模型在整个训练过程中被冻结,本文也是这样。

3.2. CoCoOp: Conditional Context Optimization

CoOp 是一种数据高效的方法,允许仅使用下游数据集中少量的标记图像来训练上下文向量。然而,CoOp 不能推广到同一任务中不可见的类别。本文认为,实例条件上下文可以更好地泛化,因为它为了减少过拟合,将焦点从一组特定的类别转移到每个输入实例,从而转移到整个任务上。

实现 CoCoOp 的一种简单方法是构建 M 神经网络来获取 M 上下文token。但是这样的设计需要 M 倍神经网络的大小,这比 CoOp 中的 M 个上下文向量要大得多。本文提出了一种在实践中非常有效的参数效率设计。解释图2:具体来说,在 M 上下文向量之上,本文进一步学习了一个轻量级神经网络,称为 Meta-Net,用于为每个输入生成一个条件token,然后将其与上下文向量相结合。

hθ(·)代表由θ参数化的Meta-Net,则当前的上下文提示为:

其中x表示图像的特征向量,π = hθ(x)为Meta-Net生成的实例条件,vm表示原本第m个(m ∈ {1, 2, ..., M })的可学习的上下文向量。因此文本提示成为:

预测概率:

在训练过程中,本文更新上下文向量 以及 Meta-Net 的参数 θ。在这项工作中,Meta-Net采用两层瓶颈结构构建,其中隐藏层将输入维度降低了16×。Meta-Net 的输入只是图像编码器的输出特征。

Limitations

第一个限制是关于训练效率:CoCoOp 的训练速度很慢,如果将批处理大小设置为大于 1,则会消耗大量 GPU 内存。这是因为 CoCoOp 基于实例条件设计,该设计要求每个图像通过文本编码器独立转发特定于实例的提示(每张图像都会前向传递自己的实例提示)。这与 CoOp 的效率要低得多,CoOp 只需要通过文本编码器对任何大小的整个小批量进行一次前向传递提示。

第二个限制是,在 11 个数据集中的 7 个数据集(见表 1)中,CoCoOp 在不可见类别的表现仍然落后于 CLIP,这表明需要付出更多努力才能完全缩小或推翻手动提示和可学习提示之间的差距。

 Discussion and Conclusion

本文解决了大型预训练人工智能模型的可用性的一个重要问题,即如何使它们适应下游应用。这些模型,也称为基础模型,在视觉和NLP领域中都受到了学术界和工业界越来越多的关注,因为它们在处理各种下游任务的能力方面非常强大。但是,基础模型在数据规模和计算资源方面进行预训练的成本很高,并且通常包含大量的参数,以便开发足够的能力。例如,我们实验中使用的基于ViT-B/16的CLIP模型具有高达150M的参数大小。这些因素共同凸显了研究有效的适应方法以实现基础模型民主化的必要性。

本文遵循参数高效提示学习的路线,为静态提示的泛化性问题提供了解决方法,更重要的是,表明基于条件提示学习的简单设计在各种问题场景中都表现出色,包括从基础类别到新类别的泛化、跨数据集提示迁移和领域泛化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402447.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言初阶】C语言指针全攻略:解锁C语言深层奥秘的钥匙

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言操作符 🌹🌹期待您的关注 🌹🌹 ❀指针 📒1. 指针和指…

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载

前端各种文本文件预览 文本编辑excel预览编辑 pdf预览word预览 excel下载pdf下载word下载 各种文本文件预览(pdf, xlsx, docx, cpp, java, sql, py, vue, html, js, json, css, xml, rust, md, txt, log, fa, fasta, tsv, csv 等各种文本文件) 其中 除p…

C 408—《数据结构》算法题基础篇—数组(通俗易懂)

目录 Δ前言 一、数组的合并 0.题目: 1.算法设计思想: 2.C语言描述: 3.算法的时间和空间复杂度 : 二、数组元素的倒置 0.题目 : 1.算法设计思想 : 2.C语言描述 : 3.算法的时间和空间复杂度 : 三、数组中特定值元素的删除 0.题目 : …

SpringBoot3 + Flowable7 工作流引擎使用笔记

目录 Flowable 简介流程设计器安装使用 SpringBoot 3 整合表结构流程部署启动流程流程审批流程挂起和激活任务分配固定分配表达式分配值表达式方法表达式 监听器分配 流程变量运行时变量历史变量 身份服务候选人拾取任务归还任务指派给别人候选人组创建用户创建用户组用户关联用…

VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库

VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …

C语言传递指针给函数

C 语言允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值 实例1:获取系统的时间值 能接受指针作为参数的函数,也能接受数…

为什么Pandas是最流行的Python数据分析库?

本文将从Python生态、Pandas历史背景、Pandas核心语法、Pandas学习资源四个方面去聊一聊Pandas,期望能带给大家一点启发。 一、Python生态里的Pandas 五月份TIOBE编程语言排行榜,Python追上Java又回到第二的位置。Python如此受欢迎一方面得益于它崇尚简…

零成本 API 服务搭建,用 GitHub Actions 自动爬取文章?

前言 本着将成本降到最低,我目前做的应用或小程序都是单机的,也就是不用请求接口,只要一上架就没有任何支出。但是写死的数据毕竟有限,应用的内容单一无法紧跟时事热点,每次打开一个样,自然就没有留存。遇…

Redis13-多级缓存

目录 概述 JVM进程缓存 Caffeine 实现进程缓存 Lua语法 初识Lua 变量和循环 Lua的数据类型 声明变量 循环 条件控制、函数 函数 条件控制 实现多级缓存 安装OpenResty OpenResty快速入门 请求参数处理 查询Tomcat 发送http请求的API 封装http工具 CJSON工…

CSS小玩意儿:文字适配背景

一&#xff0c;效果 二&#xff0c;代码 1&#xff0c;搭个框架 添加一张背景图片&#xff0c;在图片中显示一行文字。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南(限时开放)

文章目录 前言一.playwright是什么二.python引入playwright1.安装2.playwright命令行参数3.playwright codegen自动生成代码4.Chrome和Chromium有什么关系&#xff1f; 三.基本概念1. 无头浏览器&#xff08;Headless Browser&#xff09;2.同步和异步模式操作playwright2.1.同…

SQL每日一练-0815

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别&#xff0c;显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表&#xff1a;Products 和…

RockerMQ学习

消息中间件以前常用RabbitMQ和ActiveMQ&#xff0c;由于业务需要&#xff0c;后期业务偏向大数据&#xff0c;现着重学习一下RocketMQ&#xff08;RocketqMQ原理同ctg-mq&#xff09;&#xff0c;后续更新Kafka 一、RocketMQ特性 Kafka特性 &#xff08;高性能分布式&#xff…

day34-nginx常用模块

## 0. 网络面试题 网络面试题: TCP三次握手 TCP四次挥手 DNS解析流程 OSI七层模型 抓包工具 tcpdump RAID级别区别 开机启动流程 如何实现不同的网段之间通信(路由器) ip route add 192.168.1.0 255.255.255.0 下一跳的地址或者接口 探测服务器开启了哪些端口(无法登录服务器…

渗透测试-行业术语

1.肉鸡 肉鸡用来比喻哪些可以随意被我们控制的计算机&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型服务器或者其他网络设备&#xff0c;我们可以像操作自己的电脑一样操作他们而不被发觉。 2.木马 表面上伪装成了正常程序&#xff0c;但是当程序被运行的时候&a…

配置MySQL主从,配置MySQL主主 +keeplive高可用

在大数据-Hadoop体系中 配置MySQL主主keeplive高可用 注意&#xff1a;这个是我两年前的word文档&#xff0c;可以当作参考文档有个思路参考一下&#xff0c;但是里面可能有些地方有误 另外 :关于一些企业级实战技术可以参考这篇mysql 物理备份 MySQL 全量备份 增量备份 差异…

Linux_vi vim的使用

目录 vi和vim的基本介绍 vi和vim常用的三种模式 案例演示 vim的快捷键 快捷键使用练习 vi和vim的基本介绍 linux系统内会内置vi文本编译器。vim可以简单认为是vi的增强版本。 vi和vim常用的三种模式 有正常模式&#xff0c;移动光标&#xff0c;删除字符等。插入模式可以进…

Flask 线上高并发部署方案实现

目录 1、Flask默认多线程执行 2、使用gevent.pywsgi实现 3、是用uWSGI服务器实现 1、Flask默认多线程执行 前言&#xff1a;在Flask的较早版本中&#xff0c;默认并不支持多线程模式。然而&#xff0c;从Flask 0.9版本开始&#xff0c;引入了多线程模式的支持&#xff0c;并…

【自动驾驶】ROS中的TF坐标变换(一):静态坐标变换

目录 引子ros中的右手坐标系补充&#xff1a;欧拉角及四元数理解旋转平移操作复合操作 运行坐标变换的例子坐标转换 静态坐标变换-发布坐标系信息创建功能包 静态坐标变换-订阅坐标系信息添加cpp订阅者主文件修改cmakelist文件编译报错的解决方案运行程序进行测试 引子 机器人…

【MySQL数据库】单机、集群、分布式的区别

单机、集群和分布式是计算机系统中三种不同的架构模型,它们在资源管理、任务执行和性能优化方面有显著区别。 图片来源 1. 单机(Standalone) 单机指的是单一计算机系统,即所有的计算任务和数据都在一台计算机上处理。单机系统的特点包括: 硬件限制:受限于单台机器的计…