Vision Transformer的由来

图像识别常见的网络模型

在 Vision Transformer 模型出来之前,我们通常使用的都是基于卷积神经网络(CNN)的模型的变种,经典的 CNN 模型如:ResNet,Google Net,AlexNet等,但是呢 CNN 有一个不可忽视的缺点,在大模型上容易出现过拟合的现象。

Vision Transformer模型的优势

Vision Transformer (ViT),就在图像识别任务达到了不亚于 ResNet 的精度,并且相较于ResNet 训练所耗费的时间,VIT的训练所耗费的算了减少了一大部分。由于 ViT 模型是从在 NLP 领域特别火的 Transformer 模型改编而来,并且没有对Transformer 内部进行修改,ViT主要的改变就是在输入端,将图像进行了分块和降维,从而将图像变成一种类似于词语编码的表达方式,方便了后续处理。经过了这一小步的改动,ViT在JFT-300M(ImageNet的300倍放大版,3亿张图像)上预训练的模型成功超越了ResNet152。由于有这一特性,所以很多在 NLP 领域有重大突破的方法可以很方便的迁移到 CV 中来,反之依然。

Embedded Patch

回顾 Transformer

在上一篇博客传送门讲的 Transformer 中我们对于输入是 n 个元素,而输出也同样是 n 个元素,而经过了 Transformer 之后会有什么改变呢,我们在上一篇博客讲的时候就讲过了,Transformer 中有一个特别的模块是自注意力模块,这样输出的时候每个元素都会与其他元素进行相关连,所以说我们在 Transfromer 中的复杂度是 O(n^2) 的,正因为这个特性所以 Transformer 就有了局限性了,它所能处理的单个序列的长度不能太长

为什么需要进行Embedded Patch

从上面的回顾中我们可以得知 Transformer 所能处理的单个序列的长度不能太长,所以首先我们需要对比一下 NLP 领域和 CV 领域的区别,在 NLP 领域中我们传递的是一个序列,他的输入通常都是长度为几百或者上千的数据,就不会再往上增长了,比如 BERT 模型中序列长度就为512,但是在 CV 中呢,我们最基础的 ImageNet 上的数据大小也是 224*224 的,那这样的话,我们如果总结将图像简单的抽成一个一维向量,他的序列长度就达到了 50176,这是 Transformer 无法接受的长度。
在 Vision Transformer 模型提出来之前有两种使用注意力的模型:

  • 使用 CNN 中间中生成的特征图去当 Transformer 的输入(比如将 Resnet50 的模型最后一个 stage 的输出输入 Transformer,因为他的图片大小正好是 14*14 )
  • 直接将自注意力层替换卷积层
  • Stand-alone self-attention(孤立自注意力就是不去关心整张图片,而是去关注一张图片中的一个局部小窗口,类似卷积感受野的操作)
  • Stand-alone axial-attention(轴自注意力就是分别对 x 轴和 y 轴分别做自注意力,这样也就缩小了单独的长度)

而本文的作者是将图片进行分割,将它分为大小相同 16*16 的patch,这样的话整个 224*224 的图片就可以变成 14*14 的patch序列,那这样的话最后的序列长度就是 196,这样也就完成了 2D 图片到 1D 序列的转移。那我们就可以把他当成 NLP 中的词元的 Token,就可以成功的放入 Transformer 模块中进行训练了。

CNN和Transformer串联混合 cnn和transformer区别_人工智能

Vision Transformer架构

首先我们就是对整个图片进行 patch 上的分割,然后再进入我们的 Linear Projection of Flattened Patchs 来对图片的特征进行提取,而后加上 class 标签,以及位置编码,最后输入 Transformer Encoder 中进行计算,其实这部分就和 上次讲的 Transformer 模型一样了,没有进行修改,最后我们再从 class 标签对应的第一个输出的到 MLP Head 中得到输出,其实 MLP Head 就是一个简单的 MLP ,在小的数据集上其实他就是一个 Linear 层,如果是大的数据集上,就会变成由 Linear + tanh + Linear 组合而成。最后放入 Softmax 层中就可以得到最后的分类结果,整体的操作其实和 BERT 模型很像了。

