这篇文章是从改进ViT输入的角度来做的,在最初版本的ViT中,是将图像分成16*16个patch,每个patch展开为一个向量,作为ViT的序列化输入。这种做法虽然简单,但是这种简单粗暴的序列化方式破坏了图像原有的结构性,使得网络无法捕捉图像原有的结构化特征,如边缘、线条等。因此,本文作者提出了一种token2-to-tokens的方式,通过不断对图像进行有overlap的patch展开以及图像恢复,来达到逐步将相邻像素的结构化特性聚集到token中,且逐步减少token数目的目的。
上图展示了一轮T2T的过程,首先将上一层transformer的输入token恢复为图像,然后进行有overlap的patch采样,最后将每个patch的特征展开,作为下一个层的输入。T2T重复两次,最终backbone的输入为14*14个token,与之前的ViT类似。这种token2token的方式模拟了卷积操作来捕捉局部特性,利用self-attention捕捉全局依赖,相比简单的划分patch,确实可以更好的对输入进行预处理。
不过因为T2T阶段token数过多,会使得计算量和显存占用巨大。而通过可视化ViT的特征图发现,很多通道都是全0的,会带来一定的冗余,因此作者采用了deep-narrow的网络设计思想,降低特征的通道数,来减少参数量和计算量。