paper:Transformer in Transformer
code:https://github.com/huawei-noah/CV-Backbones/tree/master/tnt_pytorch
摘要:
Vit模型中,会将图像划分为几个patch,然后计算这些patch之间的表示以及关系。而自然图像的复杂性高,细节和颜色信息丰富,patch划分的粒度不够细,无法挖掘不同尺度和位置的物体特征。然而,这些被忽视的局部patch中的注意力对于构建高性能的Vit结构至关重要。
为此,作者提出了一个新结构——Transformer in Transformer(TNT),其将原本Vit结构中送入Encoder的patch(16x16)称为“visual sentences”,然后将其进一步划分为更小的patch(4x4),称为“visual words”。
这些一个sentences中的每一个words的注意力将于sentences中的其他words一起计算,计算成本可以忽略不计。随后会将sentences中的每个words,以及每一个sentences的特征集合起来,提高网络的表征能力。
Transformer in Transformer的性能:achieve an 81.5% top-1 accuracy on the
ImageNet(不过RepVGG也到达了80%以上)
1. Introduction
现有的大多数研究使用的视觉transformers都是遵循着Vit中使用的传统表现方案,也就是将一幅完整的图像切分成多个patch构成成一个序列信息。这样操作可以有些的捕获各个patch之间的序列视觉序列信息(visual sequential information)。然而现在的自然图像的多样性非常高,将给定的图像表示为一个个局部的patch可以找到patch之间的关系和相似性,但是一个patch的内部同样存在着一些相识度很高的sub-patch。为此,可以进一步的探索出一种更加精细的视觉图像分割方法来生成视觉序列并提高其性能。
基于这个更加精细化的想法,作者提出了Transformer in Transformer,结构如图1所示:
为了增强Vit结构的特征表示能力,首先将图像切分成若干个patch作为“visual sentences”(如上图所示将图像切分为9个patch作为“visual sentences”),然后再将这些patch切分为若干个sub-patch作为“visual words”(如上图中一个pacth再次被切分为了9个sub-patch)。对于传统的transformer块用于提取patch的特征与注意力,作者还在架构汇总嵌入了一个sub-transformer,用来提取sub-patch的特征细节。其中,每个patch中高端sub-patch之间的特征和注意点使用共享网络独立计算,从而可以忽略增加的参数和FLOPs(浮点运算)数量。然后,将“visual words”的特征聚合成相应的“visual sentences”,分类token也通过MLP头用于后续的视觉识别任务。
TNT模型可以提取出粒度较细的视觉信息,并提供更详细的特征。结果表明,在SOTA的transformer网络上,TNT可以实现更好的精度和FLOPs权衡。
2. TNT Approach
2.1 Preliminaries
transformer的三个基本的部分为:MSA (Multi-head Self-Attention)、MLP (Multi-Layer Perceptron) 、LN (Layer Normalization)
- MSA
在self-attention模块中,输入会被线性转换为三个部分:Q,K,V,计算公式为:
最后,一个线性层被用来产生输出。Multi-head self-attention将查询、键和值拆分为各部分并并行执行注意功能,然后将每个头的输出值串联并线性投影形成最终输出。
- MLP
MLP应用于自注意层之间进行特征变换和非线性
- LN
层归一化是实现稳定训练和快速收敛的关键部分
2.2 Transformer in Transformer
在 TNT block 中,inner transformer block 用于捕捉局部区域之间的特征关系,而 outer transformer block 则用于捕捉区域之间的联系。通过把TNT block叠上几次,就建立了Transformer in Transformer网络。
2.3 Position encoding
空间信息是图像识别中的一个重要因素。对于patch和sub-patch的嵌入,作者都添加了相应的位置编码来保留空间信息。这里使用的是标准的可学习的一维位置编码。具体来说,每个patch都有一个位置编码:
同样的,sub-patch也有位置编码:
3. Result
- 考虑sub-patch与patch的效果:
- 与其他backbone的对比:
总结:
在保留了Vit考虑区域之间特征信息时,还考虑了区域内部的特征信息,将特征的细粒化信息抽取了出来,进一步划分了细粒度