重读经典:《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》

ViT论文逐段精读【论文精读】

这次李沐博士邀请了亚马逊计算机视觉专家朱毅博士来精读 Vision Transformer(ViT),强烈推荐大家去看本次的论文精读视频。朱毅博士讲解的很详细,几乎是逐词逐句地讲解,在讲解时把 ViT 相关领域的研究也都介绍了,听完之后收获满满。

ViT 应该是过去一年计算机视觉领域影响力最大的一个工作。ViT 挑战了卷积神经网络在计算机视觉领域的绝对统治地位。ViT证明如果能在足够大的数据集上去训练,那么就可以不需要卷积神经网络,直接使用标准的 Transformer 也能把视觉问题解决好ViT 不仅在计算机视觉领域挖了一个大坑;同是它也打破了 CVNLP 之间的壁垒,在多模态领域也挖了一个大坑。可以说,ViT 开启了计算机视觉新时代。

ViT 论文链接: https://arxiv.org/abs/2010.11929


1. 标题、摘要、引言、结论

首先是论文标题,论文标题的意思是:一张图片等价于很多 16×1616\times1616×16 的单词,Transformer 用于大规模图像识别 。16×1616\times1616×16 是指将一张图片划分成若干个 块(patch),每一个 patch 大小为 16×1616\times1616×16。这样一张图片就可以看作是若干个 patch 组成。这篇论文的作者还是蛮多的,有12个作者,可以看出这篇论文工作量确实很大,论文作者全部来自于 Google
在这里插入图片描述


下面是论文摘要,摘要写的很简洁,总共只有4句话。

  • 尽管 Transformer 已经成为自然语言处理任务事实上的一种标准,但是在计算机视觉上的应用还是非常有限。
  • 在计算机视觉领域,注意力机制要么和卷积神经网络一起使用,要么在保持原有网络结构不变的情况下替换局部的卷积运算(例如 ResNet-50 中把其中每某一个残差块使用注意力机制替代)。
  • 本文证明对卷积神经网络的依赖不是必要的,原始的 Transformer 可以直接应用在一系列小块图片上并在分类任务上可以取得很好的效果
  • 在大的数据集上预训练的模型迁移到中小型图片数据集上 (ImageNet, CIFAR-100, VTAB等),与目前最好的卷积神经网络相比,ViT 可以取得非常优秀的结果并且需要更少的训练资源。

(但是仍然需要2500天 TPUv3 训练天数,目前的深度学习真的是进入到了大力出奇迹的时刻,在计算资源上学术界很难能比过工业界。)

在这里插入图片描述


在介绍引言之前,朱毅博士首先介绍了 Transformer 用在计算机视觉上的一些难处。主要是如何将2D图片数据转换成 1D数据?目前 BERT 能够处理的序列长度是512,如果直接将图像像素转换成 1D。即使是 224×224224\times224224×224 大小的图片,其序列长度也有5万多,计算复杂度将是 BERT 的100倍,如果是检测或分割任务,那计算复杂度就更大了。

引言前两段主要是交代故事背景,在自然语言处理任务上,通常会在大的训练集上去训练 Transformer,然后在小的特定任务数据集上去微调。目前可以训练含有上千亿参数的 Transformer 模型,且随着模型和数据集的增加,并没有出现饱和现象。 在计算机视觉领域,卷积神经网络仍然占据主导。最近一些新的研究,有的将自注意力机制和卷积神经网络结合起来训练(即在较小的特征图上使用自注意力机制),这是一种减少序列长度的方法;还有的是使用局部图片作为输入,然后使用 Transformer,也有论文研究分别在图像高度或宽度上使用 Transformer,这些都是为了减少序列长度。但以上方法都存在不足,都是针对特定任务来使用,在大规模图像识别数据集, 像 ResNet 这样的网络仍然是主流。

在这里插入图片描述
下面作者介绍如何将 Transformer 用在计算机视觉。首先将图像划分为一个个 patch,然后使用全连接网络进行线性变换,这样就得到了 patch 线性变换序列,最后将 patch 输入到 Transformer,这里可以将 patch 看成是一个个单词。举个例子,假设图像大小是 224×224224 \times 224224×224,划分成 16×1616\times1616×16patch, 则最终会有196个 patch。可以看到,整篇论文处理流程还是很简洁的,基本上没有什么技术难点。