CNN和Transformer串联混合 cnn和transformer区别_transformer_02

然后我们结合数据的 shape 来对整个ViT过程有个更清楚的认识

CNN和Transformer串联混合 cnn和transformer区别_cv_03

然后我们看一下论文作者给我们的可视化的效果:

  1. Linear Projection of Flattened Patchs 学习的效果
  2. Position embedding 相似度效果
  3. 多头注意力的平均注意力距离
  4. 最后一层输出的token去折射回原图片的效果

CNN和Transformer串联混合 cnn和transformer区别_深度学习_04

第一副图我们可以看出 ViT 是学习到了一些颜色,纹理相关的信息,这也和 CNN 很相似。
第二幅图是Position embedding 相似度的效果,黄色为相似,蓝色为不相似,所以我们可以看出他对于行列的位置都学习的很好,这也可以印证后面消融实验中为什么 1D 编码和 2D 编码效果相似的原因。
第三副图是每一个点都是多头注意力的16个头,我们可以看到图中网络深度较小的时候,还是有一些的只能看到附近的块,平均距离较近,但是随着网络深度的增加,所有的头都能看到很远的快。
第四副图是用最后一层输出的token去折射回原图片,我们可以看到还是关注到了我们想要关注的图像区域。

消融实验

Head Type And Class Token

我们在之前的架构中有发现在序列的第一个位置上加入了一个 class 编码,而且最后的分类也是由 Transformer Block 的输出中对应的第一个位置,其实这个架构就和 BERT 模型类似,作者也是基于这个原因使用这种架构来编写这篇论文。但是传统的 CNN 中都是通过一个全局池化层对最后的输出进行一个归纳,所以在这里我们也可以和传统CNN中一样,将最后一层的所有输出放入一个全局池化层去进行操作,而取代掉 class 编码。然后我们看下图,我们可以发现这两种方法最后得到的效果都是相同的,只有超参数的区别,这也验证了作者的观点。

CNN和Transformer串联混合 cnn和transformer区别_深度学习_05

Positional Embedding

作者给出了3种关于位置编码的方法,并且对比了不使用位置编码的效果,如下所示:

  1. 不使用 Position embedding
  2. 使用 1D Position embedding
  3. 使用 2D Position embedding
  4. 使用 Relative Position embedding

我们看到这个效果其实是很明显的,不管添加了哪种位置编码都是差不多的,都会比不使用增加4个百分点。

Hybrid Architecture

而Hybrid 混合模型,就是将传统 CNN 特征提取和 Transformer 进行结合。下图绘制的是以 ResNet50 作为特征提取器的混合模型,通过 ResNet50 进行特征提取后,得到的特征矩阵 shape 是[14, 14, 1024],接着再输入 Patch Embedding 层,注意 Patch Embedding 中卷积层Conv2d的 kernel_size 和 stride 都变成了1,只是用来调整 channel。后面的部分和前面 ViT 中讲的完全一样,就不在赘述。

CNN和Transformer串联混合 cnn和transformer区别_深度学习_06

对比实验

作者还基于不同的架构给予了对比实验,首先我们来看下下面几张图片。

CNN和Transformer串联混合 cnn和transformer区别_CNN和Transformer串联混合_07


CNN和Transformer串联混合 cnn和transformer区别_深度学习_08

上图的灰色范围就是现在 CNN 中基于 ResNet 的模型的准确率范围,从图中我们可以看到在数据规模较小的时候,ViT 是远不如 ResNet 的,但是在 ImageNet21K上进行预训练的话,他的准确率是与 ResNet 持平的,而在大型的数据集上进行预训练,他的效果是超过了 ResNet 的,并且基于下面的两种图我们可以更清楚的发现这一特性,但是唯独不同的是,混合模型的效果在小的数据上进行预训练后得到的结果也是很好的。这样我们就可以推断出来,当你数据集够大的话,ViT 是可以做到更好的效果,并且同比相同的 ResNet 所需要的算力大大减少。
同的 ResNet 所需要的算力大大减少。