深度学习之ViT

这篇文章的核心是提出了Vision-Transformer结构,将2017年Attention is All you Need在NLP中引入的Transformer结构应用于计算机视觉任务中。Transformer是一种基于自注意力结构的网络,和CNN捕捉卷积窗口内的局部信息不同,它利用注意力来捕获全局上下文信息之间的相关性。文章引入图像块(patch)的概念,patch由深度学习之ViT个像素组成,通过将patch进行flatten,然后通过投影层转换成固定长度的特征向量,最后和NLP中表示1个token(word)的词向量一样输入到Transformer的Encoder结构中。
Note:

  1. 关于Transformer的详细结构介绍,可参考我的另一篇NLP之Transformer
  2. 注意力机制是衡量多个representation之间相关性的常量,本质是一种门机制,也可以把它理解成一种modulation机制,其值通常在深度学习之ViT之间,通过元素级相乘的方式和value相结合,从而往原始value中引入了注意力,这样的目的就是为了让网络更加关注value中重要的部分,从而利用value中我们所需要的那部分,而不让我们不需要的那部分value来损害模型的表现力。关于注意力机制,可参考我的另一篇NLP之Seq2Seq

参考文档:
Transformer 模型详解
真香!Vision Transformer快速实现Mnist识别

Abstract

  1. 在以往Transformer在计算机视觉上的应用中,它主要起2种作用:①和CNN一起结合使用;②替换整个CNN框架结构的一部分。
  2. 本文提出的ViT结构可以切断和CNN的这种依赖关系,可以纯使用Transformer的Encoder结构,通过引入图像分块概念来解决计算机视觉任务,比如图像分类等。
  3. Vit在大型数据集上训练,在中型或小型数据集种进行微调,在当时可以实现在图像识别中SOTA的水平!

1 Introduction

深度学习之ViT
Transformer是在2017被提出,和传统神经网络基于CNN不同,Transformer主要基于自注意力(虽然attention和CNN没有直接联系,但是整个Transformer结构中还是有CNN的成分的,只是作者刻意规避了CNN),当时是应用于NLP中去取代RNN这种串行递归结构处理语言的低效性,因为Transformer可以并行处理数据以及利用自注意力机制让Decoder部分更加关注在Encoder中相关的部分。主流的方法是在大型语言数据集上训练,然后在小型数据集上微调。

深度学习之ViT
Transformer结构在NLP中的成功应用,给在计算机视觉任务上的迁移提供了思路。2018年开始,一些将Transformer应用于计算机视觉的论文就出来了,比如:①Non-local Neural NetworksEnd-to-end object detection with transformers往CNN中引入自注意力机制进行结合;②Stand-Alone Self-Attention in Vision ModelsStand-alone axial-attention for panoptic segmentation将整个Transformer来取代CNN模型中的一部分结构。但是这些方法仍然无法脱离CNN,因此作者提出了一种纯使用Transformer结构的模型,即Vision-Transformer(ViT)结构。

深度学习之ViT
ViT将标准的Transformer直接迁移到计算机视觉任务中,但是有一点略微的修改:

  1. 在NLP中,Transformer的直接输入是word-embedding和position-embedding,它是将每个token(word)通过嵌入层(比如torch.nn.Embedding())转换成词向量,你可以使用word2vec或者一些开源的神经网络库中的一些嵌入层(如Pytorch、Keras、TensorFlow等)将词用稠密向量表示。而在图像中,作者将图像块看成是1个词word,而最终输入进Transformer的patch-embdding就类似于词向量word-embedding
  2. 那么如何将patch转换成patch-embedding这种向量形式呢?作者引入图像分块(patch)概念,先将整幅图像分块,然后将每个图像块(如深度学习之ViT)进行flatten,再利用投影变换映射成图像块嵌入形式,即patch-embedding,这样一来每个图像patch就对应了1个固定长度的向量,然后就可以直接送进Transformer了!

2 Vision Transformer Architecture

在正式介绍之前,先对一些符号做介绍:

  1. 深度学习之ViT分别表示图片的高、宽、通道数。
  2. 深度学习之ViT表示图像patch的size。
  3. 深度学习之ViT表示一张图片中patch的个数。
  4. 深度学习之ViT表示patch嵌入之后的向量的固定长度。
  5. 深度学习之ViT表示输入图像。
  6. 深度学习之ViT表示将深度学习之ViT个patch进行flatten展平之后的矩阵,将它嵌入之后就是固定长度为深度学习之ViT的patch向量了,此外深度学习之ViT就表示第深度学习之ViT个patch展平之后的1维向量。关于深度学习之ViT,其大致结构如右图所示:

