题目:一张图片等价于16*16大小的单词
摘要:
- transformer把imagenet当成小模型
- 摘要中提到的需要比较少的训练资源指的是 2500天TPU训练天数
Introduction
- transformer的使用在目前看来还没有遇到任何性能饱和的问题
- 在自然语言处理中,一个token代表一个单词,目前硬件所能支持的token的最长序列为几百或上前,比如BERT中使用的512,但是在视觉领域中,首先就要解决序列长度的这个问题。
- 解决方法,把一张图片分解成很多patch ,假设一张图片的长宽是224*224,把这张图片分解为16*16,那么一个patch的大小就是14*14,那么这个序列的长度就变成了196
- 视觉网络中的transformer大部分使用的都是有监督的训练方式,这一点是与NLP不同的。
- 作者承认在相同的数据预训练下,相同的网络大小的transformer会比resnet弱,这是因为tran缺少了卷积的归纳偏置,或者说先验知识。
- cnn的归纳偏置主要有两个,1、locality,滑动窗口的方式可以使用到局部性,靠的越近的东西的相关性就会越强 2、translation equivariance(平移等变性),f(g(x)) = g(f(x)),可以把g(x)理解为卷积,f(x)理解为平移。
5 conclusion
- 除了使用了针对图像领域开发的空间位置编码,此外再没用到其他的特定于图像的归纳偏置。
- 鉴于VIT和DETR良好的表现,tran在视觉领域应用前景很广,同年2020.12 检测模型VIT-FRCNN和分割模型 SETR都是transformer。
3 METHOD
- 图1 前向,把图片打成patch,每个patch使用线性投射层的操作得到一个特征,为每个特征加上position embedding 就是对应了patch在图片中本来的位置。输入的patch大小为16*16*3 = 768, 整体图片一共有196个patch,所以总维度是196*768
- 最后默认第一个位置已经融合了其他全部的位置信息,所以只输出第一个就行了
- 线性投射层可以理解为一个全连接层,为了与transformer的维度匹配,维度为 输入维度*D(文中的一个可挑参数) = 768*768,那么输出就是196*768*768*768 = 196*768
- 在图像token输入tran之前,还要加上一个cls token,是一个可以学习的特征,所以总维度是197*768
- 加入位置编码信息,(与BERT相同,是1D position embedding)位置编码信息有一个信息表,表中每一行都是一个1*768的向量(里面的数据是可以学习的),然后根据patch在图片中的位置,去索引表中特定行的向量,sum到197*768中,所以总的维度还是197*768.
- tran块中使用的是多头自注意力,比方说有12个head,那么每一个head中的qkv为 197*64,然后再把这12个头拼接起来,最后的输出还是197*768。
- MLP 没说要做什么,只说了这里会把维度做相应的升高。
消融实验
- D.3,MLP(multi-layer-perceptron),里面使用了tanh去做分类预测。要知道,这与正常的cv分类步骤是不同的,以resnet为例,stage5输出14*14的 feature map,将之输入GAP(global average pooling)中得到一个拉直的向量去做分类预测。为什么不把trnas的输出直接GAP,而要使用一个cls token ,作者在消融实验室中发现这两种方法都可以。
- D.4 到底使用哪种位置编码 1、1D位置编码 1...n ; 2、2D位置编码 x = {1...n/2} y = {1...n/2} ;3、相对位置编码。对比三种编码的结果是都可以。
3.2
这一节说明了训练好的VIT怎么去更大的图片上去做finetune,因为Touvrion 等很多人都在论文里提到,在更大尺寸的图片上去做finetune可能会得到更好的结果,但是预训练好的tran不太容易调节尺寸,同样尺寸的patch,但是会提高了序列长度(且这样的finetune之后的位置编码也相应的不能用了)那该怎么做呢?
理论上tran可以处理任意序列长度,所以长度不是问题,怎么解决位置编码,折中的解决方案就是去做插值(2d),这也是VIT唯一用到2d归纳偏置的地方