论文学习笔记:ViT Vision Transformer An Image is worth 16X16 words

news2024/11/29 4:42:00

论文阅读:ViT Vision Transformer An Image is worth 16X16 words

今天介绍的是 Transformer 在视觉领域的一篇非常重要的论文,Vision Transformer,这篇文章发表在 2021 ICLR 的会议上。长久以来 CNN 一直是 CV 领域最主流的模型,随着 Transformer 的提出,以及其在 NLP 领域的的统治地位,CV 界的人也开始思考把 Transformer 引入 CV 任务的可行性。果然,就有了这篇 Vision Transformer。这篇文章的作者同样来自谷歌。

好了,现在开始进入正题

Abstract

首先看摘要部分,文章作者一开始就提到说虽然 transformer 已经成为了 NLP 领域的主流模型,但是在 CV 领域,这个模型的使用还是非常的受限。因为 transformer 模型里面的核心模块是 attention 机制,所以作者接下来说到,在视觉领域,attention 要不与卷积神经网络一起使用,要不是用 attention 去替换卷积神经网络里的一些模块,但是整体的 CNN 架构还是保持的。然后文章作者证明说,其实视觉领域里面的任务,CNN 也不是非要不可的,文章作者就说如果有足够多的数据来做预训练,那么一个基于纯 attention 机制的 transformer 模型也能将图像分类任务处理地很好。所以文章的摘要,主要就是说 CV 任务也可以不依赖 CNN 模型,只要数据量足够,那么 transformer 预训练模型也能在 CV 领域取得很好的表现。

Introduction

导言的第一段,作者说在 NLP 领域,基于自注意力机制的架构,尤其是 transformer 模型,已经成为了 NLP 领域的标配。主流的方法一般是在一个很大的数据集上做预训练,然后再在一个小规模的特定数据集上做 finetune。多亏了 transformer 模型的计算高效性以及可扩展性,目前的模型规模也越来越大,基本都到了 1000 亿规模的参数量了。而且作者还提到说,随着你模型参数量以及数据量的增长,目前还没有看到性能饱和的现象。这似乎为一年之后的 ChatGPT 的出现埋下了伏笔。

然后第二段,文章作者介绍了 CV 领域的现状,CV 领域的很多任务还是以 CNN 模型为主流架构。然后,受到 NLP 领域的一些启发,也开始有相关的工作尝试在 CV 领域引入注意力机制,文章作者也列举了几篇相关工作,不过作者也提到,这些工作中的 attention 机制都是一些特定设计的 attention 机制,不像标准的 attention 机制,有很好的硬件支持,所以这类特殊的 attention 机制的工作还不能高效地进行大规模的训练,所以目前主流的 CV 任务中,还是基于 ResNet 的模型的效果是最好的。

第三段,文章作者就引出了 vision transformer 的工作,文章作者说受 transformer 在 NLP 领域成功的启发,文章作者们设计了一种可以在图像上进行注意力计算的 transformer。因为是在视觉领域应用 transformer,所以作者就直接称其为 vision transformer。文章作者提到说,为了实现在图像上进行标准的注意力操作,他们先把图像拆分成很多个图像 patch,然后每个图像 patch 通过一个 linear embedding 进行维度的变换,变换后的每个 patch 就类似 NLP transformer 里的词向量,patch 的数量就类似序列的长度,这样就可以进行标准的 attention 的计算了。然后在图像分类任务上进行有监督的训练。

接下来是导言的第四段,文章作者说如果 vision transformer (ViT) 在中等规模的数据集上训练,那么比起同样参数量的 ResNet 来说, ViT 的性能其实会弱一些,作者也做出了一些解释,文章中说是因为 Transformer 与 CNN 模型相比,它缺少一些 inductive biases,这个词翻译过来叫归纳偏置,我看相关的精度论文视频里面把归纳偏置解释为类似先验假设的一些知识。CNN 的先验假设就是 locality 和 translation equivariance 。听起来还是有些道理的,总结来说就是 transformer 比起 CNN 少了一些先验假设,所以为了达到同样的效果,需要更多的训练数据。因为导言的第五段,也就是最后一段,作者就介绍说,随着训练数据规模的增加,ViT 预训练模型的表现也变得越来越好,迁移到其它一些中等规模数据集上的表现已经持平甚至超越 ResNet 了。

Related Work

接下来是相关工作的介绍。

