ViLT:一种极简多模态学习框架 Baseline

本文目录

1 ViLT:一种极简多模态学习框架 Baseline
(来自 NAVER AI Lab)
1.1 背景和动机
1.2 视觉-语言模型的分类
1.3 模态交互的方式
1.4 ViLT 模型总体架构
1.5 ViLT 预训练目标
1.6 文本小技巧:整个单词的掩码
1.7 图像小技巧:数据增强
1.8 实验结果

太长不看版

ViLT 可以看做是一种极简多模态学习框架 Baseline,它的特点是把每个模态的特征抽取部分做到了最小化,把主要的计算量都使用 Transformer 放在了特征融合部分,在很大程度上推动了当年多模态学习的进展。比如图片部分需要一个特征提取器,文本部分呢,也需要一个特征提取器。目前的 Vision-and-Language Pre-training (VLP) 方法严重依赖于图像特征提取过程,其中大部分涉及区域性特征 (如目标检测) 和卷积架构 (如 ResNet)。ViLT 的图片和文本的特征提取模型都是 Convolution-Free 的极简架构。作者表明,ViLT 比以前的 VLP 模型快十倍,但具有竞争力或更好的下游任务性能。那么 ViLT 到底做了什么呢?其实从题目中的 "Without Convolution or Region Supervision" 就大概看得出来,ViLT 把以往多模态工作中的目标检测部分的区域性特征,从多模态学习的框架中给移除了。

1 ViLT:一种极简多模态学习框架 Baseline

论文名称:ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision (ICML 2021)

论文地址:

https://arxiv.org/pdf/2102.03334.pdf

代码地址:

https://github.com/dandelin/vilt

1.1 背景和动机

预训练-微调的方案已经分别扩展到视觉和语言的领域,也诞生了视觉-语言预训练 (Vision-and-Language Pre-training, VLP) 方法。典型的工作包括[1]等等,这些模型通过图像文本匹配 (image text matching) 和掩码语言建模 (masked language modeling) 目标进行训练,并在视觉和语言各自的下游任务上面进行微调。

那么为了把图像模态的输入喂给 VLP 模型,图像像素需要与语言标记一起以密集的形式变成 token。在 ViT 这个经典的图片分 Patch 的工作诞生之前,大家一般使用在 Visual Genome 数据集上预先训练的目标检测器[2]或者卷积神经网络[3] (ResNet) 提取图像的特征。

到目前为止,大多数 VLP 研究都把提升图像-文本预训练模型的性能的希望寄托于视觉 Encoder 上面,大家希望设计能力更强的视觉 Encoder。在我们平常做实验的时候,视觉 Encoder 提取到的 region feature 可以提前缓存,以减小训练时的负担。但是在实际应用的时候,在面对新数据集的时候,还是必须经历一个缓慢的提取 region feature 的过程。

因此,本文受到当时的工作 ViT 使用 Patch Embedding 编码图像特征的启发,希望把每个模态的特征抽取部分做到了最小化,把主要的计算量都使用 Transformer 放在了特征融合部分。本文提出的 ViLT 是一种无需目标检测器的多模态框架,如下图1所示,它的图片和文本的特征提取模型都是 Convolution-Free 的极简架构。ViLT 与以前的 VLP 模型的主要不同之处在于:ViLT 去掉了复杂的处理图像特征的目标检测器,而改为了极简的一层 Linear Embedding,这样的设计极大地减小了模型的整体尺寸和运行时间。结果显示,ViLT 比以前的 VLP 模型快十倍,同时在视觉和语言下游任务上表现出相似甚至更好的性能。

图1:传统 VLP 模型和本文 ViLT 模型的对比

1.2 视觉-语言模型的分类

作者首先对视觉-语言模型做了一个像综述一样的分类,说主要是基于以下两点分类:

  1. 图像和文本这两个模态的编码器是不是具有相似的参数或者计算成本。

  2. 这两个模态的编码结果是不是通过一个深度模型进行交互。

按照这两个分类依据,视觉-语言模型能够分为以下4类,如下图2所示。

