【多模态】25、ViLT | 轻量级多模态预训练模型(ICML2021)

news2025/1/16 21:07:09

在这里插入图片描述

文章目录

    • 一、背景
    • 二、ViLT 方法
    • 三、效果
      • 3.1 数据集
      • 3.2 分类任务 VQA 和 NLVR2
      • 3.3 Image Retrieval

论文:ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision

代码:https://github.com/dandelin/vilt

出处:ICML 2021 Long Presentation

本文的标题就是使用 transformer 来做多模态的任务,而且没有用卷积监督信号和区域监督信号,这里的卷积监督信号就是指的是预训练的 backbone,区域信号就是用检测头检测出来的那些框所在的区域。

视觉文本的预训练 VLP 方法,为了下游任务上获得好的效果,往往在视觉特征上花费的代价很多,很依赖于视觉特征抽取的效果,看做目标检测的问题或者使用 Resnet 抽取特征,也就是需要额外的视觉网络抽取特征,花费很贵

这样的操作有两个问题:

  • 很低效,需要花费大量的时间来进行视觉特征抽取,甚至比后面做的多模态融合花费的时间还多,但可以直观想象如果说多模态任务只是把两个单模态模型效果做的很好的话,那么多模态就没有研究的意义了,所以多模态的研究重点应该在如何让两种模态融合的更好
  • 如何使用预训练好的模型来抽特征的话,那么抽到的特征其实很受限的,假设使用预训练好的目标检测器来抽特征,我们都知道目标检测数据集都不大,类别只有几百类,框也只有几十万,规模还不是很大,很难涵盖到边边角角,所以如果模型不是端到端学习的话,那么大概率这个模型不是最优的

ViLT 的贡献:

  • 提出了极简化的 VLP 的模型,迄今为止最简单的 VLP 模型,受到 vision transformer 的启发,将图像的预处理做的和文本预处理的方法一样了,都是 Linear embedding,显著减少了计算复杂度和计算时间
  • 在降低计算量的情况下,性能也比较能打
  • 还使用了更多更适合于图文对儿的数据增强,因为多模态其实不太好做数据增强,因为有可能一不小心就匹配不上了,比如草地上有一只白色兔子,图像做数据增强后可能会改变颜色,兔子就不是白色的了,新的图像文本对就不正确了,所以之前的工作就没有使用很多数据增强的方式,ViLT 却很好的使用了数据增强且提升了效果

训练难度:

  • 使用 64 个 32G 的 V100 训练 3 天,代价较大

后面其他大佬的延续工作:

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

Masked Unsupervised Self-training for Zero-shot Image Classification

一、背景

本文提出的背景的就是在于多模态领域现在也开始研究先预训练再微调的方式,这种方式在 NLP 和视觉领域都是这样做的,所以就拓展到了多模态领域

所以预训练就很重要,zero-shot 也是很被看重的

从 2019 年到 2021 年出现了很多篇有影响力的工作,比如 2019 年就出现了 visualBERT、ViLBERT 等以 BERT 命名的方法

一般这些模型都使用图像文本对来训练的,一般都是使用了 image text matching 和 masked language modeling 的目标函数,一旦预训练完成,就可以在下游任务上微调实现

具体怎么处理文本和图像呢:

  • 文本:transformer 统一了文本的江湖
  • 图像:要做多模态,图像的特征一定要变成语义性强的离散信号的形式,才能使用 transformer 这种结构来进行多模态的训练,但又不能变成像素的离散程度(那样序列就太长了,transformer 处理不了)。比如 ViT 将图像分成 patch 来做,但 ViT 是 2021 年出来的工作,那在 2021 年之前基本上就是使用目标检测器,因为目标检测模型就是将图像转换成了离散的 bbox 的形式,而且还有很明确的语义信息,每个区域呢就可以想象成句子中的单词。也和下游任务有关系,往往都和物体有非常强的关系。如 VQA、visual grounding 等任务,所以选择目标检测模型作为 VLP 的一部分是合理的

当前的 VLP 方法大都是使用预训练好的目标检测器,检测器一般都是在 VG 数据集训练的,有 1600 物体类别,400 个属性类别,类别是相对比较大的,限制性会更小一些。