第一段主要还是讲了一下 transformer 在 NLP 的发展。自从 2017 年 transformer 在 NLP 领域出圈之后,NLP 领域基于 transformer 的模型也做得越来越大,这类模型一般都是在一个很大的语料库上做预训练,然后在特定的任务上做微调。然后又大概介绍了一下两个比较出名的工作,一个是 Google 的 BERT,一个是 OpnenAI 的 GPT。BERT 是用一种 denoising 的方式做预训练,也就是完形填空;而 GPT 是用语言模型做预训练。

第二段就是介绍 self-attention 在 CV 领域的应用。因为视觉要处理的对象一般都是一张图片,所以最直观的方法就是把图片看成是很多个像素的集合,但是如果直接这样处理,那么计算的复杂度肯定是显而易见地太大了。所以直接把像素当做序列肯定是不现实的。接下来作者介绍了一些相关工作,主要是怎么去近似整个图像。一类工作是不再对全局图像做 self-attention,而是对局部邻域做 self-attention。还有一类工作是用 sparse transformer,也就是对图像特定的像素点提取出来,做 self-attention。还有一类工作就是在不同尺度的 block 上做 self-attention。这些工作其实在 CV 任务上的效果也不错。但是都需要复杂的工程技巧去做硬件加速。

接下来第三段,文章作者提到了和他们想法最接近的一篇工作,这篇工作的核心思想和 ViT 基本一模一样,也是把图像拆成很多个 patch,然后 patch 之间计算 self-attention。文章作者也解释了两者的差异。之前的工作,图像的 patch size 是 2 × 2 2 \times 2 2×2,所以之前的那篇工作只能处理很小分辨率的图像,而本文的图像 patch 是 16 × 16 16 \times 16 16×16,可以处理更高分辨率的图像。而且本文也凸出了大规模预训练的 vision transformer 可以取得超越 CNN 的效果。这都是之前的相关工作所没有做到的。

第四段的相关工作,文章作者主要是介绍一些 CV 领域的工作如何把 self-attention 和 CNN 相结合。

第五段,文章作者提到了另外一篇和本文比较相关的工作,叫做 image GPT (iGPT),这是一个生成模型,而且其中的 self-attention 是直接作用在低分辨率的图像像素上的,这个生成模型是用无监督的方式训练的,用这个模型提取的特征表达去做分类,在 ImageNet 上可以取得 72% 的识别率。

最后一段,就是大概讲了一下数据规模对模型表达能力的提升是有帮助的。有些工作研究了使用额外的数据能够帮助模型提升识别率。另外有些工作研究了随着数据规模的增加,模型的识别率也能得到一定的提升。

Method

接下来,我们来看文章的核心部分,也就是 Vision transformer 的模型架构到底长啥样,如果对 transformer 比较了解的话,可以看到 vision transformer 基本和 transformer 一样,然后文章作者也给出一个整体的框架图,如下图所示:

在这里插入图片描述

从这个框架图,我们就能了解整个的算法流程,首先是输入一张 RGB 三通道的彩色图,将这张图拆成若干个 16 × 16 16 \times 16 16×16 的 patch,这里是拆成了 9 宫格的形式,也就是假设有 9 个 patch,实际的 patch 数量是由输入的尺寸与 patch 尺寸共同决定的,如果输入是 224 × 224 224 \times 224 224×224 的话,那么实际就会有 ( 224 × 224 ) / ( 16 × 16 ) = 196 (224 \times 224) / (16 \times 16) = 196 (224×224)/(16×16)=196 个 patch。这些 patch 都会经过一个线性映射层,映射到另外一个维度,因为每个 patch 是 16 × 16 16 \times 16 16×16 的大小,然后每个 patch 是 3 个通道,所以每个patch 拉伸成 1-D 向量的话,就变成了 $16 \times 16 \times 3 = 768 $ 维的向量,768 维的向量通过线性映射层,映射成一个维度为 D 的向量。然后这个维度为 D 的向量,可以认为是 patch embedding 得到的输出,后面的处理都是处理维度为 D 的向量。

然后作者也提到说,他们参考了 BERT 这篇文章的处理方式,在整个 patch embedding 的最前面,还插入了一个 class token,专门用于分类的特征表达,这个 class token 的特征维度也是 D,所以最终进入 transformer 的序列长度可以认为是 196 + 1 = 197 196+1=197 196+1=197,因为 attention 机制是一个全局的相关运算,所以文章作者认为这个 class token 的特征表达最后是会融合所有图像 patch 的信息的。这个 class token 通过 transformer 编码器之后,会得到一个输出,这个输出作为整个图像 patch 序列的特征表达,送入一个 MLP 进行最后的分类运算。文章作者这里也提到说,在预训练的时候,这个分类的 MLP 是带一个隐含层的,在进行任务微调的时候,是不带隐含层的。

