Tokens-to-Token ViT: Training Vision Transformers from Scratch on ImageNet
Introduction
作者认为现在的VIT有以下两种缺点:
- 直接词元化会导致ViT不能够对图片的局部特征,边缘和直线进行建模,这也是为什么transformmer需要大量数据集进行驱动的原因
- ViT包含大量每没有用的特征(全白或者全黑)
针对上述问题,作者给出了本文的两个贡献点:
- 提出T2T模块
- 发现类似于CNN的设计最终可以惠及transformer
Tokens-to-Token ViT
3.1. Tokens-to-Token: Progressive Tokenization
包含两个步骤
Re-structurization
首先模块经过attention模块
$$
T^′=MLP(MSA(T))
$$
之后进行重构,将token的空间尺度重新转换成原来的尺度
$$
I=Reshape(T^′ ),T^′∈R^{l×c},I∈R^{hw×c},l=h×w
$$
Soft Split
使用soft split来重构相邻结构的信息并且减少token的长度,这样每个patch就与相邻的patch产生了相关性,将每个patch的边长定义为k伴随着s的重叠与p的padding,那么最终输出的重构图的尺寸即为
$$
l_o=⌊((h2p−k)/(k−s)+1)⌋×⌊((w+2p−k)/(k−s)+1)⌋
$$
T2T module
$$
T_i^′=MLP(MSA(T_i ))
$$
$$
I_i=Reshape(T_i^′ )
$$
$$
T_{i+1}=SS(I_i ), i=1…(n−1)
$$
对于刚输入的特征图,首先就使用SS将其转换成token,最后一层将其的尺度转换成固定尺度,为了避免计算量和存储空间的占用通道数设置成了32或者64。
3.2. T2T-ViT Backbone
借鉴cnn的思想设置backbone,使用了五折不同的策略:
- DenseNet
- DeepNarrow vs shallow-wide
- SE
- ResneXt
- GhostNet
作者着重介绍了二三两种情况,第二种情况不论哪种提升都很大,第三种情况虽然有提升但是效率不高
之后将T2T与ViT结合,将T2T输出的结果与classtoken拼接后加上sinusoidal position embedding
$$
T_{f_0} =[t_{cls},T_f ]+E
$$
$$
T_{f_i} =MLP(MSA(T_{f_{i−1}}))
$$
$$
y=fc(LN(T_{f_b}))
$$