爱笑的小姐姐 · 2022年03月22日

Compact-Transformer:缓解数据不足带来的问题

文章转载于:GiantPandaCV
作者: pprp
【GiantPandaCV导语】本文致力于解决ViT在小型数据集上性能不够好的问题,这个问题非常实际,现实情况下如果确实没有大量数据集,同时也没有合适的预训练模型需要从头训练的时候,ViT架构性能是不如CNN架构的。这篇文章实际上并没有引入大量的卷积操作,通过修改patch size,以及使用SeqPool的方法就可以取得不错的成绩。

image.png

引言

ViT不适用于小数据集,但是由于很多领域中数据量大小是非常有限的,为了打破ViT数据匮乏下性能不好,只能应用于大数据集的问题。本文提出使用正确的尺寸以及tokenization方法,可以让Transformer在小型数据集上达到SOTA。从头开始训练CIFAR10可以达到98%准确率。

本文中首先引入了ViT-Lite,这是一种小型结构更紧密的ViT,在其基础上添加合适大小的Patch sizeing得到Compact Vision Transformer.

这部分与Early Convolution Stem那篇异曲同工。

本文核心贡献如下:

  • 通过引入ViT-Lite能够有效从头开始在小型数据集上实现更高精度,打破Transformer需要大量数据的神话。
  • 引入新型序列池化策略(sequence pooling)的CVT(Compact Vision Transformer),从而让Transformer无需class token
  • 引入CCT(Compact Convolutional Transformer)来提升模型性能,同时可以让图片输入尺寸更加灵活。

方法

提出了三种模型ViT-Lite, CVT, CCT。

ViT-Lite

image.png

该模型与原始模型几乎相同,但是使用更小的patch size。小型数据集本身就很小,因此patch size比较重要。

CVT

image.png

引入了Sequential Pooling方法,SeqPool消除了额外的Classification Token, 这个变换用T表示:, 输入为, 其中b表示batch size, n表示sequence length, d是embedding 维度,g代表linear layer,(ps:感觉有点类似channel attention)

代码实现如下:

self.attention_pool = Linear(self.embedding_dim, 1)
x = torch.matmul(F.softmax(self.attention_pool(x), dim=1).transpose(-1, -2), x).squeeze(-2)

CCT

image.png

直接引入卷积作为主干,保留了局部信息,并且能够编码patch之间的关系。

CCT-12/7x2代表:Transformer encoder有12层,使用了2个Convolution block,其中用的是7x7 大小的卷积核。

image.png

实验

小型数据集上结果:

image.png

这个地方其实有点不太符合直觉,直觉上来看,卷积层数越多在小数据集上性能应该越好,但是这里发现使用一个卷积要比使用两个更好。

ImageNet结果:

image.png

CIFAR10上的Trade off:

image.png

消融实验:(关注SP即Seqence Pooling操作有效性)
image.png

Positional Embedding的影响:
image.png

推荐阅读

更多嵌入式AI技术相关内容请关注嵌入式AI专栏。
推荐阅读
关注数
18758
内容数
1316
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息