背景
Transformer已经在NLP领域取得了许多的进展,并且拥有较好的可解释性,本文的主要工作是将Transformer迁移到图片分类的任务中。
作者在大规模数据集上取得了较好的效果,在中等规模的数据集上取得比CNN差一点的结果。作者了也做了分析,原有的CNN很适合处理图像,主要有两个优势:
- 局部性:空间上相近的相似点,他们的特征也是相似的。
- 空间不变性(平移不变性):CNN kernel在计算的过程中整体上是共享参数的,所以一个图像块不论在图像中的哪个位置,其通过CNN后特征都是一样的。
方法
网络结构如下图所示。
- 首先将图像split成为许多的patch,由这些patch组成来输入到Transformer Encoder的序列。patch的大小一般为16X16。
- patch一般会flatten之后经过Linear Projection。线性映射在不同patch之间是不是共享参数的?
- 线性映射完成之后会再和position embedding结合,输入到Transformer Encoder里面去。注意:第一个位置 0会concat一个向量,这个向量会默认融合其他patch的信息,从而输入到MLP Head中取。这个*是怎么得到的?这个*一开始就是个Learnable 的参数,在不停的学习更新。
相关变种
- T2T-ViT
上面文章中也分析了,ViT在中等规模数据集上打不过ResNet的原因,主要一个是缺少局部性。为了解决这个问题,依图的作者们提出了T2T的module,用来融合Token之间的局部相关性。
在我来看,这个T2Tmodule相当于是借鉴了CNN的卷积操作。T2T module的定义如下图所示。