论文《Exploring to Prompt for Vision-Language Models》阅读

论文《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),论文提出框架 CoOpContext Optimization),通过一个简单的提示向量自动学习的idea,完成了相当不错的结果。

论文由南洋理工S-Lab发表,发表在IJCV上(2022)。

论文地址:https://arxiv.org/abs/2109.01134
代码地址:https://github.com/KaiyangZhou/CoOp

论文动机(Intro)

诸如 CLIP 和 ALIGN 等 VLPT模型证明了这种 文本-图像对齐的大模型的巨大潜力。通过 提示 (Prompting),VLPT可以很好地用于下游任务。

提示学习的重要性:随随便便改动一下prompt,即使意思相同,模型的表现也会有很大的不同。如下图所示:
Illustration Example

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

Architecture

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=ix)=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=ix)=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

Overall Performance Comparison
整体上来讲,CoOp表现随着 k-shot 中 k 的提高性能不断提高,且基本能够超过 zero-shot 的 CLIP 的表现,一开始比不过应该也正常,毕竟 embedding 还没学到什么东西;在OxfordPets和Food101上不太理想,作者推测是数据集质量不太高;另外,unified基本好过CSC(大部分情况,也有例外)。

具体提高统计为:
Improvement
如上所说,Food101表现失准。

Domain Generalization

可迁移性,分别通过在 ImageNet 上训练,并在相关的 ImageNetV2,ImageNet-Sketch,ImageNet-A,ImageNet-R 数据集上进行测试,结果如下:
Domain Generalization

Context Length (M) 和 backbone选择

Performance w.r.t M and backbone
基本上, M = 8 M=8 M=8 或者 M = 16 M=16 M=16 效果较好;
ViT-B/16 作为 图像编码器 效果更好些。

和 Prompt Ensembling的比较

Prompt Ensembling 就是将 好几个 prompt 对应的分类器进行组合,从而用于提高分类效果。
结果如下:
Comparisions with Prompt Ensembling

与精调模型进行比较

Comparisons with Fine-Tuning
CoOp表现好于其他精调结果,而且精调结果提升不大,退步反而不小。

可解释性

作者在语义空间中,通过比较相似性(欧氏距离),找到与最终任务最相关的 token,看看有没有语义上的可解释性。

Interpretability

总结

本文提出了 CoOp, 一个针对 CLIP 的 Prompt Learning 方法,方法简单但是有效。

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

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

相关文章

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建(1 master 2 worker) 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum,并安装依赖包2.2、安装Docker2.3、设置hostname,修改hosts文件2.4、设置k8s的系统要求…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构,其中编码器将…

CUDA从入门到放弃(七):流( Streams)

CUDA从入门到放弃(七):流( Streams) 应用程序通过流来管理并发操作,流是一系列按顺序执行的命令。不同的流可能无序或并发地执行命令,但此行为并不保证。流上的命令在依赖关系满足时执行&#…

【设计模式】抽象工厂模式详解

抽象工厂 是一种为访问类提供一个创建一族相关或者相互依赖对象的接口,且访问类无须指定所要产品的具体类就可以得到同一族的不同等级的产品模式结构 抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式…

Android room 在dao中不能使用挂起suspend 否则会报错

错误&#xff1a; Type of the parameter must be a class annotated with Entity or a collection/array of it. kotlin.coroutines.Continuation<? super kotlin.Unit> $completion); 首先大家检查一下几个点 一、kotlin-kapt 二、 是否引入了 room-ktx 我是2024年…

Vue CLI 配置与 Nginx 反向代理:无缝连接前后端API通信

在Web开发中&#xff0c;Vue.js用于构建单页面应用。在前后端分离的架构中&#xff0c;Vue应用通常需要通过API与后端服务器交互。所以&#xff0c;Vue CLI工具提供了便捷的开发环境配置选项&#xff0c;而Nginx则在生产环境中扮演关键角色&#xff0c;确保API请求正确路由至后…

[flink] flink macm1pro 快速使用从零到一

文章目录 快速使用 快速使用 打开 https://flink.apache.org/downloads/ 下载 flink 因为书籍介绍的是 1.12版本的&#xff0c;为避免不必要的问题&#xff0c;下载相同版本 解压 tar -xzvf flink-1.11.2-bin-scala_2.11.tgz启动 flink ./bin/start-cluster.sh打开 flink web…

