
这篇文章的核心是提出了Vision-Transformer结构,将2017年Attention is All you Need在NLP中引入的Transformer结构应用于计算机视觉任务中。Transformer是一种基于自注意力结构的网络,和CNN捕捉卷积窗口内的局部信息不同,它利用注意力来捕获全局上下文信息之间的相关性。文章引入图像块(patch)的概念,patch由 P × P P\times P P×P个像素组成,通过将patch进行flatten,然后通过投影层转换成固定长度的特征向量,最后和NLP中表示1个token(word)的词向量一样输入到Transformer的Encoder结构中。
Note:
- 关于Transformer的详细结构介绍,可参考我的另一篇NLP之Transformer。
- 注意力机制是衡量多个representation之间相关性的常量,本质是一种门机制,也可以把它理解成一种modulation机制,其值通常在 [ 0 , 1 ] [0,1] [0,1]之间,通过元素级相乘的方式和value相结合,从而往原始value中引入了注意力,这样的目的就是为了让网络更加关注value中重要的部分,从而利用value中我们所需要的那部分,而不让我们不需要的那部分value来损害模型的表现力。关于注意力机制,可参考我的另一篇NLP之Seq2Seq。
参考文档:
①Transformer 模型详解
②真香!Vision Transformer快速实现Mnist识别
Vision Transformer
Abstract
- 在以往Transformer在计算机视觉上的应用中,它主要起2种作用:①和CNN一起结合使用;②替换整个CNN框架结构的一部分。
- 本文提出的ViT结构可以切断和CNN的这种依赖关系,可以纯使用Transformer的Encoder结构,通过引入图像分块概念来解决计算机视觉任务,比如图像分类等。
- Vit在大型数据集上训练,在中型或小型数据集种进行微调,在当时可以实现在图像识别中SOTA的水平!
1 Introduction
Transformer in NLP \colorbox{violet}{Transformer in NLP} Transformer in NLP
Transformer是在2017被提出,和传统神经网络基于CNN不同,Transformer主要基于自注意力(虽然attention和CNN没有直接联系,但是整个Transformer结构中还是有CNN的成分的,只是作者刻意规避了CNN),当时是应用于NLP中去取代RNN这种串行递归结构处理语言的低效性,因为Transformer可以并行处理数据以及利用自注意力机制让Decoder部分更加关注在Encoder中相关的部分。主流的方法是在大型语言数据集上训练,然后在小型数据集上微调。
Transformer in Previous Vision \colorbox{lightseagreen}{Transformer in Previous Vision} Transformer in Previous Vision
Transformer结构在NLP中的成功应用,给在计算机视觉任务上的迁移提供了思路。2018年开始,一些将Transformer应用于计算机视觉的论文就出来了,比如:①Non-local Neural Networks、End-to-end object detection with transformers往CNN中引入自注意力机制进行结合;②Stand-Alone Self-Attention in Vision Models、Stand-alone axial-attention for panoptic segmentation将整个Transformer来取代CNN模型中的一部分结构。但是这些方法仍然无法脱离CNN,因此作者提出了一种纯使用Transformer结构的模型,即Vision-Transformer(ViT)结构。
Transformer in ViT \colorbox{dodgerblue}{Transformer in ViT} Transformer in ViT
ViT将标准的Transformer直接迁移到计算机视觉任务中,但是有一点略微的修改:
- 在NLP中,Transformer的直接输入是word-embedding和position-embedding,它是将每个
token(word)通过嵌入层(比如torch.nn.Embedding())转换成词向量,你可以使用word2vec或者一些开源的神经网络库中的一些嵌入层(如Pytorch、Keras、TensorFlow等)将词用稠密向量表示。而在图像中,作者将图像块看成是1个词word,而最终输入进Transformer的patch-embdding就类似于词向量word-embedding。 - 那么如何将patch转换成patch-embedding这种向量形式呢?作者引入图像分块(
patch)概念,先将整幅图像分块,然后将每个图像块(如 4 × 4 4\times 4 4×4)进行flatten,再利用投影变换映射成图像块嵌入形式,即patch-embedding,这样一来每个图像patch就对应了1个固定长度的向量,然后就可以直接送进Transformer了!
2 Vision Transformer Architecture
在正式介绍之前,先对一些符号做介绍:
- H 、 W 、 C H、W、C H、W、C分别表示图片的高、宽、通道数。
- P P P表示图像patch的size。
- N = H W P 2 N = \frac{HW}{P^2} N=P2HW表示一张图片中patch的个数。
- D D D表示patch嵌入之后的向量的固定长度。
- x ∈ R H × W × C x\in \mathbb{R}^{H\times W\times C} x∈RH×W×C表示输入图像。
- x p ∈ R N × ( P 2 ⋅ C ) x_p\in \mathbb{R}^{N\times (P^2\cdot C)} xp∈RN×(P2⋅C)表示将 N N N个patch进行flatten展平之后的矩阵,将它嵌入之后就是固定长度为 D D D的patch向量了,此外 x p i x_p^i xpi就表示第 i i i个patch展平之后的1维向量。关于 x p x_p xp,其大致结构如右图所示:

ViT框架结构 \colorbox{tomato}{ViT框架结构} ViT框


1万+

被折叠的 条评论
为什么被折叠?