截止目前的工作还是聚焦在如何提高视觉编码器的效果来提升最后的多模态的效果,因为在学术界中更看重的还是效果,而不是性能。而且在训练的时候,可以提前把目标检测特征抽好,存在本地硬盘,用的时候直接用就好,所以那 800ms 的特征抽取过程是不会耗费训练的时间的,也没人太把这个事情当回事。

但如果说要做现实世界中的应用,对于新数据还是需要抽取特征的,那么那个时候就没法提前抽取好特征了,所以问题还是很严重的。

所以 ViLT 想要构建一个很方便的视觉特征抽取的过程,ViLT 受启发与 ViT,也算是 ViT 在多模态领域的扩展。

如下图 1 所示,一般利用 region feature 的工作都是先对图像使用 CNN 提取特征,然后使用检测头输出目标检测框,这个过程中,抽取特征耗费约 75ms,RPN/RoI Align/NMS/RoI heads 这些过程耗费约 810ms,所以 Pixel-BERT 就提出将后处理过程去掉,就是把图片进行特征提取,把最后的多通道特征拉直变成序列向量来使用,而不用提取出最后的框信息,能够降低时间到 45ms(R50),但性能下降了十几个点。

ViLT 把 CNN 换成了 Linear embedding 层,图像和文本都是使用 linear embedding 层,非常的快速,图像的只需要 0.4ms。而且效果没有降低很多。

在这里插入图片描述

作者根据下面两点将当前 VLP 模型分成了四大类,并且总结了不同类别方法的特点:

  • 图像和文本的表达力度是不是平衡,如参数量和计算,因为图像和文本都是非常重要的,比重应该差不多,不应该是现在这种视觉比文本贵太多的情况
  • 图像和文本两个模态的信息是怎么融合的

在这里插入图片描述

四大类如图 2 所示:

  • a:文本端很轻量,视觉端很重,融合部分更轻量
  • b:文本和图像的表达力度是一样的,计算量基本是等价的,但模型融合部分很轻量,做模态融合的时候就是点乘就结束了,所以 CLIP 比较适合做抽特征、retrivel 的任务,但做 VQA 或 visual reasoning 任务的效果就不太好了,毕竟只是抽到了特征,没有更深层次的理解
  • c:文本端很轻量,视觉端使用目标检测的网络很重,融合部分也很贵,融合部分也是用 transformer 来实现的,性能也不错,所以作者就发现了,好好做模态融合才能主导多模态的效果更好
  • d:前面的工作证明了要有好的模型融合模块,多模态效果才能更好,所以 ViLT 就致力于将文本和图像的特征提取部分做的轻量,着重在模态融合模块上来做文章

模态融合很重要,所以要看看当前的模态融合是怎么做的:

  • single-stream:把两个序列 concat 成一个序列,然后让 transformer 自己去学习怎么融合
  • dual-stream:先各自对各自的输入做处理,挖掘单独模态中包含的信息,然后再融合
  • 两种融合方法基本效果差不多,dual-stream 有时候会更好一点,但 dual-stream 引入了更多的参数,ViLT 作者还是使用了 single-stream 更轻量的方法

多模态融合之前,特征怎么提取:

  • 文本端:使用预训练好的 BERT
  • 视觉端:
    • 之前的方法是先将输入图像通过 backbone 来提取特征,然后使用 RPN 网络来抽取一些 ROI,做一次 NMS 降低区域的数量,然后经过 head 得到 bbox,整个过程非常贵
    • 还有一些方法使用 Grid Feature,就是直接用抽出的特征,拉平后直接用,但效果不好
    • 所以 ViLT 借鉴 ViT 的 patch embedding layer 来抽取特征,又快又好

二、ViLT 方法

ViLT 是一个 single-stream 的结构,所以只有一个 模型:

  • 文本输入:文本先输入 BERT tokenizer,得到 word embedding,假设文本的长度是 L,H 就是 embedding 维度,一般 base 模型就是 768,就是 Lx H 大小
  • 图像输入:把图像打成 patch,每个 patch 进行 patch embedding,得到一系列的 token 编码(紫色),假设图像 token 长度为 N 维度也是 H 那么就 NxH 的特征
  • *:cls token,绿色的是文本的,紫色的是图像的
  • 灰色:表示模态,0 表示文本模态,1 表示图像模态,需要 modal-type embedding 的原因在于,对于 single stream 的方法来说,是会把图像和文本的输入拼接在一起的,如果不告诉模型哪些是文本或哪些是图像的话,是不利于学习的,如果告诉了后,模型就可能互相学习文本和图像之间的关系,更有利于找到潜在的关系
  • 输入输出序列长度:每个 token embedding 输入 transformer encoder 之前呢,都是由三部分组成的:灰色+绿色+淡绿色的,是加到一起的,而不是 concat,然后所有相加后的特征会被 concat 起来,送入 transformer encoder,所以输入长度就是 1+L+1+N,整个输入的特征就是(N+L+2)xH,输出的序列也是(N+L+2)xH