紧接着作者指出,Transformer 与卷积神经网络相比缺少 归纳偏置,例如相关性(locality)和平移不变性(translation equivariance)。因此为了得到更好的结果,需要有足够多的训练数据,最后一段就是介绍模型效果,果然效果拔群。

在这里插入图片描述


下面是论文结论部分。第一段总结本文做的工作,图片处理成 patch 序列,然后使用 Transformer 去处理,取得了接近或超过卷积神经网络的结果,同时训练起来也更便宜。第二段是未来展望:

  • 一是和目标检测和分割结合起来,ICCV 2021 最佳论文 Swin Transformer 就证明了 Transformer 在检测和分割任务也能取得很好的效果;
  • 另一个是自监督预训练,因为本文是有监督预训练,自监督和有监督预训练还存在着很大的差距,最近何恺明博士的新论文 MAE 就研究了这个问题;
  • 最后是更大规模的 ViT,半年之后作者团队就提出了 ViT-G

在这里插入图片描述


2. 相关工作

下面是相关工作,总共有6段。第1段说2017年 Transformer 被提出来以后,已经成为许多 NLP 任务最先进的方法,代表性的工作有 BERT(完形填空去预测缺少的词)和 GPT(语言模型,预测下一个词)。第2段是说,将自注意力用于图像处理,需要每个像素和每个像素两两交互,复杂度与像素数量平方成正比。因此在图像处理中使用 Transformer 需要做一些近似处理,包括在局部图像块用自注意力、使用稀疏的 Transformer 以及在轴上使用注意力,这些方法都取得了很好的效果,但是需要复杂的工程能力去实现硬件加速。

在这里插入图片描述
接着作者介绍和本文最接近的相关工作,ICLR 2020 的这篇论文使用的 patch 大小是 2×22\times22×2,处理的数据集是 CIFAR-10 数据集,和 ViT 很接近,也是从头到尾使用注意力机制来处理。和这篇论文不同之处是我们的工作显示更大规模的预训练可以使得 Transformer 能取得比 CNN 更好的效果;同时我们使用了更大的 patch ,我们的模型可以处理中等尺度的图片。下面是自注意力机制和 CNN 结合的一些工作,包括图片分类、物体检测、视频处理、文本视频任务等。

另一个最近的工作是 iGPT, 将 Transformer 用于生成式模型,在 ImageNet 上可以取得 72%的准确率。我们的工作研究了更大规模的数据集,主要是 ImageNet-21kJFT-300M

在这里插入图片描述


3. ViT模型、实验

下面是 ViT模型介绍,模型总览图如下图所示。输入为一张图片,将图片划分成9个 patch,划分后的 patch 序列经过线性投射层变换得到 patch embedding ,与此同时对这些 patch 还添加了 position embedding,这样每一个 token 既包括图像信息又包括了位置信息。这里作者还借鉴了 BERT ,添加了 class embedding ,也包括位置信息,最终将这些 token 输入到 Transformer,最后 class embedding 对应的输出经过 MLP Head 进行类别判断,整个模型包括 LLLTransformer

下面是具体实现,假设图像大小是 224×224×3224 \times 224 \times 3224×224×3,划分成 16×16×316\times16\times316×16×3patch, 则最终会有196个 patch。将每一个 patch 拉平,则每一个 patch 维度变为 768。线性投射层使用 E\mathbf{E}E 表示,维度为 768×768(D)768 \times 768(\mathbf{D})768×768DD\mathbf{D}D 是参数。则经过线性变换后输出为: XE=196×768×768×768=196×768\mathbf{X}\mathbf{E}=196\times768\times768\times768=196\times768XE=196×768×768×768=196×768,输出为196个 token,每个 token 维度为768。因为还有一个 class token,位置编码维度为 1×7681\times7681×768,和 patch embedding直接相加(sum),则最终输入维度为 197×768197\times768197×768
在这里插入图片描述
下面是论文原文介绍,首先是 patch embedding 的处理,然后是 class embedding 的处理,最后是 position embedding 的处理。 在附录里作者比较了各种 position embedding 的实验结果,以及 class token 的使用对最终分类结果的影响。为了减少对 Transformer 的改动,作者这里还是使用了 class token1D position embedding
在这里插入图片描述
下面是公式描述,xp1\mathrm{x}_{p}^1xp1 是原始图像块,E\mathrm{E}E 是线性投射层,Epos\mathrm{E}_{pos}Epos 是位置编码,xclass\mathrm{x}_{class}xclass 是类别块,经过 LLLTransformer 处理后,最后根据 zL0\mathbf{z}_L^0zL0 去做类别判断。

