ViT论文逐段精读【论文精读】

- vit中的预处理
输入图片大小为224*224*3(用X表示),每个patch的大小为16*16,所以patch个数为(224/16)^2=196,每一个图像块的维度就是16*16*3=768
Linear Projection线性投射层就是全连接层(用E表示),该维度是768*768,前面的768是不变的,是算出来的16*16*3=768,后面的768是可以变化的
X*E得到的还是196*768(196个token,每个token维度都是768),之后在拼接上1个cls token(1*768),再添加位置信息(是sum而不是concat),所以最后输入到Transformer Encoder的还是197*768

- transformer block
- Layer Norm(不是Batch Norm)
- Mutil-Head Attention
输入的序列是197*768,如果只是一个attention,那么q,k,v都是197*768;而vit使用了multi-head attention(12个head,有12个对应的k,q,v),所以k,q,v是197*64,最终再将12个head的输出拼接出来,所以多头注意力输出的结果仍是197*768。
然后经过Layer Norm,然后再经过MLP将维度相对应的方法,一般是放大四倍,比如197*768 -> 197*3072,然后再缩小投射回去变成197*768输出。

- transformer block总结
经过transformer block之后,输入和输出的序列大小仍是197*768,所以可以不停的叠加transformer block,L层的Transformer block就是Transformer Encoder

- 关于为什么使用cls token而不使用GAP
resnet经过一系列池化卷积,得到14*14大小的特征图,然后使用GAP(globally average-pooling),再展平最后进行分类

transformer的encoder输入和输出都是n个元素:1、可以直接在这n个输出做一个global average pooling,然后得到一个最后的特征;2、也可以再前面添加class token,用class token做输出,然后做分类。
这两种方式其实都可以,作者是为了保持和原始的transformer保持一致,使用了class token
- positional embedding的消融实验
有1d,2d的以及relative相对的位置编码。其中1d就是1~9这种形式;2d的就是11,12,13...33这种形式,更具有structure信息;相对的就是offset(有点不理解)
但是消融实验的结果同样也是,使用哪种方式效果都差不多,所以文章使用了1d的方式(和原始的transformer保持一致)。

- 第一个公式理解
xp1~xpn都是图像块,一共有n个patch。每个patch先去和linear projection全连接层做转换,得到patch embedding,然后在前面拼接class embedding,然后再加上位置编码信息Epos,得到的z0就是transformer的输入
- 第二、三公式理解
就是做L个循环,MSA和MLP交替循环使用,但是会先做LN处理,除此之外还有残差连接。zl就是transformer block得到的结果。
- 第三个公式的理解
将class token对应的输出,也就是zl0(上标0代表第0个位置), 当作整体图像的一个特征,去做最后的分类任务。

- 分析
- Inductive bias
就是说transformer没有cnn那么多的先验知识
- Hybrid Architecture(混合模型)
transformer的全局建模比较强,但是需要很多数据训练;而cnn比较data efficient,不需要很多的训练数据,所以提出一个Hybrid Architecture混合的网络(比如前面是cnn,后面是transformer,先使用resnet将特征图缩放到14*14,拉直就是196个元素,后续操作一样,也就是对图片的预处理方式不同)

- 更大resolution情况下的fine-tune
针对vision transformer预训练模型,在输入比预训练更高resolution的图像时进行微调会比较好。比如,输入更高的resolution图像,保持patch_size和预训练时相同,则patch的数量会变多。虽然vit可以处理任意长度序列,但是预训练的positional embedding可能会没有用。
所以可以进行fine-tune,比如预训练时位置信息是1~9,而实际输入图像是1~25,则可以使用2d插值(interpolation)。但如果序列变得很长,直接这样插值会导致最后结果掉点。所以这里的插值其实是临时的一个解决方案。

- 数据集以及模型的变体
patch size和序列长度是成反比的

- 实验结果
下图中的表是模型已经在大规模数据集上做了预训练了,然后再在表中的数据集上进行fine-tune得到的表现。
总结:vitii效果更好,但是好的不是很明显;vit需要训练的天数更短,相对来说很短很短

Figure 3中,灰色BiT代表各种大小的resnet(比如resnet50、resnet152):在中小型数据集上,vit效果远不如resnet,因为vit没有使用像cnn那种先验知识(归纳偏置,inductive bias);在ImageNet-21k数据集上,resnet和vit效果差不多;当使用特别大数据集时,vit效果要好于resnet。
总结:大数据集时使用vit效果更好,小数据集使用cnn效果更高
Figure 4中