预训练的两个 Loss:

  • Image-text matching loss:
    • 该 loss 是用于衡量文本和图像之间的距离,是人为设计的任务,也就是二分类的任务,判断匹配与否,真正有用的位置是 Pooler 位置,在 Pooler 之前呢,这个位置输出的特征是 1xH,经过 Pooler 相当于权重矩阵,得到 HxH,经过 FC 得到 1xH 的输出,做二分类。
    • ViLT 中还使用了 word patch alignment loss,使用最优传输理论来计算分布之间的距离
  • Masked language modeling loss:
    • 针对文本的目标函数,也就是 NLP 那边常见的完形填空,也就是在输入文本的时候,随机 MASK 掉一个单词,然后在输出的时候重建出来这个 mask

文本模型中使用的小技巧:whole word masking:

  • 作者使用将整个单词都 mask 掉的方法,能进一步的加强文本和图像之间的关系的学习
  • 当把单词抹掉之后,句子重建就很困难,那就只能从图像中来拿取信息,所以就能迫使模型来建立图像和文本的关系

图像模型中使用的小技巧:

  • 前面说过数据增强在图像中很有用,但多模态中不太能用好数据增强
  • 本文作者做了改动,也就是不用 color 和 cutout,就能尽可能的保证图像和文本保持原有的匹配关系

在这里插入图片描述

在这里插入图片描述

三、效果

ViLT 能做到最好的速度和效果的平衡!!!

3.1 数据集

预训练所用的数据集设置:4 个数据集,一般大家把这几个数据集合起来叫做 4Million 数据集(4M),因为数据集中图片个数加起来大概是 400w 多一点

  • MSCOCO:每个图片对应 5 个 caption,虽然只有 10w 个图片,但有 50w 个 caption,且标题也较长,能下载完整数据集
  • VG:10w 图片,对应 caption 有 500w,caption 长度不长,能下载完整数据集
  • GCC:一个图片对应一个 caption,且 caption 长度较长,一些数据链接失效了,不完整
  • SBU:一个图片对应一个 caption,且 caption 长度较长,一些数据链接失效了,不完整

在这里插入图片描述

3.2 分类任务 VQA 和 NLVR2

在这里插入图片描述

3.3 Image Retrieval

zero-shot:

在这里插入图片描述

finetune:训练好模型后做 fine-tuning

在这里插入图片描述

消融实验:

在这里插入图片描述

可视化:

在这里插入图片描述

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

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

相关文章

【项目管理】PMP备考宝典-第二章《环境》

第一节:概述 1.项目所处的组织环境 (1)事业环境因素(EEFs) 组织内部的事业环境因素: 企业都会有愿景、使命、价值观,这些决定了企业的发展方向。不忘初心,坚定地走自己的路&#…

「已解决」iframe 本地生效 但是在测试环境不生效问题

背景 我有一个表格中一列是个详情,这个详情可被点击,点击后弹出抽屉,抽屉里是后端传给我详情字段的值对应的 url 的 iframe 展示。 问题是,在本地 localhost 下运行,ifame 运行正常,但是部署到测试环境就看…

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作: 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”: 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器:大脑,算术运算,逻辑判断 存储器&…

传输层协议——udp

文章目录 1. 再谈端口号1.1 认识知名端口号 2. netstat3. pidof4. UDP协议4.1 UDP协议端格式4.2 UDP的特点4.3 面向数据报4.4 UDP的缓冲区 1. 再谈端口号 传输层是负责数据能够从发送端传输接收端,那么我们就需要再一次了解端口号。端口号(Port)标识了一个主机上进…

【Bert101】变压器模型背后的复杂数学【01/4】

