如有错误,恳请指出。



文章目录

  • 1. Introduction
  • 2. TNT Approach
  • 2.1 Preliminaries
  • 2.2 Transformer in Transformer
  • 2.3 Position encoding
  • 3. Result


paper:Transformer in Transformer

code:https://github.com/huawei-noah/CV-Backbones/tree/master/tnt_pytorch

使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_transformer

摘要:

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所示:

使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_02


为了增强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,计算公式为:
    使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_03
    最后,一个线性层被用来产生输出。Multi-head self-attention将查询、键和值拆分为各部分并并行执行注意功能,然后将每个头的输出值串联并线性投影形成最终输出。
  • MLP
    MLP应用于自注意层之间进行特征变换和非线性
    使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_04
  • LN
    层归一化是实现稳定训练和快速收敛的关键部分
    使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_归一化_05

2.2 Transformer in Transformer

对于一张图像,均匀的将其切分为n个patch:使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_06,其中一个patch的分辨率为使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_transformer_07的大小。TNT结构可以学习到图像的全局与局部信息,将每一个patch进一步切分为m个sub-patch:使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_08,其中每个sub-patch的分辨率为使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_09的大小。也就是说,TNT结构将一幅图像切分成了n个使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_transformer_07大小的patch,然后每个patch又是由m个使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_09大小的sub-patch组成。

对于sub-patch,通过线性投影将其转化为word embeddings:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_12
在TNT中有两个数据流,一个是对于sub-patch的处理,另外一个是对于patch的处理。对于sub-patch,同样使用一个transformer结构来探索patch内的细粒度信息:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_13
其中l表示堆叠块的总数。内部的transformer结构表示为使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_14使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_14的输出为:使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_归一化_16。这个过程通过计算任意两个sub-patch之间的交互来建立sub-patch之间的关系。比如,在人脸的的一个patch区域中,与眼睛对应的一个sub-patch与其他眼睛对应的sub-patch之间的关联度可能更高,而与前额对应的一个sub-patch部分互动得少。

得到patch内部经过注意力机制变换后的新的sub-patch表示,对其进行编码得到和对应 patch 相同大小的编码,与原始 patch 进行加和。
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_pytorch_17
其中,Vec将一个输出变成一个向量,接着,同样使用标准的transformer层结构对patch进行转换:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_transformer_18
最后,TNT结构就可以表示为:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_归一化_19
在 TNT block 中,inner transformer block 用于捕捉局部区域之间的特征关系,而 outer transformer block 则用于捕捉区域之间的联系。通过把TNT block叠上几次,就建立了Transformer in Transformer网络。

2.3 Position encoding

空间信息是图像识别中的一个重要因素。对于patch和sub-patch的嵌入,作者都添加了相应的位置编码来保留空间信息。这里使用的是标准的可学习的一维位置编码。具体来说,每个patch都有一个位置编码:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_20
同样的,sub-patch也有位置编码:
使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_归一化_21

3. Result


  • 考虑sub-patch与patch的效果:
  • 使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_github_22

  • 与其他backbone的对比:
  • 使用from sentence_transformers import SentenceTransformer 如何使用gpu transforming sentence_深度学习_23

总结:

在保留了Vit考虑区域之间特征信息时,还考虑了区域内部的特征信息,将特征的细粒化信息抽取了出来,进一步划分了细粒度