LeetCode 面试经典150题 242.有效的字母异位词

题目&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 思路&#xff1a;hash表&#xff0c;可以用int数组代替 代码&#x…

【每日一题】盛水容器

问题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

JavaScript中作用域与闭包深入解析

函数中的作用域 对这些问题的最常见的回答是&#xff0c;JavaScript 拥有基于函数的作用域。也就是&#xff0c;你声明的每一个函数都为自己创建了一个气泡&#xff0c;而且没有其他的结构可以创建它们自己的作用域气泡。但是就像我们一会儿将会看到的&#xff0c;这不完全正确…

vue创建项目报错Fail to check for updates

网上查了文章说更换淘宝镜像地址啥的 改了地址后依然报错显示Fail to check for updates 并且装包时报错Failed to get response from https://registry.npmmirror.com/binary-mirror-config 既然又是淘宝镜像问题&#xff0c;直接干脆不用淘宝的地址 npm config set regis…

iPhone的iOS系统:定义移动智能体验,引领科技潮流之巅

来自&#xff1a;dlshuhua.com/post/83721.html 在移动智能设备领域&#xff0c;iPhone一直以其出色的性能和独特的用户体验脱颖而出。而这一切的背后&#xff0c;离不开其强大的操作系统——iOS。iOS系统不仅为iPhone提供了强大的性能支持&#xff0c;更通过不断创新和升级&a…

蓝桥杯备考随手记: 数位分解

1. 什么是数位分解 数位分解是将一个数拆分成它的各个数位的过程。每个数位代表了数字在该位上的权重。 例如&#xff0c;对于整数12345&#xff0c;数位分解可以得到以下结果&#xff1a; 万位&#xff1a;1千位&#xff1a;2百位&#xff1a;3十位&#xff1a;4个位&#…

产品经理的自我修养

点击下载《产品经理的自我修养》 1. 前言 在产品领域取得成功的关键在于持续的激情。只有保持热情不减,我们才能克服各种困难,打造出卓越的产品。 如果你真心渴望追求产品之路,我强烈建议你立即行动起来,亲自参与实际的产品创作。无论是建立一个网站、创建一个社群,还是…

Dubbo 负载均衡算法说明

https://cn.dubbo.apache.org/zh-cn/overview/core-features/load-balance/ 在集群负载均衡时&#xff0c;Dubbo 提供了多种均衡策略&#xff0c;缺省为 weighted random 基于权重的随机负载均衡策略。 具体实现上&#xff0c;Dubbo 提供的是客户端负载均衡&#xff0c;即由 …

【前端学习——js篇】4.浅拷贝与深拷贝

具体可见https://github.com/febobo/web-interview 4.浅拷贝与深拷贝 ①栈内存与堆内存 栈内存&#xff08;Stack Memory&#xff09; 栈内存用于存储基本类型的变量和引用类型的变量引用&#xff08;即指向堆内存中实际数据的指针&#xff09;。当一个函数被调用时&#xf…

Mysql的日志管理,备份与回复

目录 一、Mysql日志管理 1、日志的默认位置及配置文件 2、日志分类 2.1错误日志 2.2通用查询日志 2.3二进制日志 2.4慢查询日志 2.5中继日志 3、日志配置 4、日志查询 4.1查询通用日志是否开启 4.2查询二进制日志是否开启 4.3查看慢查询日志是否开启 4.4查询慢查…

Vivado Lab Edition

Vivado Lab Edition 是完整版 Vivado Design Suite 的独立安装版本 &#xff0c; 包含在生成比特流后对赛灵思 FPGA 进行编程和 调试所需的所有功能。通常适用于在如下实验室环境内进行编程和调试&#xff1a; 实验室环境中的机器所含磁盘空间、内存和连 接资源较少。Vivad…

python数据实时传给unity工程并绘制出来

python # 服务器端代码 import socket import random import struct import time# 创建一个服务器Socket server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 监听的地址和端口 host 127.0.0.1 port 12345# 绑定地址和端口 server_socket.bind((host, port…

纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图

系统买的是商业版&#xff0c;使用非常不错有三端uniapp开源代码&#xff0c;自从上次分享uniapp后有些网友让我分享下各个端的uniapp下的各个目录结构说明 我就截图说以下吧&#xff0c;