接下来,作者介绍了一下位置编码,这里作者也是借鉴了 BERT 的处理方式,将位置编码表示成可以学习的 1-D 的位置编码,作者也说虽然可以用 2D 的位置编码,但是两者的最终效果没有什么差异,所以本文还是用 1-D 的位置编码。

然后作者将整个 transformer block 的运算流程介绍了一下,其实从框架示意图的右边部分也能清晰地了解整个运算过程。从 patch embedding 得到的向量,先做一个 layer-norm,然后送入多头自注意力模块进行计算,这个模块的输出会进行残差的连接,然后再经过一个 layer norm,然后再经过一个 MLP,这样的过程重复 L 个 block,最后把 class token 对应的输出送入分类 MLP 做最后的分类。

在这里插入图片描述

  • Inductive bias, 接下来作者也介绍了一下 vision transformer 的归纳偏置,相比 CNN,vision transformer 的归纳编制是很少的。CNN 的归纳偏置包括局部性以及平移不变性。而在 ViT 里,只有 MLP 有这样的归纳编制,attention 本身是一个全局的运算机制。而 2D 的图像结构或者相对位置信息,只有在拆分图像 patch 的时候会用到。

  • Hybrid Architecture,作者也提到了 CNN 结构与 transformer 的混合,因为输入的图像 patch,其实也可以换成 feature map,所以一种方式就是在前端用 CNN 结构,提取 feature map,然后将提取的 feature map 看做图像 patch,将这些 feature map 最后输入后端的编码器。

最后作者大概介绍了一下 finetune 与高分辨率图的处理。因为 ViT 的最佳使用方式是先在一个大规模的数据集上做预训练,然后再在特定的任务上做微调,微调的时候,需要把 MLP 的分类头替换成对应的类别数量。然后作者也提到说,一般微调的时候,如果处理更高分辨率的图像,效果会更好。然后作者接下来大概解释了一下说,处理高分辨率的图像的时候,图像的 patch size 还是可以与预训练的时候一样,这样就会让图像的 patch 数变多,也就是图像的 patch 序列会变长,但是这个不会影响 self-attention 的计算,不过会影响之前预训练时候的位置编码特征,因为预训练是好的位置编码是基于一定的长度进行学习的,现在如果需要改变序列长度,可能让之前学习到的位置编码特征失效。文章作者这里提出了一种插值的方式来解决这个长度不一致的问题。根据预训练时候学习到的位置编码信息以及图像 patch 在序列中的位置,插值出新增的序列位置。

  • 参考

https://www.bilibili.com/video/BV15P4y137jb/?spm_id_from=333.788&vd_source=bb80399e033aacf33a21a9f9864c6086

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

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

相关文章

从零开始:开发一款应用程序的完整流程技巧

在数字化快速发展的现在,开发一款应用程序已经不是一件困难的事情。低代码应用开发平台的诞生更是让应用开发变成一项人人都能快速掌握的技能。之前,我们使用Java、C语言等传统的语言技术进行应用开发,来满足企业的业务应用需求。但是&#x…

rm / -rf指令的作用是?

学习Linux 指令,它是操作系统的前端,学好这部分内容一方面可以帮助你应对工作场景,另一方面可以让你在学习操作系统底层知识前,对 Linux 有一个大概的了解。 学习 Linux 指令之前,先来说一下什么是 Shell?S…

使用FFMPEG加载外挂字幕小记

ffmpeg版本: FFMEPEG 4.4 继上一篇简易播放器实现后,优化过程中,加载外挂字幕小记的过程和遇到的坑记录如下: 视频字幕分为三种。 内嵌字幕,字幕与视频图像合二为一,成为视频帧的一部分。 内封字幕&…

Python浪漫520表白代码

目录 前言 表白界面 跳动的爱心 漂浮的爱心 满屏表白代码 前言 520是每年的5月20日,因数字“520”与“我爱你”发音相似而被许多年轻人用作表达爱意的节日。这个节日起源于中国互联网文化,逐渐传递到其他国家和地区。在这一天,情侣们通…

C++:深入理解C++11新特性:Chapter3:左值和右值

