赞
踩
在 Vision Transformer 模型出来之前,我们通常使用的都是基于卷积神经网络(CNN)的模型的变种,经典的 CNN 模型如:ResNet,Google Net,AlexNet等,但是呢 CNN 有一个不可忽视的缺点,在大模型上容易出现过拟合的现象。
Vision Transformer (ViT),就在图像识别任务达到了不亚于 ResNet 的精度,并且相较于ResNet 训练所耗费的时间,VIT的训练所耗费的算了减少了一大部分。由于 ViT 模型是从在 NLP 领域特别火的 Transformer 模型改编而来,并且没有对Transformer 内部进行修改,ViT主要的改变就是在输入端,将图像进行了分块和降维,从而将图像变成一种类似于词语编码的表达方式,方便了后续处理。经过了这一小步的改动,ViT在JFT-300M(ImageNet的300倍放大版,3亿张图像)上预训练的模型成功超越了ResNet152。由于有这一特性,所以很多在 NLP 领域有重大突破的方法可以很方便的迁移到 CV 中来,反之依然。
在上一篇博客传送门讲的 Transformer 中我们对于输入是 n 个元素,而输出也同样是 n 个元素,而经过了 Transformer 之后会有什么改变呢,我们在上一篇博客讲的时候就讲过了,Transformer 中有一个特别的模块是自注意力模块,这样输出的时候每个元素都会与其他元素进行相关连,所以说我们在 Transfromer 中的复杂度是 O(n^2) 的,正因为这个特性所以 Transformer 就有了局限性了,它所能处理的单个序列的长度不能太长。
从上面的回顾中我们可以得知 Transformer 所能处理的单个序列的长度不能太长,所以首先我们需要对比一下 NLP 领域和 CV 领域的区别,在 NLP 领域中我们传递的是一个序列,他的输入通常都是长度为几百或者上千的数据,就不会再往上增长了,比如 BERT 模型中序列长度就为512,但是在 CV 中呢,我们最基础的 ImageNet 上的数据大小也是 224*224 的,那这样的话,我们如果总结将图像简单的抽成一个一维向量,他的序列长度就达到了 50176,这是 Transformer 无法接受的长度。
在 Vision Transformer 模型提出来之前有两种使用注意力的模型:
而本文的作者是将图片进行分割,将它分为大小相同 16*16 的patch,这样的话整个 224*224 的图片就可以变成 14*14 的patch序列,那这样的话最后的序列长度就是 196,这样也就完成了 2D 图片到 1D 序列的转移。那我们就可以把他当成 NLP 中的词元的 Token,就可以成功的放入 Transformer 模块中进行训练了。
首先我们就是对整个图片进行 patch 上的分割,然后再进入我们的 Linear Projection of Flattened Patchs 来对图片的特征进行提取,而后加上 class 标签,以及位置编码,最后输入 Transformer Encoder 中进行计算,其实这部分就和 上次讲的 Transformer 模型一样了,没有进行修改,最后我们再从 class 标签对应的第一个输出的到 MLP Head 中得到输出,其实 MLP Head 就是一个简单的 MLP ,在小的数据集上其实他就是一个 Linear 层,如果是大的数据集上,就会变成由 Linear + tanh + Linear 组合而成。最后放入 Softmax 层中就可以得到最后的分类结果,整体的操作其实和 BERT 模型很像了。
然后我们结合数据的 shape 来对整个ViT过程有个更清楚的认识
然后我们看一下论文作者给我们的可视化的效果:
第一副图我们可以看出 ViT 是学习到了一些颜色,纹理相关的信息,这也和 CNN 很相似。
第二幅图是Position embedding 相似度的效果,黄色为相似,蓝色为不相似,所以我们可以看出他对于行列的位置都学习的很好,这也可以印证后面消融实验中为什么 1D 编码和 2D 编码效果相似的原因。
第三副图是每一个点都是多头注意力的16个头,我们可以看到图中网络深度较小的时候,还是有一些的只能看到附近的块,平均距离较近,但是随着网络深度的增加,所有的头都能看到很远的快。
第四副图是用最后一层输出的token去折射回原图片,我们可以看到还是关注到了我们想要关注的图像区域。
我们在之前的架构中有发现在序列的第一个位置上加入了一个 class 编码,而且最后的分类也是由 Transformer Block 的输出中对应的第一个位置,其实这个架构就和 BERT 模型类似,作者也是基于这个原因使用这种架构来编写这篇论文。但是传统的 CNN 中都是通过一个全局池化层对最后的输出进行一个归纳,所以在这里我们也可以和传统CNN中一样,将最后一层的所有输出放入一个全局池化层去进行操作,而取代掉 class 编码。然后我们看下图,我们可以发现这两种方法最后得到的效果都是相同的,只有超参数的区别,这也验证了作者的观点。
作者给出了3种关于位置编码的方法,并且对比了不使用位置编码的效果,如下所示:
我们看到这个效果其实是很明显的,不管添加了哪种位置编码都是差不多的,都会比不使用增加4个百分点。
而Hybrid 混合模型,就是将传统 CNN 特征提取和 Transformer 进行结合。下图绘制的是以 ResNet50 作为特征提取器的混合模型,通过 ResNet50 进行特征提取后,得到的特征矩阵 shape 是[14, 14, 1024],接着再输入 Patch Embedding 层,注意 Patch Embedding 中卷积层Conv2d的 kernel_size 和 stride 都变成了1,只是用来调整 channel。后面的部分和前面 ViT 中讲的完全一样,就不在赘述。
作者还基于不同的架构给予了对比实验,首先我们来看下下面几张图片。
上图的灰色范围就是现在 CNN 中基于 ResNet 的模型的准确率范围,从图中我们可以看到在数据规模较小的时候,ViT 是远不如 ResNet 的,但是在 ImageNet21K上进行预训练的话,他的准确率是与 ResNet 持平的,而在大型的数据集上进行预训练,他的效果是超过了 ResNet 的,并且基于下面的两种图我们可以更清楚的发现这一特性,但是唯独不同的是,混合模型的效果在小的数据上进行预训练后得到的结果也是很好的。这样我们就可以推断出来,当你数据集够大的话,ViT 是可以做到更好的效果,并且同比相同的 ResNet 所需要的算力大大减少。
同的 ResNet 所需要的算力大大减少。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。