ViT and DeiT
简介
在nlp方面,transformer已经成为了标配。但是在cv方向,transformer的应用仍然是受限的。通常人们只是利用transformer来辅助cnn网络。这篇文章就完全抛弃了cnn,单纯地使用transformer也能够处理分类任务。
贡献
- 证明了单纯地使用transformer是work的。
- 使用大量的数据训练transformer,将精度做到了SOTA。
- pretrain model的开源
CNN vs Transformer
CNN是一种分层(hierarchical)的数据表示方式,高层的特征表示依赖于底层的特征表示,由浅入深逐步抽象地提取更具备高级语义信息的特征。此外,cnn还具有一定的平移不变性和平移等变性。cnn的感受野较小,通过堆叠cnn网络理论上可以做到感受野很大,但是实际感受野远小于理论的。而transformer可以建立一个全局依赖。
transformer的特征提取能够更好地去利用大量的数据量,这个在nlp任务上进行了证明。(在大量的数据集上,超过了cnn结构的最好分类网络)
之前也有很多论文使用self attention来代替cnn,但是由于设计的算法并不利于计算(理论上是高效的)。且最好效果并没有超过cnn结构的最好分类网络。只是按照resnet的设计,进行替换,带来提升。
复杂度的对比。cnn是
O
(
m
2
∗
k
2
∗
C
i
n
∗
C
o
u
t
)
O(m^2*k^2* C_{in} * C_{out})
O(m2∗k2∗Cin∗Cout),self attention的复杂度是
O
(
n
2
∗
d
∗
m
)
O(n^2 * d * m)
O(n2∗d∗m), 全连接的复杂度是
O
(
C
i
n
∗
C
o
u
t
)
O(C_{in} * C_{out})
O(Cin∗Cout)
网络结构
没有任何改动地将transformer运用到了图像分类中。将图片转换为了序列,输入的序列就如论文题目所说,16*16的块状大小作为了文本输入的词向量。和bert一样,最前面的序列同样会加入classification的embedding。最后这个classificaiton的embedding来做分类任务。
在文章中,作者采用的是一维的位置向量。为什么2维图像任然这样选择是因为作者做实验发觉有没有位置向量还是很重要的,但是是否二维,相对位置向量,每一层都添加,每一层都添加共享的位置向量并没有多大区别,因此作者在这就使用了位置向量。
训练
在大数据集上预训练之后,然后取出判断头,重新finetuen一个新的头。在高分辨率的情况下fintune能够带来更好的效果。这时候,位置向量的embedding不够了,会使用插值的方法来生成新的位置向量。VIT在使用更少的资源达到了SOTA的结果。在小数据上,vit的效果没有cnn类网络好,在更大的数据集上,会获得更好的结果。
论文中也尝试了自监督的方式,比在一样的数据集上from scratch的监督训练好,但是没有在大数据集上监督预训练的好。
DeiT
只有google有jfm300m的数据集,没有那么大量的数据集是否能够训练出一个好的vit网络呢,facebook给出了自己训练的方法,并且提出了蒸馏的方式来获得更好的结果。
蒸馏
和之前蒸馏方式的不同,在这里还引入了一个新的蒸馏token。一个token用来学习gt的label,一个token用来学习蒸馏的label。一开始这两个token embedding余弦相似度很低,最后达到0.93.但任然是两个不同的embedding。而如果两个classification 的embedding都用gt的label来监督的话,最后会几乎一模一样,且精度并不会提升。
我们可以看到,使用硬监督的方式能够带来更好的结果。最后预测的时候,结合class embedding 和蒸馏token能够获得做好的结果。
使用cnn网络作为老师,能够带来更好的记过。因为cnn的网络会学到cnn特有的特性,cnn的归纳偏执?蒸馏后的token与convnet的老师相似,class token和没蒸馏的相似。因此,二者结合,可以获得二者的特征。
在参数量一致的情况下,速度几乎差不多。论文中说,因为涉及到更大的矩形乘法,针对硬件会有更大的优化空间。在精度方面,差不多的精度上,deit的速度更加的快。
训练策略
transformer需要强的数据增强,几乎所有的数据增强的方式都有效