VIT
PDF: https://arxiv.org/abs/2010.11929
CODE: https://github.com/google-research/vision_transformer
一、大体内容
前面介绍了Transformer及其在NLP领域的两大发展方向BERT和GPT,但当时Transformer在CV领域的很难扩展,主要是如果对图片逐像素进行注意力机制,其复杂度是成平方增大的,比如224 * 224的图片,如果拉直则变成50776维向量,这种对应的序列维度太大,会造成注意力机制计算量非常大,而且224的图片在CV领域还算小的,为了处理这个问题,有一些方法先利用CNN进行特征提取,然后对输出的特征图在进行自注意力机制,有一些方法则是在CNN网络架构上局部采用自注意力机制,还有的采用滑动窗口来控制其复杂度,这些方式都是基于CNN架构,主要思想是通过近似来降低图片的复杂度。和VIT最像的是2020年的一篇文章,其将图片划分成2 * 2大小的块,并利用Transformer结构,在CIFAR-10数据集上取得了很好的效果;还有一篇是iGPT,其采用无监督的方法进行训练并在ImageNet上取得了72%的准确率。
VIT大体思想是将图片划分成较大的块,将块展开后经过一个线性层得到特征编码,然后直接输入到Transformer结构,并在ImageNet-21K和JFT-300M等大数据集上分类取得了很好的结果。VIT验证了纯Transformer结构在CV领域的有效性,这是一篇挖坑之作,后续很多论文都是基于其进行改进,比如探索自监督训练,应用于其他方向检测、分割。ViT还在NLP和CV之间架起了桥梁,为后续多模态发展奠定了基础。
依据参数量的不同,划分成了不同大小的模型。
由于patch大小不同,其对应的效果也不太一样,文中提到的ViT-L/16表示采用ViT-L模型,且patch的大小为16*16。
二、贡献点
- 将CV问题转换成了一个NLP问题,直接用Transformer进行训练也能取得很好的效果
- 将图片通过划分成块,在较大数据集上取得了很好的效果(划分块这里和20年那篇文献很像,只是别人数据集图片就小,划分为2*2,还有就是受限于资源,所以VIT从这个方面讲就是更大的块,更大的数据集)
- 采用无监督训练方式可以带来提升,这不久后何凯明大神就提出了MAE,借鉴BERT完型填空的思路,将部分patch给抹掉,然后利用网络恢复出来和原数据进行对比学习
- 训练同等效果的模型,ViT所用资源、耗时较小(注意这里的小是相对的,在TPUv3上训练也要2500天)
三、细节
3.1 网络结构
整体结构上和BERT一样,采用了Transformer编码器,主要不同点在于输入数据的处理。数据处理好后输入到Transformer 编码器,再将输出的特殊编码特征经过一个MLP层(包含两个有GELU的非线性层),然后再输出对应的类别信息。
其中x是图片预处理后的输入,E表示一个全连接网络,\(E_{pos}\)是位置编码,MSA是Transformer里面的多头注意力,LN表示Layernorm方法。
- 数据前处理
图片首先划分成一个一个的patch,每个patch单独展开后输入到一个全连接层用来提取每个patch的特征编码,然后引入一个特殊编码用于后续进行分类,在把位置编码和上述特征编码和特殊编码进行相加,保持维度不变,这就完成了数据前处理。这里以2242243的图片划分成大小16 * 16的块为例。
计算块个数:224 * 224 / (16 * 16) = 196,则图片划分后共196个patch。
计算每个patch的特征:196个patch 每个patch展开后维度为:16 * 16 * 3 = 768,再接入一个全连接层:权重参数为768 * 768,则最终得到的特征维度不变还是 196 * 768
在新增一个特殊编码,特征维度变为:197 * 768
上述特征再加上位置编码(注意是直接相加)后还是:197 * 768
3.2 归纳偏置
虽然Transformer具有全局特征,对遮挡相比于CNN要好,但是缺失了CNN拥有的归纳偏置:局部特征相同和平移等变性,但可以通过大量数据集来训练获得,如下小数据集上预训练 RestNet效果更好,规模变大后VIT效果会慢慢变好。如下图灰色实线分别表示ResNet系列精度的上下限,
不同的实心圆表示不同大小模型的效果,随着数据集的不断增大效果还在提升(ResNet152这样看也是没有到达瓶颈)。
都在大数据集上预训练,则vit在同等计算条件下 要比resnet好
3.3 模型微调和高分辨率图片
-
模型微调
通常在大数据集上预训练ViT模型,然后再在下游任务上进行微调,首先要移除预训练网络的预测头然后获得特殊编码的输出特征,再接入网络对下游任务进行适配。 -
高分变率图片
如果尺寸和训练的图片尺寸不一样,如何利用预训练好的模型。对于高分辨率图片按照相同大小的patch进行划分,这会导致序列个数变多,那提前训练好的位置编码可能又没用了,文中给的办法是采用了插值的方法,依据图像中的实际位置和预训练的位置编码对新的序列进行插值。
3.4 自监督训练
采用对部分patch进行masked,然后进行预测这种方式进行自监督学习,ViT-B/16模型相比于自监督学习的方法在ImageNet上有2%的提升,但相比于监督学习仍旧落后4%。这个后续MAE进行了改善。
3.5 直接GAP和采用特殊编码有何区别
文中为了对齐原始的Transformer模型,采用了特殊编码【class】来作为最终的输出,还有一个更直接的是不采用这种方式,直接对学习的patch编码,然后做一个全局平均池化操作(GAP),通过实验对比,其实没多大影响,只是采用GAP的方式需要对学习率进行调整。(这感觉有时候不是方法不行,而是炼丹技术不行)。
3.6不同的位置编码方式有何影响
文中采用的是一维位置编码,附录中还展示了不同位置编码的效果差异,最终发现其实影响并不大。
-
一维编码
按顺序给,比如1, 2, 3, 。。。, 9 -
二维编码
按照patch在图片中的位置给,如:11, 12, 13, 21, 。。。, 33 -
相对位置编码
采用相对位置,即位置之间作差。
试验表明不同的位置编码其实影响不大,作者给出的解释是图像块上做的,学习这些小块的位置关系还是相对比较简单的。
四、效果
-
不同模型和ResNet152比较.
在效果上其实差别不是很大,作者突出显示了在相近效果下,ViT耗时要少
-
注意力效果可视化
-
RGB编码可视化
-
自注意力机制在不同层间的注意力距离
可以看到前面几层距离比较大,表明一开始就具有全局信息
-
不同模型在不同数据集上的效果