Chapter3:左值和右值 1. 将右值绑定到 左值2. 将右值绑定到 常量左值引用3. 将右值绑定到右值引用总结:5. 左值,右值和右值引用6. 引用类型可以引用的值 在C语言中,我们常常会提起左值(lvalue),右值&#x…

数组--part 5--螺旋矩阵(力扣59/54)(剑指offer 29)

文章目录 基本算法思想leetcode 59 螺旋矩阵 IIleetcode 54 螺旋矩阵剑指Offer 29 顺时针打印矩阵 基本算法思想 建议先去把题目看了,再来思考相关的代码。 错误的想法:实际上这种题型并不存在算法,只涉及到模拟,但是模拟难度并…

【51单片机】外部中断

🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔原理 🍔注意管…

未来的数字签名方案:Dilithium、FALCON 和 SPHINCS+

1. 引言 当前的数字签名方案主要有: RSAECDSAEdDSA:已废弃DSA,将EdDSA纳入FIPS 186。 这些数字签名方案都不可抗量子攻击。为此,需要新的量子强健的签名方案,NIST引入了3种新的PQC数字签名标准化方案: …

软考A计划-真题-分类精讲汇总-第八章(面向对象)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

【CSS基础】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、CSS是什么? 语法规范 引入方…

基于matlab使用主动声纳系统进行水下目标检测

一、前言 此示例演示如何模拟具有两个目标的主动单基地声纳方案。声纳系统由各向同性投影仪阵列和单个水听器元件组成。投影仪阵列呈球形。反向散射信号由水听器接收。接收到的信号包括直接和多路径贡献。 二、水下环境 在浅水环境中,声源和目标之间存在多个传播路径…

网络工程师常用命令排行榜,Ping就在这一行

大家好,我是老杨。 如果问你,你在日常工作中用的最频繁的命令是哪个,你下意识的第一反应是什么。 年前,我做了个不完全统计,大概有100多位粉丝参与的问卷调查, 调查每一位网工在解决网络故障时使用最多的…

[PCIE703]FPGA实时处理器-XCKU060+ARM(华为海思视频处理器-HI3531DV200)高性能综合视频图像处理平台设计资料及原理图分享

板卡概述 PCIE703是自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台,该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#x…

基于matlab编程的线性规划整数解问题求解

背景: 自己读研期间曾经用matlab做过一些小项目和实验,自己的毕业论文实验仿真也是用的matlab,最近打算更换电脑,在翻阅电脑磁盘的时候找到了一些和matlab相关的代码和文档,简单整理和分享一下。 说明: …

Dubbo——微服务框架(单体式->分布式->微服务)

是什么? Dubbo是阿里巴巴开源的基于Java的高性能RPC(一种远程调用)分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,它提供了三大核心能力:面向接口的远程…

别让你的云端“瘫痪”——教你如何优化云平台性能测试

目录 引言 目的 测试指标 系统性能指标 资源指标 中间件指标 数据库指标 稳定性指标 批量处理指标 可扩展性指标 可靠性指标 性能测试的过程 测试计划 性能测试项目检测与控制 测试分析 测试设计 测试执行 测试完成 性能分析 性能分析的前提 性能分析的流…

一篇文章让你轻松通过佛科院的电子线路CAD考试——Altium Designer 14原理图设计与PCB设计(叶林朋著)

第一章 考试大纲 通过多次作业练习,我得出了完成一个完整的考试流程: 首先先创建PCB工程,查找一下元件,看一下哪些元件需要我们自己画创建元件集成库,画原理图元件和封装导入所有元件后,按照题目所给的图进…

Springboot源码:自动装配流程解析

前言 前面在写业务框架后,由于项目依赖的Spring IOC,单将该项目install后,在其它项目引入时,会找不到所依赖的Bean。所以利用Springboot的自动转配,在项目启动时加载Bean,并注册到IOC容器中。 Springboot…

node笔记_连接mysql编写js脚本的crud

文章目录 ⭐前言⭐mysql的api依赖库⭐建立数据库连接⭐query执行sql语句💖 create 新增table数据库表💖 insert 插入表数据插入单条数据插入多条数据 💖 select 查询数据💖 delete 删除表数据删除单条数据删除多条数据 ⭐ 结束 ⭐…

prometheus实战之五:飞书通知告警

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《prometheus实战》系列链接 prometheus实战之一:用ansible部署prometheus实战之二:使用常见指标prometheus实战之三:告警…