深度学习之ViT
下图就是整个ViT的网络结构,接下来我们对它进行详细介绍:

  1. 图像分块:将一张通道为深度学习之ViT深度学习之ViT的图片深度学习之ViT按照深度学习之ViT的patch大小进行分块,如上图所示,产生9张patch。
  2. 图像展平:然后将每张patch进行flatten展平产生一个深度学习之ViT的向量,然后将深度学习之ViT个patch堆叠起来,输出深度学习之ViT
  3. Patch嵌入(Embedding):每一个深度学习之ViT和每一个位置深度学习之ViT分别通过线性投影变换深度学习之ViT(其实就是全连接层)产生固定长度的patch向量和位置向量,即patch-embeddingposition-embedding,两者的size都是深度学习之ViT;所以深度学习之ViT个patch和深度学习之ViT个位置的嵌入结果就是深度学习之ViT
  4. T-Encoder:将patch-embedding和position-embedding一起输入进标准的Transformer内的Encoder中。
  5. 分类:这篇文章作者是做在图像识别上的,所以最好是多分类。

Note:

  1. 第二步图像展平过程是将通道信息深度学习之ViT一起flatten的。
  2. 论文中是最后的嵌入结果是深度学习之ViT,是因为它还加入了一个分类token,这是为了具体分类任务需要,并不是ViT通用框架内的东西。
  3. 增加位置信息是因为原本RNN中天然有表示序列顺序的信息,而Transformer的并行化结构无法表示每个patch的位置信息,由于这也是个重要的信息,所以和NLP中加入每个token的位置信息一样,ViT也会加入每个Patch的位置信息。
  4. Patch嵌入、位置嵌入和词嵌入一样,可以通过word2vec这种无监督方法预先训练好,也可以使用一些嵌入层和Transformer一起做监督训练。
  5. Patch-EmbeddingPosition-EmbeddingWord-Embedding都属于固定长度的向量,是作为Transformer的直接输入信号;且他们都可以通过训练嵌入层(Embedding layer)输出得到。
  6. 1个图像patch对应了1个深度学习之ViT深度学习之ViT维的patch-embedding和1个深度学习之ViT维的position-embedding
  7. ViT只使用Transformer中的Encoder部分。

标准的Transformer的Encoder结构如下图所示:

整个ViT的数学表达式如下:
深度学习之ViT
深度学习之ViT
深度学习之ViT
深度学习之ViT

Transformer的核心就是MSA这个多头自注意力模块(Multi-head Self-Attention),接下去我们对它进一步展开介绍:
深度学习之ViT为经过LN之后的输出,则
深度学习之ViT其中深度学习之ViT各自通过线性层得到,深度学习之ViT表示Query,深度学习之ViT表示Key,深度学习之ViT表示Value;
深度学习之ViT用于计算注意力权重,深度学习之ViT是输入深度学习之ViT的另一种表达,则注意力权重矩阵深度学习之ViT可表示为:
深度学习之ViT因此,单头(single-head)的自注意力就可以总体表示为:
深度学习之ViT
如果说单头是1个人对于图片的注意力,那么多头multi-head就是多个人对于图片的多份注意力,是不同的理解,即multi-head就是同时并行运行深度学习之ViT个single-head自注意力,最后将结果concat起来:
深度学习之ViT为了使得输入的深度学习之ViT和输出的注意力保持相同的size,一般会取深度学习之ViT
Note:

  1. 深度学习之ViT的每一行都代表着1个patch

3 Conclusion

  1. 文章推出了一种基于patch-wise注意力机制的Transformer模型——Vision Transformer(ViT)。
  2. ViT不需要和CNN相结合,它只用单纯的Transformer模型来实现图像识别。具体而言,ViT使用图像分块patch的思想,将每个patch看成是NLP中的1个token,通过flatten以及嵌入层来产生patch-embedding和position-embedding,它类似于词向量的形式;然后就可以直接输送进Transformer的Encoder模块,从而完成Vision的任务。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年5月16日
下一篇 2022年5月16日

相关推荐