Vision Transformer¶
Abstract
- Basics of Vision Transformer (ViT)
- Efficient ViT & acceleration techniques
- Window attention
- Linear attention
- Sparse attention
- Self-supervised learning for ViT
- Contrastive learning
- Masked image modeling
- ViT & Autoregressive Image Generation
- Hybrid Autoregressive Transformer (HART)
Basics of Vision Transformer (ViT)¶
-
Idea: Convert 2D Images to a Sequence of Patches
- Transformer 的输入是 token,因此对于 image 来说需要将 image 转成 token。
- ViT 的做法是将 image 分成多个 patch,然后将每个 patch 转成一个 token。
- 随后将 patch embeddings 送到 transformer encoder 里。
- 最后输出是第一个 token 的输出通过一个 MLP Head 得到分类结果。
-
Architecture
- 这里的图像被切为了 9 个 32*32 的 patch,因此每个 patch 对应的 token 维度为 3(通道)*32*32=3072,共 9 个 tokens。而 ViT 的 hidden size 是 768。
- 为了将 2D 的图像转为 1D 的 token,这里使用一个卷积层来实现,kernel 大小为 32*32,stride 为 32,padding 为 0,\(c_in\) 为 3,\(c_out\) 为 768。从而将 3072 维的 patch embedding 转为 768 维的 token embedding。
-
实验结果显示,在 dataset 较小时性能不如 CNNs,当数据集变大时,ViT 的性能超过 CNNs。
Efficient ViT & acceleration techniques¶
- High-Resolution Dense Prediciton 很重要,但是 ViT 不能很好地处理高分辨率的图像。
-
因为 Attention 的时间复杂度是 O(n^2),这里的 n 是 token 的数量,那么对于高分辨率的图像,对应的 n 也会增大,从而导致计算量增大。
-
Window Attention¶
-
Idea: 限制 attention 的计算只在 local window 内进行。
- 窗口大小是固定的,因此计算复杂度是线性的。
-
会逐渐 downsample 特征图的大小(多尺度)。
-
问题是没用窗口间的信息,因此使用了 shift 操作。将窗口 shift 之后再计算就可以获得窗口间的信息。
-
Sparse Window Attention
-
Idea: 并不是 windows 内所有元素都很重要,我们考虑保留一部分。同时为了兼顾硬件效率,这里采用 equal-size grouping。
-
Linear attention¶
-
Idea: 使用线性注意力代替原来的 Softmax 注意力。这样可以把注意力的复杂度下降到 \(O(n)\)。
- 但是 ReLU 线性注意力会导致无法产生 sharp distribution,只适合捕捉全局信息,不适合捕捉局部信息。同时也缺少多尺度学习的能力。
- 于是 EfficnetViT 采用了 multi-scale aggregation 并在 FFN 中添加了 depthwise 卷积来捕捉局部信息。
Sparse attention¶
-
Motivation: Sparse, High-Resolution or Dense, Low-Resolution?
- 通常的 resizing 会降低 resolution,保持 dense pixels。但实际上像素并没有必要那么密集,因此可以采用 sparse pixels。
-
SparseViT — Sparse Vision Transformer
-
Window Activation Pruning (with Non-Uniform Sparsity)
根据 L2 激活值的大小进行排序,选出 windows 中重要的 pixels,并聚在一起,在计算 attention 时只更新这部分,其他部分不更新。
-
Sparsity-Aware Adaptation
- Goal: 评估模型在不同的 activation sparsity 的设置下的性能(效率和准确度)。
- 最开始的模型是只在 dense activations 上训练,为了提高 sparsity awareness,我们进行微调,每轮迭代随机采样每层的 activation sparsity configuration。
-
Resource-Constrained Search
- Goal: 对于给定的 latency budget,找到最优的每层的 sparsity configuration。
- 因此这里采用了 rejection sampling,即每次采样出一个配置后,进行评估,如果超过了 latency budget,则拒绝这个配置,重新采样。
-
Self-supervised learning for ViT¶
- Motvation: ViT 需要大量的数据集才能取得好的效果,但是标注大数据集很昂贵。
- 因此可以在 unlabeled dataset 上训练。
Contrastive Learning¶
-
Idea: positive sample 表示同一张图的不同视角;negative sample 表示不同的图。
- 训练目标是让 pull together 正样本,push apart 负样本。
-
实验结果发现,直接在小的数据集上训练 ViT 不能取得好的效果,而且随着模型越大性能下降越多。但是 self-supervised ViT 可以在小的数据集上取得更好的效果,而且随着模型增大性能提升。
Multi-Modal Contrastive Learning¶
-
CLIP: Contrastive Language-Image Pre-Training
- 具体可见 CLIP。
-
MAE: Masked Autoencoders
-
Idea: 和 BERT 类似,随机 mask 一部分 patch,然后预测他们。
-
这里的 heavy encoder 只用处理 unmasked tokens,lite decoder 处理所有 tokens。
- 实验发现 MAE 可以在很高的的 mask ratio(75%)上取得良好的效果,相比之下 BERT 只能达到 15% 的 mask ratio。
- 这说明图像数据相比语言数据有更低的信息密度。
-
ViT & Autoregressive Image Generation¶
-
能否生成 visual tokens,采用自回归的方式生成。二者区别如下:
-
AR image generation
- 有三种生成方式,一次生成一个 token(按顺序/随机顺序),一次生成多个(Maksed AR)。
-
VQ: Vector Quantization
- 问题:语言的 token 来自固定的词表,里面的元素是有限的、离散的。但是图像 token 是连续的。
-
Idea: 将 image patch 映射到离散的 codebook indices,随后用自回归的 transformer 生成 token。
-
这里映射的方法是 Vector Quantization,与之前 quanzation 类似,但是区别在于这里的对象是 vector 而不是 scalar。
-
VAR:
-
Idea: 经验上说一次生成更多的 tokens 可以有更好的效率,因此这里采用了 multi-scale encoding 的方法。可以看到我们每次生成的 patch 是越来越大的。
-
对应的 mask 也不再是上三角,变成 block-wise 的。
-
-
HART: Hybrid Image Tokenization
-
Motivation: 如果使用离散的 decoding 会导致图像生成质量下降(因为 token 是离散的,在细微处无法表达)。
-
Idea: 同时处理 decoding & discrete tokens。其中 continuous tokens = \(\sum\) discrete tokens + residual tokens,这里的 residual tokens 我们可以用 diffusion 来生成,这样使用的模型小,但可以生成细节。
-