热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VisionTransformer(ViT)

目录IntroductionMethodVisionTransformer(ViT)Fine-tuningandHigherResolutionExperimentsSetupCo


目录

  • Introduction
  • Method
    • Vision Transformer (ViT)
    • Fine-tuning and Higher Resolution
  • Experiments
    • Setup
    • Comparison to SOTA
    • Pre-training data requirements
    • Scaling study
    • Inspecting ViT
    • Self-Supervision
  • References


Introduction


  • ViT 这篇论文提出,在图像分类任务中,CNN 并非必须的, pure Transformer 也能取得很好的效果。特别是在大量数据上预训练后再迁移到中小型数据集上时 (ImageNet, CIFAR-100, VTAB, etc.),相比 SOTA CNNs,ViT 仅需更少的训练资源就能取得更好的效果

Method


Vision Transformer (ViT)

在这里插入图片描述


  • 标准的 Transformer 接受 token embeddings 的序列,因此为了能直接将 Transformer Encoder 应用到图像上,我们需要将 2D 图像处理为 1D 向量。一个很直接的想法就是将图片像素经过 Embedding 层后送入 Transformer,但一张图片的像素很多,这样做会导致输入序列长度过长。为此,ViT 将一张图片划分为若干个 P×P=16×16P\times P=16\times 16P×P=16×16 的 patches,然后将每个 patch 拉伸为一个向量,送入线性层得到相应的 Embedding。例如,输入图像大小为 224×224×3224\times224\times3224×224×3,可以划分为 N=2242162=196N=\frac{224^2}{16^2}=196N=1622242=196 个 patches,每个 patch 又被拉伸为 16×16×3=76816\times16\times3=76816×16×3=768 维的向量,送入线性投影层 (i.e. D×DD\times DD×D 的全连接层) 得到 N×D=196×768N\times D=196\times768N×D=196×768 的 patch embeddings 序列。除了 patch embeddings,ViT 也加入了 position embeddings 来表示 patches 之间的位置信息 (learnable 1D position embeddings)
  • 为了对图片进行分类,类似于 BERT,ViT 也添加了 [class] token (输入序列长度为 196+1=197196+1=197196+1=197),它的最终输出就对应了图像表示 yyy,在经过一个 classification head 之后就得到了图片的最终类别 (classification head 在预训练时为一个带有一层隐藏层的 MLP,微调时为一个线性层,激活函数为 GELU)

在这里插入图片描述


GAP v.s. [CLS]
在 CV 领域,使用 CNN 进行图像分类时,常见的做法是对最后的特征图进行全局平均池化 (GAP),因此作者也进行了使用 GAP 和 [CLS] 进行分类的消融实验,当使用 GAP 时,ViT 只对最终的 image-patch embeddings 进行全局平均池化,然后使用线性层进行分类 (但注意这种方法需要的学习率与 [CLS] 完全不同)。实验结果表明这两种方法效果是差不多的,但为了使得 ViT 与标准 Transformer 更接近,作者最终采用了 [CLS] 进行分类
在这里插入图片描述




Inductive bias (归纳偏置)


  • ViT 比 CNN 少了很多针对图像的归纳偏置,例如在 CNN 中,locality (i.e. 局部性. 图片上相邻区域会有相近特征) 和 translation equivariance (i.e. 平移等变性. 设 fff 为平移操作,ggg 为卷积操作,则 f(g(x))=g(f(x))f(g(x))=g(f(x))f(g(x))=g(f(x))) 体现在了模型的每一层中,而 ViT 中只有 MLP 是局部且具有平移等变性的,自注意力层则是全局的。在整个 ViT 中,也只有 positional embedding 使用了针对图像的归纳偏置,除此之外,所有图像的位置信息都必须由模型从头学得
  • 因此由于缺少了归纳偏置,当直接在中等大小数据集 (ImageNet…) 上训练且不进行强正则化时,ViT 性能并没有同等大小的 ResNet 模型好。但如果让 ViT 在更大的数据集上预训练,就可以发现大规模训练胜过了归纳偏置 (88.55% on ImageNet, 90.72% on ImageNet-ReaL, 94.55% on CIFAR-100, and 77.63% on the VTAB suite of 19 tasks)


Hybrid Architecture


  • 除了上述直接将图像划分为若干个 16×1616\times1616×16 patches 的方法,ViT 也提出了一种混合结构,也就是先让图片经过一个 CNN 网络,然后对特征图划分 patches

Fine-tuning and Higher Resolution


  • 当把预训练的 ViT 模型在下游任务上微调时,我们需要重新训练 classification head。如果下游任务图像分辨率更高,模型往往会取得更好的效果,此时如果保持 patch size 不变,那么就会得到更大的序列长度,但此时就无法获取有意义的 positional embedding。为此,ViT 对预训练的 positional embedding 进行 2D 插值

Experiments


Setup

Datasets


  • ILSVRC-2012 ImageNet dataset (1k classes and 1.3M images)
  • ImageNet-21k (21k classes and 14M images)
  • JFT (18k classes and 303M high-resolution images)

