ViT论文笔记:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

前言

讲得超级好的论文讲解:ViT论文逐段精读【论文精读】



介绍

Transformer在NLP的大火,让CV的人坐不住,就想拿过来大展身手。本文的Vision Transformer(ViT)借鉴了Transformer和BERT,在图片分类得到了很不错的效果。
ViT 将图片分为大小为 16 × 16 16\times16 16×16 的n个patches,再将它们展开成一维向量(对应于NLP中word的one-hot embedding),这样子输入就是一个由一维向量组成的序列,就可以完全匹配Transformer输入的样子了。详细操作后面讲。



相关工作

ViT并不是第一个把Transformer用在计算机视觉上的工作。
有把CNN与self-attention结合的:比如将CNN后的feature map输入transformer的,每个像素对应序列的一个位置(之所以不输入原图像,是因为这样处理生成的序列长度是 n 2 n^2 n2级别的,再用transfomer处理的话参数量和时间复杂度惊人,所以先用CNN把图像缩小一下)。但是这些工作需要复杂的工程来进行硬件加速,而ViT不需要,因为Transformer的硬件加速已经很成熟了。

也有像ViT一样直接使用Transformer的:论文指出有20年的一篇论文跟ViT的思路基本一样,只不过它使用的是 2 × 2 2\times2 2×2 的patch,而ViT使用的是 16 × 16 16\times16 16×16 的。patch越小,图片对应的序列就越长,花费时间和内存就越大。所以之前的工作不能处理高分辨率的图片,而ViT可以。



基本框架

从流程图可以看出,基本上就是Transformer的架构,所以也可以非常容易地把Transformer的实现直接拿过来用。

首先,将图片分为 16 × 16 16\times16 16×16 的patches,再将patches展开成为一维向量。用公式表示就是:假设原图为 x ∈ R H × W × C x\in R^{H\times W\times C} xRH×W×C,把它分成N个patches后展开成N个一维向量 x p ∈ R N × ( P 2 ⋅ C ) x_p\in R^{N\times (P^2\cdot C)} xpRN×(P2C),其中 N = H W / P 2 N=HW/P^2 N=HW/P2

接着将这N个向量输入一个embedding层,线性映射为N个维度为D的patch embedding x p E ∈ R N × D x_pE\in R^{N\times D} xpERN×D

Transformer输出N个向量,用哪个向量来进行最后的分类呢?这里ViT模仿BERT,在patches embddings x p E x_pE xpE 前面加一个可学习的[CLS] token x c l a s s = z 0 0 x_{class}=z_0^0 xclass=z00(就是流程图中0号位置的*)。最后用Transformer输出的第一个向量 z L 0 z_L^0 zL0 输入分类器中进行分类。

模仿BERT,还得加上一个可学习的表示位置信息的一维的 positional embeddings
(这里论文做了实验,证明用一维的,二维的,相对的positional embedding的效果都差不多,就直接用了跟Transformer一样的了。)

输入Transformer encoder后,将输出的第一个向量送入分类器中得到分类结果。这里的分类器是一个包含一个隐藏层的MLP。
(以往图片的分类方法都是GAP/global average pooling:就是最后输出的每一个通道进行一次平均池化,得到一个维度为通道数的向量输入分类器。论文做了实验,证明这种方法也行,两者取了适合的学习率效果是没差的,为了模仿BERT,就还是使用了加token的方法。)

用公式表示全过程就是:



Inductive bias(归纳偏置)

CNN本身有着一些图像的先验知识:局部性(locality)、平移不变性(translation equivalence)、two-dimensional neighborhood structure。而在ViT中,除了MLP层有局部性和平移不变性,其他部分比如self-attention是全局性的;而且最开始切割图像成patches时已经破坏了图像的two-dimensional neighborhood structure;而且positional embeddings也没有关于2D位置的信息。

正因为没有这些先验知识 / 归纳偏置,ViT必须从头开始学习这些知识,导致ViT在中小数据集预训练后的表现并没有 ResNet-like 的 CNN 表现好。不过在大型数据集预训练后效果就很好,也比CNN花费更少的时间,相对训练更"便宜"(注意是相对,模型还是很大的)。

论文也做实验来说明了这个情况。(在中小型数据集ResNet还是很强啊!)
论文选取JFT(303M images)、ImageNet-21k(14M images)、ImageNet-1k(1.3M images)作为大、中、小数据集,用它们进行预训练后比较分类准确度。

可以看到在小型数据集,ViT没有任何优势;在中型数据集,ViT和CNN水平相当;在大型数据集,ViT总算是占了点优势。

论文还做了实验来体现ViT在训练速度上的优越性。

从上面表最后一行可以看出,在准确度差不多的情况下,最大的ViT用一张TPUv3训练“只需要”2500天,而训练BiT-L要9900天,可见ViT真的训练得很快啊!

(上图的Hybrid指的是用CNN得到feature map后再输入ViT。)
从上图可以看出,在相同的计算次数下,ViT的分类准确度是高于CNN的。而且在较小的model中,hybrid的准确度是高于ViT的,说明CNN加入的一些归纳偏置确实有帮助到ViT;但到更大的模型时,CNN的帮助也就没那么明显了,这说明在大型模型大型数据面前,什么归纳偏置都不是事!大不了我ViT重新学!
还有就是随着模型变大,ViT的性能并没有要饱和的意思,也就是模型再大它还能更好。(其实图中的ResNet也是没有饱和的迹象)



更高的分辨率

当图像分辨率变大时,输入Transformer encoder的序列就变长了,这时候前面学到的positional embedding可能就没那么有效了。论文采取的是在预训练好的positional embedding进行 2D插值。



还有一些实验

论文画出了ViT最前面对patches做embedding时的线性矩阵,看起来跟CNN的卷积核很像,确实学到了一些纹理之类的东西:

论文还计算了每个postional embedding之间的相似性,从图中可以看出:在相同行 / 列的patches的positional embeddings是相似的:

论文画出了随着层数增加,每个head的关注的图像的位置之间的平均最远距离。从图中可以看出,一开始在较浅的层数时,有些heads关注全局的信息,有些heads关注局部的信息;随着网络的深入,heads越来越关注的是全局的语义信息了。这跟CNN是类似的:

论文在图上标出了注意力机制注意到的东西,我理解的论文写的标注方法是:先计算每一层所有heads的平均的attention weights,再把每一层的平均attention weights乘起来,最后乘以patches再拼起来。从图上可以看出注意力机制真的注意到了图上与分类有关的东西:

self-supervision:
在NLP,Transformer在自监督学习方面表现得很好。NLP自监督学习的任务有:masked language modeling(就是挖掉词然后预测)。ViT模仿这个创了一个自监督学习任务:masked patch prediction for self-supervision(就是遮掉一部分图然后来生成完整的图),实验效果不错,但是没有达到监督预训练的效果。论文认为这是个发展的方向。



总结

ViT用尽量少的改动将Transformer搬到了CV这边,在大型数据集预训练后克服了缺少归纳偏置的缺陷,取得了很好的效果,预训练的花费也相对“少”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值