ViT: 用transformer架构解决视觉问题
其意义在于证明了transformer架构的通用性
结论:
- transformer模型可以不做改动来解决计算机视觉问题
- 小规模数据上略输于CNN,中等或大规模数据集上,表现相当或优于CNN
- 在计算效率上,训练同等精度的模型,transformer模型比卷积神经网络模型更有优势
从模型架构上来看ViT由三部分组成:Linear Projection of Flattened Patches(Embedding层)、transformer encoder MLP(分类头)
由于transformer模块,要求输入为token序列[num_token, token_dim]而图像数据而言,其数据格式为[H, W, C]
Patch embedding
以ViT-B/16为例,假设输入图像大小为[224,224,3] 按照16x16大小的Patch进行划分,得到14×14(196)个块,每个Patche数据shape为[16, 16, 3]线性映射到一维向量得到->[768]
在实际代码中,上述过程通过一个卷积层(核大小为1616,步长为1616)来实现,通过卷积[224, 224, 3]->[14, 14, 768]-> 再展开[196, 768]此时正好变成了一个二维矩阵,正是Transformer想要的
过程:
- 输入图像: [Batch_Size, 224, 224, 3]
- 卷积层操作: Conv2D(kernel_size=(16, 16), stride=(16, 16), padding=‘valid’, out_channels=768)
- 卷积输出: 经过这个 Conv2D 层后,输出的形状将是 [Batch_Size, 14, 14, 768]
- 展平/重塑: 最后,将 [Batch_Size, 14, 14, 768] 重塑为 [Batch_Size, 196, 768]
Transformer Encoder
然后再开头拼接一个 [CLS]token 作为图像的分类 -> [Batch_Size, 197, 768] 通过Encoder后shape不变
核心是自注意力机制,序列中的每个 Token(包括 [CLS] Token 和所有的 Patch Tokens)都可以相互关注,[CLS] Token 经过多层 Transformer Encoder 后,它会“吸收”并“聚合”来自所有图像 Patch 的信息。
MLP Head
ViT 通过 Transformer Encoder 之后,只需要取出最开头的那个 [CLS] token 对应的输出去做分类
模型种类:
归纳偏置:解释为什么在小数据量时ViT的效果不如CNN
在建模时引入人的先验经验,不是从数据中学来的;这导致ViT在小规模数据上效果不如resnet
卷积操作的归纳偏置:(每一层)
- 局部性
- 平移不变性
ViT的归纳偏置:(仅在切分patch时,后续注意力计算是没有归纳偏置的) - 切分patch时引入局部性
- 多个Patch用同一个线性映射层,引入了平移不变性