z0=[xclass ;xp1E;xp2E;⋯;xpNE]+Epos ,E∈R(P2⋅C)×D,Epos∈R(N+1)×Dzℓ′=MSA⁡(LN⁡(zℓ−1))+zℓ−1,ℓ=1…Lzℓ=MLP⁡(LN⁡(zℓ′))+zℓ′,ℓ=1…Ly=LN⁡(zL0)\begin{aligned} \mathrm{z}_{0} &=\left[\mathrm{x}_{\text {class }} ; \mathrm{x}_{p}^{1} \mathrm{E} ; \mathrm{x}_{p}^{2} \mathrm{E} ; \cdots ; \mathrm{x}_{p}^{N} \mathrm{E}\right]+\mathrm{E}_{\text {pos }}, & \mathbf{E} \in \mathbb{R}^{\left(P^{2} \cdot C\right) \times D}, \mathbf{E}_{p o s} \in \mathbb{R}^{(N+1) \times D} & \\ \mathrm{z}_{\ell}^{\prime} &=\operatorname{MSA}\left(\operatorname{LN}\left(\mathrm{z}_{\ell-1}\right)\right)+\mathrm{z}_{\ell-1}, & & \ell=1 \ldots L \\ \mathrm{z}_{\ell} &=\operatorname{MLP}\left(\operatorname{LN}\left(\mathbf{z}_{\ell}^{\prime}\right)\right)+\mathbf{z}_{\ell}^{\prime}, & & \ell=1 \ldots L \\ \mathrm{y} &=\operatorname{LN}\left(\mathbf{z}_{L}^{0}\right) & & \end{aligned} z0zzy=[xclass ;xp1E;xp2E;;xpNE]+Epos ,=MSA(LN(z1))+z1,=MLP(LN(z))+z,=LN(zL0)ER(P2C)×D,EposR(N+1)×D=1L=1L

下面是归纳偏置介绍,主要是所有 patch 的空间关系都需要从头去学;另一个是将注意力机制和 CNN 特征图结合起来一起使用,构建混合模型,最后是微调模型以及对大尺度图片的处理。

在这里插入图片描述


下面是论文实验部分。这里作者主要设计了三种不同大小的 ViT 模型,如下表所示。
在这里插入图片描述
第一个实验结果是作者分别将ViT 模型在不同的数据集上去预训练,然后在基准数据集上去比较,虽然从表中看到 ViT-H/14 比卷积模型 BiT-L 准确率高得并不多,但是从训练天数可以看到,ViT-H/14 需要的训练天数是 BiTL-L14\frac{1}{4}41 左右,训练代价更小

在这里插入图片描述
图3、4 表明随着预训练数据集的增大,Transformer 的效果会渐渐好于 ResNet,这表明 Transformer 有很好的可扩展性。图5表示,在同样运算能力下,Transformer 的效果也是好于 ResNet

在这里插入图片描述
下面是一些可视化结果,中间这张图可以看到虽然本文使用的是 1D 的位置编码,但是网络仍然能学到不同 patch 位置间关系;右边这张图则表示 Transformer 学习能力,可以看到随着网络越深,获取全局信息能力越强。
在这里插入图片描述
最后作者也做了一个小的自监督实验,证明了 Transformer 是优于卷积神经网络,最近大火的 MAE 也证明了这一点。


最后简单总结下,本文写作简洁明了,实验也是很详尽的,在计算机视觉领域挖了一个大坑;当然朱毅博士这次的讲解也是酣畅淋漓,思路很清晰,看下来受益匪浅。

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

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

相关文章

给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!

lower_bound算法返回第一个大于等于给定值所在的位置。设置两个指针start和last,其中start指向数组的起始位置,last指向数组末尾位置之后的位置。当start和last指向相同位置时循环结束。mid指向[start,last)区间的中间位置,当中间位置元素值大…

详解IMU标定经典论文:A Robust and Easy to Implement Method for IMU Calibration without External Equipments

本文介绍一篇 关于IMU 标定的经典论文,论文收录于 ICRA14,在论文中作者介绍了如何不适用外部设备标定 IMU 加速度和角速度偏差、尺度系数、轴偏移参数。 论文链接:https://readpaper.com/paper/2021503353、https://readpaper.com/paper/221…