图2:视觉-语言模型的四种范式:每个矩形的高度表示它的相对计算大小。VE、TE 和 MI 分别代表视觉编码器、文本编码器和模态交互器

第1种模型如图 2(a) 所示,属于是视觉模型占大部分算力,用简单的点积或浅注意层来表征两种模态中特征的相似性,代表模型是 VSE++[4]和 SCAN[5]。

第2种模型如图 2(b) 所示,属于是视觉模型和文本模型都使用较大算力,用简单的点积或浅注意层来表征两种模态中特征的相似性,代表模型是 CLIP[6]。但是,这种方法对于视觉-语言下游任务性能很差,比如 CLIP 在 NLVR2 数据集上面性能较差,说明纵使单一模态的编码器很好,但是对其输出的简单融合可能也不足以学习复杂的视觉和语言任务,这可能就需要我们去研究更严格的跨模态交互方案了。

第3种模型如图 2(c) 所示,属于是视觉模型占大部分算力,使用 Transformer 对图像和文本特征的交互进行建模,代表模型是 FiLM[7]和 MoVie[8]。

第4种模型如图 2(d) 所示,属于是视觉模型和文本模型都极其简单,大部分计算力集中在模态的交互上面,使用 Transformer 对图像和文本特征的交互进行建模,代表模型是本文的 ViLT。

1.3 模态交互的方式

模态交互的核心是 Transformer,它以图像和文本的表征的序列作为输入,通过每个 Transformer Block 对模态之间和模态内部的信息进行交互,然后输出交互之后的特征序列。模态交互的方式可分成两类:

  1. 单流方法:代表是 VisualBERT[9] 和 UNITER[10]。先把图像和文本的表征拼接起来以后,再一并输入给 Transformer,本文 ViLT 也属于单流方法。

  2. 双流方法:代表是 ViLBERT[11] 和 LXMERT[12]。图像和文本的表征不在输入阶段作拼接。

1.4 ViLT 模型总体架构

如下图3所示是 ViLT 模型的总体架构,Transformer Encoder 的权重以 ViT-B/32 的预训练权重做初始化,而不是 BERT 的预训练权重。作者解释这么做的原因是:因为 ViLT 没有单独的 Image Encoder 了,所以借助 ViT 去做初始化。其实真相是作者也实验了以 BERT 的预训练权重做初始化,同时使用 ViT 模型的 Patch Projection 层,但是发现这样做不 work。

图3:ViLT 模型的总体架构

然后,ViLT 模型的表达式是:

式中, 文本输入  通过 Word Embedding 矩阵  变为  即文本位置编码的维度是  。

图像输入  首先通过分块操作分成  大小的  个 Patch, 并展平成  维度的向量,  。通过线性投影矩阵  变为 , 即图像位置编码的维度是  。

 是文本的 Embedding, 后面还要加上 , 这是一个表示模态的变量。 是图像的 Embedding, 后面还要加上 , 这是一个表示模态的变量。把图像的 Embedding 和文本的 Embedding 拼接在一起之后得到  为全部的 Embedding, 并喂入 Transformer 模型。经过  层 Transformer 块之后, 得到的  通过一个线性变换  和 tanh 函数得到输出  。

对于权重以 ViT-B/32 的预训练权重做初始化模型 ViLT-B/32, 隐维度大小  为768, 深度  为 12, Patch 大小  为 32 , MLP 中间尺寸大小为 , 注意力 head 数为 12 。

1.5 ViLT 预训练目标

ViLT 的预训练过程使用了两个训练目标:Image Text Matching (ITM) 和 Masked Language Modeling (MLM)。

Image Text Matching 就是随机将对齐的图像替换为不同的图像,概率为0.5,然后使用一个线性层,得到输出。并希望模型预测出文本和图片是否匹配。

Masked Language Modeling 也就是 BERT 中的完形填空任务,即先把一些文本的词根 (text token) 盖住,mask ratio 为0.15,然后使用一个两层 MLP 得到输出。输入 mask 之后的东西,并希望模型预测出 mask 的内容。

1.6 文本小技巧:整个单词的掩码

