论文《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 大多数先进的神经序列转换模型采用编码器-解码器结构,其中编码器将…

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年…

[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…

【每日一题】盛水容器

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

产品经理的自我修养

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

【前端学习——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;

【Java - 框架 - Lombok】(1) 普通Java项目通过Lombok+Logback完成日志的创建使用 - 快速上手

普通Java项目通过"Lombok""Logback"完成日志的创建使用 - 快速上手&#xff1b; 步骤A 说明 创建"Maven"项目&#xff1b; 图片 步骤B 说明 添加相关依赖项&#xff1b; 图片 代码 <!-- "Lombok"依赖项--> <dependency>&…

c++核心学习--继承2

4.6.7多继承语法 4.6.8菱形继承 利用虚继承解决菱形继承的问题&#xff1a;继承之前加上关键字virtual变为虚继承

经纬恒润RTaW-Pegase:车载网络通信建模与时间特性分析工具

▎RTaW简介 RTaW-Pegase是由法国国家信息与自动化研究所&#xff08;INRIA&#xff09;旗下的RTaW公司开发的产品。它主要用于构建和优化汽车、航空航天以及工业领域的通信网络&#xff0c;包括时间敏感网络&#xff08;TSN&#xff09;、CAN&#xff08;FD&#xff0c;XL&…

react-navigation:

我的仓库地址&#xff1a;https://gitee.com/ruanjianbianjing/bj-hybrid react-navigation&#xff1a; 学习文档&#xff1a;https://reactnavigation.org 安装核心包: npm install react-navigation/native 安装react-navigation/native本身依赖的相关包: react-nativ…

开源 | 电动自行车充换电解决方案,从智能硬件到软件系统,全部自主研发

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

Codeforces Round 841 (Div. 2) C. Even Subarrays

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

Java学习之方法

目录 方法 方法声明格式&#xff1a; 调用方式&#xff1a; 详细说明 示例 --方法的声明及调用 语句块 练习 方法的重载(overload) 构成条件 示例 --方法重载 递归结构 缺陷 方法 方法(method)&#xff1a;一段用于完成特定功能的代码片段&#xff0c;类似于其他语…

opencv 十九 python下实现多线程间rtsp直播流的复用

在多线程拉流的任务场景中&#xff0c;有时需要将一个rtsp拉取多次&#xff0c;每重新打开一次rtsp视频流就要多消耗一次带宽&#xff0c;为此基于类的静态对象实现rtsp视频流的复用。 1、实现代码 import threading import cv2,time #接收摄影机串流影像&#xff0c;采用多线…

【嵌入式机器学习开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

ARM-Linux是一种针对ARM架构的操作系统&#xff0c;它的设计目标是在低功耗、低成本的硬件平台上运行。ARM-Linux可以运行在多种ARM处理器上&#xff0c;包括树莓派。 树莓派&#xff08;Raspberry Pi&#xff09;是一款基于ARM架构的单板计算机&#xff0c;由英国的树莓派基金…