重读经典:《Momentum Contrast for Unsupervised Visual Representation Learning》

MoCo 论文逐段精读【论文精读】这次论文精读李沐博士继续邀请了亚马逊计算机视觉专家朱毅博士来精读 Momentum Contrast(MoCo),强烈推荐大家去看本次的论文精读视频。朱毅博士和上次一样讲解地非常详细,几乎是逐词逐句地讲解,在讲…

【HRBUST - 1623】Relation(思维模拟,拆解字符串)

题干: 一天,ikki在看书的时候发现书上有个类似于家谱状的插图,突然ikki想到了一个有趣的现象:有时候用某个人一连串 的关系描述另一个人的时候,最后可能还是他本身。例如:小明的爸爸的爸爸和小明的爷爷是同…

一步步编写操作系统 67 系统调用的实现1-2 68

接上文: 系统调用的子功能要用eax寄存器来指定,所以咱们要看看有哪些系统调用啦,在linux系统中,系统调用是定义在/usr/include/asm/unistd.h文件中,该文件只是个统一的入口,指向了32位和64位两种版本。在a…

【HDU - 6662】Acesrc and Travel(树形dp,博弈dp)

题干: Acesrc is a famous tourist at Nanjing University second to none. During this summer holiday, he, along with Zhang and Liu, is going to travel to Hong Kong. There are nnspots in Hong Kong, and n−1n−1 bidirectional sightseeing bus routes …

一步步编写操作系统 69 汇编语言和c语言共同协作 70

由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用。 会两种不同语言的人,只是掌握了同一件事物的两种表达方式。人在学习一种新语言时,潜意识里是建立了语言符号与事物形象…

一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法。咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量。如今我们要写一个打印函数了&a…

【CodeForces - 208C 】Police Station(单源最短路条数,起点终点建图,枚举顶点)

题干: The Berland road network consists of n cities and of m bidirectional roads. The cities are numbered from 1 to n, where the main capital city has number n, and the culture capital — number 1. The road network is set up so that it is possi…

【Chrome浏览器】常用快捷键整理

标签页和窗口快捷键 1. Ctrl n 打开新窗口 2. Ctrl t 打开新的标签页,并跳转到该标签页 3. Ctrl Shift t 重新打开最后关闭的标签页,并跳转到该标签页 4. Ctrl Tab 跳转到下一个打开的标签页 5. Ctrl Shift Tab 跳转到上一个打开的标签页 6.…

【人工智能课程实验】 - 利用贝叶斯分类器实现手写数字 的识别

读入数据与预处理 因为老师给的文件无法直接读取,故从官网导入数据: 官网链接:http://www.cs.nyu.edu/~roweis/data.html 导入数据之后要对MATLAB文件进行读入: datasio.loadmat(trainfile) 对文件type一下: ty…

一步步编写操作系统 77 内联汇编与ATT语法简介

内联汇编 之前和大家介绍过了一种汇编方法,就是C代码和汇编代码分别编译,最后通过链接的方式结合在一起形成可执行文件。 另一种方式就是在C代码中直接嵌入汇编语言,强大的GCC无所不能,咱们本节要学习的就是这一种,它…

【Python学习】内置函数(不断更新)

关于常用在for循环中的range函数 python range() 函数可创建一个整数列表,一般用在 for 循环中。 函数语法 range(start, stop[, step]) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range&#…

【Python学习】 简单语法与常见错误(持续更新)

关于单引号和双引号 当输出的字符串内部没有单引号的时候,外面可以用单引号, 但是如果内部有了单引号,那么外部只能用双引号。 dict {Name: Zara, Age: 7, Class: First} print(dict) print (dict[Name]: , dict[Name]) print ("dic…

一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。 以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。 在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要…

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE,这是一篇比较新的文章,2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view,但是在英文社区,大家反应比较平淡一点,R…

【Python学习日志】 - Numpy包

NumPy是什么? 使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数(尺寸)…

详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication

在《详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation》 一文中介绍了自动驾驶仿真框架 OpenCDA。本文将介绍论文作者另一篇最新工作 OPV2V,论文收录于 ICRA2022。 OPV2V 数据集主要 feature 有&…

【Python学习】 - 如何在Spyder中弹出plot绘图窗口而不是在Console中绘图

依次选择这几项: 点击ok确认。 注意:点击ok之后不会立即生效,重启Spyder之后才会生效