ViT:An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale
论文地址:https://arxiv.org/abs/2010.11929
ViT是成功的把Transformer从NLP应用到CV领域的模型,作者将一张图片分割成分割成多个固定大小的patch(一般大小为16x16或者14x14),将每个patch当做一个NLP句子中的单词,然后进行线性变化得到patch embedding,这类比于NLP的word embedding。ViT模型只采用了Transformer的encoder部分来提取特征,而忽略了decoder的部分,通过分类得到结果。最终通过实验得到结果,其拓展性强(scalable强,并且模型越大,效果越好)。
1.Patch Embedding和Position Embedding
首先,输入的图像大小为HxWxC,其中H,W分别为图像的高和宽,C为图像的通道数,通常为3(RGB),我们将图像分成PxP大小的patchs,然后通过reshape可得到xp大小为N*(P2xC),其中N为patch的个数,N = (H/P)(W/P) = HW/P2,相当于序列长度。此时序列长度为N(相当于句子长度),每个单词的维度大小为D(大小为P2xC),然后通过一个简单的线性变换将每个patchs映射到D大小的维度。这其实相当于实现了一个大小为PXP,步长为P的卷积操作(通道数为D)。
然后,由于attention是对一层直接进行特征提取,所以并没有位置信息。所添加的position embedding是一个可训练的1-D positional embedding,然后与patch embedding进行直接相加。论文在对positional embedding进行可视化之后,发现相近的patchs的postional embedding比较相似,说明可学到相应位置的位置信息。
2.Class Token
Class Token是一个可学习的嵌入向量,进行随机初始化,它与Patch Token一起输入到Transformer中,构成N+1个Token,对于分类任务来说,就可以用Class Token学到的特征进行分类预测。其没有卷积网络中的Pooling层,用其代替。
3.Transformer Encoder
这是ViT网络的核心部分。该部分与原Transformer的Encoder部分相似。
Self-Attention的计算公式为:
其中根号dk的作用是避免dk过大,导致点积带来方差的影响。而Multi-Head Attention将输入的序列,乘以一个可训练的矩阵,得到原来序列特征长度的h分之一,共h个,经过注意力机制后,得到h个序列进行concat,得到最终的特征。在transformer中是先执行Multi-Head Attention再执行Add和Norm操作,而ViT中是先进行Norm再进行的注意力机制,最后执行Add操作。MSA的计算量和N2成正相关(patch size越大,分的块大,N越小,计算量越小)。
在执行Multi-Head Attention后,该模型再执行了一个MLP,具体为两层线性层,在第一层线性层后,增加了一个Rule激活操作,第二次不使用激活函数,公式如下。
M
L
P
(
x
)
=
m
a
x
(
0
,
R
e
l
u
(
x
w
1
+
b
1
)
)
w
2
+
b
2
MLP( x ) = max( 0 ,Relu( xw1 + b1) ) w2 + b2
MLP(x)=max(0,Relu(xw1+b1))w2+b2
其中间隐藏层将D所以最终得到的D与原D相同。
最终对class token对应的输出做layer norm,然后就可以进行图像分类。
4.总结
ViT模型的超参数主要包括以下,这些超参数直接影响模型参数以及计算量:
- Layers:block的数量;
- Hidden size D:隐含层特征,D在各个block是一直不变的;
- MLP size:中间增大的倍数,一般设置为4D大小;
- Heads:MSA中的heads数量,一般为12或16;
- Patch size:模型输入的patch size,ViT中共有两个设置:14x14和16x16,这个只影响计算量;
在最终的实验中发现,ViT在数据量达到100M时,对比CNN才能显示它的优势。在模型与数据量提升时,性能会持续提升,显示了它的可拓展性,从后有了GPT和CLIP。