一、说明 众所周知,变压器架构是自然语言处理(NLP)领域的突破。它克服了 seq-to-seq 模型(如 RNN 等)无法捕获文本中的长期依赖性的局限性。变压器架构被证明是革命性架构(如 BERT、GPT 和 T5 及其变体&…

ARTS 挑战打卡的第8天 ---volatile 关键字在MCU中的作用,四个实例讲解(Tips)

前言 (1)volatile 关键字作为嵌入式面试的常考点,很多人都不是很了解,或者说一知半解。 (2)可能有些人会说了,volatile 关键字不就是防止编译器优化的吗?有啥好详细讲解的&#xff1…

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时,如果之前已经下载过该库,pip会默认使用缓存来安装库,而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中,具体位置因操作系统和Python版本而异…

C语言中几种常见数据类型所占字节数

**16位编译器: char/unsigned char :1字节 char :2字节 short int:2字节 int/unsigned int:2字节 long int:4字节 float:4字节 double:8字节* 32位编译器: *char/unsi…

腾讯云服务器标准型CVM实例详细介绍S5/S6/SA2/SR1/SA3/S4等

腾讯云CVM服务器标准型实例的各项性能参数平衡,标准型云服务器适用于大多数常规业务,例如:web网站及中间件等,常见的标准型云服务器有CVM标准型S5、S6、SA3、SR1、S5se等规格,腾讯云服务器网来详细说下云服务器CVM标准…

悬崖传感器调试问题总结

悬崖传感器原理 使用ADC采样电路,周期的进行开/关灯,获取ADC采样值。根据预先设置好ADC门限,判断是否为悬崖。ADC的精度是12位,对应电路的电压是3.3伏,悬崖传感器通过开灯和关灯,接收的不同灯光强度&#x…

【福建事业单位-数学运算】02工程问题-行程问题

【福建事业单位-数学运算】02工程问题-行程问题 一、工程问题1.1给完工时间型(给多个完工时间)——从时间赋值总量例题 1.2 给效率比例型(给效率的比例关系)直接给效率间接给效率(★)特殊给效率 1.3 给具体…

掌握Python的X篇_30_使用python解析网页HTML

本篇将会介绍beutifulsoup4模块,可以用于网络爬虫、解析HTML和XML,对于没有接触过前端,不了解HTML是如何工作的,需要先解释一下什么事HTML。 1. HTML 网页中的各种布局等的背后都是非常简单的纯文本格式,那种格式称为…

【JDBC系列】- 扩展提升学习

扩展提升学习 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正&#xff0…

Golang 基本常量声明及 iota 使用

文章目录 一、局部常量声明二、全局常量声明三、多行常量定义,值表达式为空时自动继承前一个四、常量声明 - iota 一、局部常量声明 package mainimport "fmt"func main() {//局部常量声明//方式一:主动声明类型const lengthA int 10//方式二…

tomcat设置PermSize

最近tomcat老是报错,查看了日志出现PermGen 内存不够用,重启tomcat后查询使用情况 通过启动参数发现没有设置 PermGen,继续通过jmap查看 jmap -heap 21179 发现99%已使用,而且默认是30.5M,太小了,这里设置成256M 1. 创建setenv.sh文件 在/usr/local/tomcat/bin目录下创建一个…

CDN是什么?CDN的好处

近段时间开组会的时候组内的大佬多次提及CDN这个名词,因为以前没有接触过,所以上网查询后写一篇博客来巩固自己对于CDN的理解 1、什么是CDN CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新…

Linux命令200例:ls用于列出指定目录下的文件和子目录

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…

Java实现对称加密(DES,AES)快速入门示例

对称加密是使用相同的密码进行加密和解密, 对称加密实现简单,安全性相比非对称加密较弱, 常用的对称加密算法有 DES,AES以及PDE等,关于对称加密相关概念参考: 对称加密、非对称加密深度解析 本篇介绍Java的…

【CSH 入门基础 5 -- csh 文件监控脚本实现】

文章目录 背景CSHLL 代码实现cshell 中 unset 的介绍bash 中监控文件的方法 背景 由于开发代码是在外网编译,而镜像的烧写是在内网中的EDA工具中进行的,所以就需要先将代码在外网编译好后,再通过FTP工具将镜像传输到内网中,然后在…

MyBatis配置文件:配置连接数据库的环境,实现数据库连接

目录 1、MyBatis配置数据库环境的连接方式 1.1连接方式一:MyBatis核心配置文件配置数据库连接信息 1.2连接方式二:在MyBatis核心配置文件中引入properties文件,配置数据库的环境 2、MyBatisd核心配置文件连接数据库的环境完整配置信息 3…