Vision Transformer(ViT) 深入浅出
- 简介
- 结构
- 整体架构
- 输入
- 分类标记(cls token)
- 位置编码(Positional Encoding)
- 多头注意力机制(Multi-HeadAttention, MHA)
- 前馈神经网络(Feedforward Neural Network, FFN)
- 网络层次
- 实验分析
- 数据大小
- 预训练计算量
- 内部表征分析
在了解ViT之前首先你要知道什么是Transformer,对于Transformer的学习可以看我的文章:Transformer深入浅出
简介
具体怎么实现可以见项目:Vision-Transformer
结构
整体架构
Patch embedding是一种方法,用于将图像分割成固定大小的块(patches)。例如,如果输入图像的大小是224x224,并且将图像分成 16x16 大小的块,这样就会得到 224/16*224/16=196 个块(patches)。每个块的大小是 16x16 像素,每个像素通常由 RGB 三个通道组成,因此每个块的维度是 16x16×3=768。然后,通过线性投射,将每个 768 维的块映射到一个更高维度的向量空间。例如,如果线性投射的维度是N(通常与patch的维度相同),那么投射后的每个块的维度仍然是 N。因此,整个图像被转换成一个长度为 196 的序列,每个序列元素都那是一个 N 维的向量。在这个过程中,通常会添加一个特殊的标记(例如CLS标记),使得最终的序列长度为197。这样的处理方式将一个视觉问题转换成了一个序列到序列(seq2seq)的问题。
ViT同样需要加入位置编码(positional encoding)来为输入序列引入位置信息。位置编码可以被理解为一个表格,其有N行,N的大小与输入序列的长度相同。每一行代表一个向量,这个向量的维度与输入序列embedding的维度相同(768)。需要注意的是,位置编码的操作是将其与输入序列的embedding进行加法操作(sum),而不是简单地将其拼接在一起(concatenate)。加入位置编码信息之后,整个序列的维度依然是197x768。
输入
分类标记(cls token)
位置编码(Positional Encoding)
多头注意力机制(Multi-HeadAttention, MHA)
首先我们来看Transformer里的多头注意力机制是什么样子:
我们的ViT的就是把带有位置编码的词向量改为了带有位置编码的图,在原文中也就是197x768大小,也就是L=197,d=768。从代码的角度来看就是这样的:
原本的Transformer中是三个线性层进行三次变换,这里只用一个线性层,然后扩展了三倍,最后再拆分开。原理是采用了 8 个注意力头(h=8),模型的隐藏维度 768 被均分给 8 个头,因此每个头的维度 dk =768/8=96
前馈神经网络(Feedforward Neural Network, FFN)
我们也可以叫他为多层感知机(Multi-Layer Perceptron, MLP)。
网络层次
以ViT-Base为例解释为:12 层,隐藏维度 768,MLP 中间维度 3072,12 个注意力头,总参数量 86M(8600 万)
其中:
- Model:模型名称
- Layers Transformer:Encoder 层数
- Hidden size D:特征向量维度(token embedding 的维度)
- MLP size:Encoder 里面 MLP 中间层的维度
- Heads:多头自注意力的头数
- Params:模型总参数量
实验分析
结论:
- 更大规模的预训练数据很关键;
- patch更细通常更强,但更耗算力;
- ViT的算力性价比突出(多个数据集上过强CNN基线,但预训练成本远低于当时的强基线)。
数据大小
数据大小对结果的影响,ViT主要是对于大规模的数据集效果非常好,对于我们切割小的patch也会提升效果:
预训练计算量
结论:
- ViT在"性能/计算量"权衡上总体优于ResNet
- Hybrid在小算力预算下略优于纯ViT,但模型做大后优势消肖失
- ViT在实验范围内看起来还没"饱和":继续堆规模/算力还有上升空间
其中Hybrid代表的意思是混合模型。
内部表征分析
分别对"Patch Embedding/位置编码/注意力范围"做了分析:
如果我们增加Patch效果会更好,但超参数对其学习影响会加深