就是在做完形填空任务时,每次是把整个词都 mask 掉的,而不是只 mask 掉一个词根。比如说作者举个例子:"giraffe" 这个词,可以拆解成3个词根:["gi", "##raf", "##fe"]。正常 mask 时,可以 mask 掉 "##raf",但是仔细想想如果说让模型已知 "gi" 和 "##fe" 来预测 "##raf" 时,可以说这个任务是比较不依赖图片信息的。如果不是所有的词根都被屏蔽,模型可能只依赖附近的两个语言标记 "gi" 和 "##fe" 来预测被屏蔽的 "##raf",而不是使用图像中的信息。

因此,如果是把 "giraffe" 这个词全部 mask 掉,模型就只能根据上下文和图像的信息来做完形填空了,这也是我们所希望看到的。

1.7 图像小技巧:数据增强

图像增强提高了视觉模型的泛化能力,但是之前的 VLP 工作很多没办法使用。因为大多数 VLP 模型有比较 heavy 的目标检测模型,所以一般是提前把输入喂入目标检测器,得到特征之后事先存起来,训练的时候就不用再通过一遍了。但是有了数据增强之后毫无疑问这就做不了了。

所以呢,之前基于目标检测的 VLP 的工作不会这么用。即便是 Pixel-BERT 这种不考虑目标检测的工作,也没使用数据增强。

但是 ViLT 这个方法不涉及目标检测,所以作者这里使用了数据增强 RandAugment。作者使用了所有原始的策略,除了两个:其一是 color inversion,因为文本通常也包含颜色信息。其二是:cutout,因为它可能会裁减掉图片里面很重要的小物体。

1.8 实验结果

预训练数据集: 作者使用了4个数据集来做预训练:Microsoft COCO (MSCOCO), Visual Genome (VG), SBU Captions (SBU) , Google Conceptual Captions (GCC)。这4个数据集的规模如下图4所示。这4个数据集合起来一般叫做 4 Million 的设置,因为它们的图片数加起来差不多是 4 Million。值得一提的是每个数据集单张图片对应的 Caption 的数量都不同,多的比如 COCO 数据集,只有 113K 张图片,但是一共有 567K 个 Caption,说明每张图片都有很多的文本去描述,说明描述得更细节。少得比如 Google Conceptual Captions 和 SBU Captions,都是用1个较长的 Caption 把图片描述清楚。

图4:ViLT 预训练所使用的数据集

任务: 作者在两种常见的视觉-语言下游任务上面评价 ViLT 模型,分别是:分类任务 Classification (VQAv2 和 NLVR2 数据集) 和检索任务 Retrieval (MSCOCO 和 Flickr30K)

实验设置: ViLT 使用 bert-base-uncased tokenizer 来 tokenize 文本输入。优化器使用 AdamW,初始学习率 0.0001,weight decay 设为0.01。

分类任务实验结果

作者使用隐维度大小为1,536的两层 MLP 作为微调下游头。分类任务主要包含两种:

Visual Question Answering (VQA) 任务借助 VQAv2 数据集来评估。VQA 任务要求给定图像对和自然语言问题,寻求答案。带注释的答案最初是自由形式的自然语言,但常见的做法是将任务转换为具有 3,129 个答案的分类任务。

Natural Language for Visual Reasoning (NLVR) 任务借助 NLVR2 数据集来评估。NLVR 任务是给定两个图像的三元组和自然语言的问题,做二元分类的任务。由于与预训练设置不同有两个输入图像,因此下游任务存在多种策略。在 ViLT 中,输出是两个图片,一个问题,那么分成 (问题,图片1) 和 (问题,图片2),并把它们分别喂给 ViLT 模型,得到的两个 Pooled Representation,也就是  拼接起来,最后输出分类结果。

结果如下图5所示,图5里面的 Region 是用上了区域特征,Grid 是用的网格特征,而 Linear 就是只使用一个线性层的 ViLT 模型方法。结果显示,ViLT-B/32 在两个数据集上都保持了具有竞争力的性能,但是推理速度卓越。比如基于 Region 区域特征的方法的推理时间大概在 900ms,基于 Grid 网格特征的方法的推理时间大概在 100+ms,基于 ViLT 的方法的推理时间仅仅为 15ms。

