paper:Three things everyone should know about Vision Transformers
official implementation:https://github.com/facebookresearch/deit
third-party implementation:https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/vision_transformer.py
创新点
本文提供了三点关于Vision Transformers(ViTs)的见解,这些见解基于一些简单且易于实现的ViTs变体。
- 并行处理的Vision Transformers
- 通常,ViTs中的残差层是顺序处理的,但在某种程度上可以并行处理,而不会显著影响准确性。
- 这种并行处理方式可以提高优化效率,并减少延迟
- 实验表明,在小批量训练时,并行处理的ViTs在优化和准确性上有时会表现得更好。
- 仅需微调注意力层
- 通过微调注意力层的权重,ViTs可以适应更高的分辨率和其他分类任务,而无需重新训练整个模型。
- 这种方法节省计算资源,降低微调时的峰值内存消耗,并允许在多个任务之间共享大部分权重。
- 实验结果表明,在不同的图像分辨率和分类任务上,微调注意力层的准确性影响不大。
- 基于MLP的patch预处理层改进了自监督训练
- 文章提出在patch预处理后应用掩码,可以有效结合patch预处理和自监督训练方法。
- 这种方法通过在patch预处理后进行掩码,使得模型可以利用自监督预训练的好处,同时保持训练稳定性和准确性。
- 实验结果表明,这种选择对于自监督和监督情况下的ViT都是有效的,表现与最好的卷积预处理相当。
方法介绍
Parallel ViT
传统的Transformer block可以表示如下
本文提出用并行操作来替换上述组合
下图是一个简单的示例
对于给定数量的MHSA和FFN block,这种结构将网络深度减半,同时并行处理的数量翻倍。
作者首先比较了固定复杂度下顺序模型和并行模型的性能,如图1所示,block的总数是固定的,这里考虑了不同分支的可能性,比如一共36个block可以通过顺序模型ViT 36x1或并行模型ViT 18x2、12x3、9x4得到。从图1可以看到,所有情况下2个分支的性能是最优的。
图2展示了24个block下不同宽度的影响,可以看出,最小的模型ViT-Ti和ViT-S的顺序模型表现的更好,这是因为24层很容易优化。B24x1和B12x2取得了类似的精度。而ViT-L12x2要比对应的顺序模型的表现要好。
图3比较了不同blocks数量下,ViT-B和ViT-S的顺序和并行模型的性能,观察结果与之前的发现一致:即越深容量越大的模型越难优化,此时并行版本的帮助更大。
表2给出了使用Layerscale的结果,它有助于优化最大的模型。它提高了顺序模型和并行模型的性能,最终达到的精度水平相似。因此对于足够大且经过合适的优化的模型,顺序和并行ViTs的最终性能大致是相等的。
在V100 GPU上,并行结构对于单样本的推理有明显的加速,对于相对较小模型的小batch size的加速也很明显,如表4所示。这种比较是基于并行结构的一个简单实现,由于缺乏特定的CUDA kernel,它是次优的。
Fine-tuning attention is all you need
如图4所示,作者提出在微调时只微调MHSA层的权重,这里的微调包括使模型适应更大的分辨率以及处理不同的下游任务。
训练采用较小的分辨率,并在更大的分辨率上进行微调是常见的做法。这种方法在训练时节省了大量的计算量,并且通常也提高了目标分辨率下的精度。这是因为它减少了训练时由数据增强引起的训练和测试时见到的图像尺度的差异。表5报告了ViT-S、ViT-B、ViT-L在224x224分辨率下预训练并在384x384分辨率下微调的结果。在ImageNet-val和ImageNet-v2上仅对MHSA权重微调与完全微调相比,结果都在标准偏差内(\(\pm0.1\))。而仅对FFN进行微调时,结果就不一样了,FFN层的参数量是MHSA的两倍。
在进行更高分辨率的微调时,与进行完全微调相比,仅微调注意力层的优点在于在参数、延迟和峰值内存使用方面都得到了大量节省。首先在GPU上节省了约10%,由于计算梯度的减少,训练速度也快了10%,最后由于注意力层的权重仅占总体权重的三分之一,存储空间节省了约66%。
表6是在不同下游数据集上不同微调策略的结果,首先对于最小的数据集CARS和Flowers,最微调MHSA层是一个很好的策略,效果甚至好于完整的微调。作者的解释是限制权重的数量起到了正则的作用。对于最大的数据集结论就不同了,比如对于iNaturalist数据集,ViT-S只微调MHSA层和完全微调的结果有较大的差距,但这种情况也是可以预料到的:因为有更多的图片需要学习,以及在微调前没有见过的新的类别。此时只微调FFN的效果要好于只微调MHSA,因为FFN有两倍以上的权重。这种情况随着模型的增大比如ViT-L逐渐消失,因为模型的容量变大对应MHSA的参数量也变大了,逐渐够用了。
Patch preprocessing for Bert-like self-supervised learning
原始的ViT中采用一个16x16步长也为16的卷积作为patch embedding层,最近的一些工作中也提出使用卷积stem作为patch embedding层来提高模型性能,其中包含多个步长为2的卷积。目前还没有工作解决它们与基于patch masking自监督方法的兼容性问题,比如类似Bert的自编码器方法BeiT。
本文提出了层级hierarchical MLP(hMLP)stem,如图5所示。
它首先处理4x4大小的patch,然后经过两次2x2 patch的处理,最终得到的patch大小也是16x16,伪代码如下
表7对比了不同设计的stem,可以看到在监督训练中的提升是显著的。当用BeiT进行预训练并在Imagenet-val上微调得到的结果与其它stem的结果相比,也有明显的提升。