预训练数据集中去除了与下游任务数据集重合的图片




Model Variants


  • “Base” 和 “Large” 模型与 BERT 一致,此外还添加了 “Huge” 模型. 在之后的模型命名中,我们使用简称,例如 ViT-L/16 表示 16×1616 × 1616×16 input patch size 的 “Large” 模型
    在这里插入图片描述


Baseline - ResNet (BiT)


  • 网络使用 ResNet,但将 Batch Normalization 替换为了 Group Normalization,并且使用了 standardized convolutions,这些修改提高了迁移学习的性能。我们将修改后的模型称为 “ResNet (BiT)”.

Comparison to SOTA

在这里插入图片描述


  • 可以看到,在 JFT-300M 上预训练的 ViT 在所有 benchmarks 上性能都超越了 ResNet-based baselines,并且相比 CNN,ViT 需要的训练资源更少

Pre-training data requirements


  • 下面的实验研究了数据集大小对 ViT 性能的影响


在不同大小的数据集上预训练后,在 ImageNet 上微调

在这里插入图片描述


灰色阴影区域代表 BiT 的性能范围 (分别使用了两个不同大小的 BiT 网络)



为了提高模型在小数据集上的性能,实验时使用了 3 种正则化方法 - weight decay, dropout, 和 label smoothing 并对相应的参数进行了优化




使用 JFT 数据集的不同大小的子集进行预训练,在 ImageNet 上微调

在这里插入图片描述


实验时不再进行额外的正则化来排除正则化带来的影响



Scaling study

在 JFT-300M 上预训练,迁移到其他数据集上

在这里插入图片描述


  • (1) ViT 在 performance/compute trade-off 上碾压了 ResNet,仅需更少的训练资源就可以达到与 ResNet 相同的性能 (假设在足够大的数据集上预训练)
  • (2) 在训练资源较少时,hybrids 模型性能略微优于 ViT,但差距随着模型参数量的增加而逐渐减小
  • (3) 随着模型参数量的增大,ViT 性能并没有饱和的迹象,这表明继续增大模型大小可以进一步提高模型性能

Inspecting ViT

Patch embedding 层


  • ViT 的 patch embedding 层将 flattened patches 进行了线性投影,下图显示了学得的 embedding filters 的主成分。这些主成分似乎形成了一组能表示 patch 纹理结构的基函数
    在这里插入图片描述


Position embeddings


  • 下图展示了每个 patch 与其余 patch 的余弦相似度。可以看到,空间上更相近的 patches 对应的 position embeddings 也更相似,除此之外,在同一行或同一列的 patches 对应的 position embeddings 也更相似 (a row-column structure)
    在这里插入图片描述


Self-attention


  • Self-attention 使得 ViT 能从最底层开始就整合图片的全局信息,下面的实验探索了 ViT 在多大程度上利用了这种能力。为此,我们计算了每个 Transformer 块的不同 heads 的 mean attention distance (根据每个 head 中不同 patches 之间的空间距离和 attention weight 计算,类似于 CNN 中的感受野),可以发现,有一些 heads 在最底层就已经开始整合图像的全局信息,而另一些 heads 在最底层只负责整合局部信息 (这种局部性在 hybrids 模型中表现得更少,这表明它们的功能可能与 CNN 的较低层相近),并且总体而言,attention distances 随着网络深度的增加而增加,表明随着层数的增加,ViT 逐渐关注更高层次的信息
    在这里插入图片描述


Attention map

在这里插入图片描述


  • 这里使用 Attention Rollout 进行可视化。简单地说,就是对 ViT-L/16 的所有 heads 中的 attention weights 计算平均值,然后对于所有层,递归地乘上权重矩阵

Self-Supervision


  • Transformers 在 NLP 领域的成功不仅来源于它强大的可扩展性,更在于它大规模自监督的预训练方式。因此,类似 BERT,我们也尝试了 masked patch prediction,最终的 ViT-B/16 模型在 ImageNet 上取得了 79.9% 的精度,这比从头训练得到的精度高了 2%,但也比有监督学习精度低了 4%。这表明 ViT 的自监督学习仍是一个值得探索的方向

References


  • paper: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
  • Fine-tuning code and pre-trained models: https://github.com/google-research/vision_transformer
  • ViT 论文逐段精读【论文精读】
  • Intriguing Properties of Vision Transformers

推荐阅读
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 本文探讨了一种统一的语义数据模型,旨在支持物联网、建筑及企业环境下的数据转换。该模型强调简洁性和可扩展性,以促进不同行业间的插件化和互操作性。对于智能硬件开发者而言,这一模型提供了重要的参考价值。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • 说明Python教程正在编写中,欢迎大家加微信sinbam提供意见、建议、纠错、催更。drymail是一个邮件发送库,封装了Python的smtplib ... [详细]
  • 本文探讨了在 SQL Server 2012 的 Integration Services 项目中配置 ADO.NET 源时遇到的错误及其解决方案。 ... [详细]
author-avatar
mobiledu2502909027
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有