图5:分类任务实验结果

检索任务实验结果

作者在 MSCOCO 和 Flickr30K 数据集上面微调 ViLT-B/32 模型,对于图像到文本和文本到图像的检索,作者测试了 Zero-Shot 和 Fine-tuning 的性能,结果分别如下图6和7所示。这两个在做法上的区别就是一个用了 MSCOCO 和 Flickr30K 做微调,一个不使用。从图6和7也看得出来 ViLT 的速度还是特别快,但是召回率性能上不如最强的基于 Region 特征和 Grid 特征的模型。

图6:检索任务的 Zero-Shot 实验结果

图7:检索任务的 Fine-tuning 实验结果

消融实验结果

如下图8所示是消融实验结果,作者首先来验证训练的时长 (Training Steps) 对于结果的影响。因为 VLP 也是一种Self-Supervised Training,所以作者研究了训练时间的影响。正如预期的那样,随着训练步骤的提升,模型下游任务的性能也不断提高。同时,整个单词的掩码和图像的数据增强对结果都是有帮助的。但是,作者还试了额外的训练目标,即遮住图像的一部分做预测 (Masked Patch Prediction),mask ratio 为0.15,让模型预测 masked patch 的 RGB 值,但是发现这个训练目标对下游性能没有贡献。

图8:消融实验结果

参考:https://www.youtube.com/watch%3Fv%3Dug8YvZOjOCE%26t%3D1s

参考

  1. ^VL-BERT: Pre-training of Generic Visual-Linguistic Representations

  2. ^Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

  3. ^Pixel-BERT: Aligning Image Pixels with Text by Deep Multi-Modal Transformers

  4. ^VSE++: Improving Visual-Semantic Embeddings with Hard Negatives

  5. ^Stacked Cross Attention for Image-Text Matching

  6. ^Learning Transferable Visual Models From Natural Language Supervision

  7. ^FiLM: Visual Reasoning with a General Conditioning Layer

  8. ^MoVie: Revisiting Modulated Convolutions for Visual Counting and Beyond

  9. ^VisualBERT: A Simple and Performant Baseline for Vision and Language

  10. ^UNITER: Learning UNiversal Image-TExt Representations

  11. ^ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks

  12. ^LXMERT: Learning Cross-Modality Encoder Representations from Transformers

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ViLT (Visual and Language Transformer) 是一种视觉和语言模型,它将图像和文本表示结合在一起,用于多种视觉问答任务。微调(fine-tuning)ViLT通常涉及以下几个步骤[^4]: 1. **预训练模型加载**[^4]: 使用ViLT的预训练权重,这些权重是在大规模图像和文本数据集上训练得到的,如Conceptual Captions。 2. **任务特定的数据准备**[^4]: 对于VQA任务,需要一个包含问题和对应图像对的数据集,如VQA v2.0。图像可能需要经过适当的预处理,如缩放和归一化。 3. **输入编码**[^4]: 将图像通过视觉编码器(如CLIP或ResNet)转换成嵌入向量,同时将问题作为文本序列通过Transformer编码器处理。 4. **联合表示**[^4]: 结合视觉和语言嵌入,通常是通过逐层加权融合或者直接拼接,生成跨模态的表示。 5. **任务层添加**[^4]: 在模型顶部添加一个或多个全连接层,针对VQA任务可能是分类层,用于预测答案。 6. **微调**[^4]: 用预先准备好的VQA数据集训练整个模型,目标是调整所有参数以优化VQA任务的性能。 7. **评估与调整**[^4]: 在验证集上评估模型性能,可能需要调整超参数或进行更多迭代来提升性能。 请注意,实际微调过程会涉及到具体的代码实现,通常使用深度学习框架如PyTorch[^5]: ```python # 示例代码片段 model = ViLT(pretrained=True) optimizer = torch.optim.Adam(model.parameters(), lr=1e-5) for epoch in range(num_epochs): model.train() # ...执行训练步骤... model.eval() # ...执行验证和评估... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚爱吃大蒜的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值