motivation
transformer在NLP领域成为事实标准,但是在图像领域知识作为组件或CNN的附庸,必须一统江湖。
网络结构
图像 -》序列 -》transformer encoder -》MLP -》classification
和典型NLP任务相比,基本沿用了transformer encoder + classification的结构,区别在于输入,ViT将图像转换为了序列。
图像转序列
标准Bert的输入是长度为L,维度为D的vector [L, D],图像转序列即将[H, W, C]的输入图像转为[L, D]
(1)图像分块patch split:输入原图size为HWC,patch的size为P*P,patch个数N=HW/(P*P),将patch reshape为一维vector,size为P*P*C,得到patch序列[N, P*P*C]
(2)图像块嵌入patch embedding:乘以embedding mat [P*P*C, D]完成线性变换,得到新的feature序列[N, D]
(3)追加CLS token:和Bert类似,在序列前加上CLS分类专属token.
(4)添加position embedding:和Bert类似,为添加序列的顺序信息,添加可学习的position embedding信息。
(5)将上述序列送入transformer encoder + MLP + classification head
训练效果分析
(1)embedding filter:embedding filter的最终学习结果类似于基函数,对patch内纹理进行低阶特征表征,想到了小波基。
(2)position embedding:position embedding表现出显著的相对位置表达,临近、行、列等。
(3)attention distance:随着层的增加,attention的距离越来越远,即高层可获取更多全局信息,原理和CNN类似。
Attention可视化
attention的可视化结果也可以看出attention对象和类别对象很好地关联了起来。
总结
优势:
1、原汁原味的transformer全局self-attention,简洁易懂。
2、在大数据集上效果很好。
劣势:
1、图片大小变化后patch的长度会发生变化(不像bert在末尾增减,而是中间插入),预训练的position embedding对不上,通过插值不可避免导致精度下降。
2、模型复杂度高,需要大量训练数据,在小训练集上表现不好,建议是大数据预训练+小数据微调。