VisTransformer

N 人看过

Abstract

将图片切割为N个patch。

现有的自注意力在图片中的应用,一般是直接替换CNN中的部分,或者和CNN一起用,总之Transformer在图片上还是依赖卷积的,但实际上不需要依赖。

VisTransformer在大规模数据做训练,迁移到小数据集上时,效果会很好。

Introduction

现有的Bert就是在大规模数据做训练,迁移到小数据集上微调模型。由于Transformer的高效性和可扩展性,这样的方案随着数据增多性能还没有饱和(没有过拟合)。

Transformer用于视觉的难点:将2D图片变成1D的序列,如果直接将像素拉长,对于224x224的图片,拉长后变成224x224=50176,而Bert的序列只有512。

  1. 因此一般是将经过卷积或者ResNet后的特征图拉长;
  2. 也有的是将图片分为高度H和宽度W两个维度,分别做Transformer;
  3. 还有的是在一个局部窗口里拉长做自注意力。
  4. 由于没有优化,这些方案都无法用于大规模数据、模型。ViT则是划分patch,每一个patch当做一个单词

CNN具有归纳偏置的特点,比如桌子和椅子大概率是在一起的,再比如先平移再卷积和先做卷积再平移(同样的输入同样的卷积核)得到的特征是一样的,这个特点可以保证CNN有一定的先验信息,在相对少的数据上就有很好的效果。Transformer没有这样的归纳偏置的特点,因此在大规模数据集上的效果会比CNN更好。

第一步将图片打成patch(对224x224x3使用16x16的patch_size会得到14x14=196个patch,每个patch是16x16x3=768),变成一个序列,由于图片不能打乱顺序,但Transformer是会两两都做self-attention,因此加入了位置信息position embedding(作者发现对位置编码用1D编码即1.2.3和2D编码即11.12.13差不多),生成一个一个token。

在开始加入特征字符cls(形状为1x768,位置为0)是一个可学习的特征,最后可以作为Transformer的输出(图像的整体特征)。

第二步经过线性投射层(实际上是768x768的全连接层),上一步的输入为196x768,乘完全连接层的768x768的矩阵,得到196x768的矩阵,加上cls得到197x768。

第三步用cls经过MLP做分类任务