一、ViT的意义
Vision Transformer(ViT)
是一种基于Transformer
架构的图像分类模型,它通过将图像划分为一系列的图像块(patches)
,并将这些块转换为向量序列,然后通过Transformer
的自注意力机制对这些序列进行处理,最后通过全连接层进行分类。
与传统的卷积神经网络(CNN)
相比,ViT
的主要意义在于:
(1)消除了传统卷积神经网络对于图像尺寸的限制。传统的CNN
需要固定大小的输入图像,而ViT
可以处理任意尺寸的图像,将其划分为块并进行处理,大大提高了模型的灵活性。
(2)提供了一种新的处理序列数据的思路。Transformer
最初是针对自然语言处理任务设计的,而ViT
将其成功应用于图像分类任务,验证了Transformer
在处理序列数据方面的广泛适用性。
(3)可以处理长程依赖关系。由于自注意力机制的存在,ViT
可以捕捉图像中任意两个位置之间的关系,从而更好地处理长程依赖关系的问题,如目标检测、图像分割等任务。
因此,Vision Transformer
的意义在于为图像分类任务带来了一种全新的模型架构,打破了传统的卷积神经网络对图像尺寸的限制,并且展示了Transformer
在图像处理领域的潜力。它为研究人员提供了一种全新的思路,可以进一步探索Transformer
模型在计算机视觉领域的应用。
二、使用Position Embedding实现了图像和文本的向量尺度统一
由于多头自注意力是针对NLP
提出的,它的输入尺度为[batch size, num token , dim_token]
,而CV
中图像输入尺度通常为[batch_size, num_channel, height, width]
,ViT
通过Patch Embedding将其尺度转换至期望的形式。
说白了,就是CV
中空间(height*width)
对应NLP
中的num_token
,CV
中的通道num_channel
对应NLP中的dim_token
。
如上图所示,假设一张图像的尺寸为[ 3 , 224 , 224 ]
,ViT会将其均分为多个Patch
(上图是3 ∗ 3 = 9
个,ViT
结构图中是14 ∗ 14 = 196
个),于是每个Patch
的尺度为[ 3 , 16 , 16 ](16 = 224 ÷ 14)
。对于每个Patch
,ViT
使用一层2D
卷积进行特征提取可以得到尺度为[ 768 , 14 , 14 ]
的特征(卷积核大小和步长均与Patch
一致,输出通道数为768
)。之后将[ 768 , 14 , 14 ]
的特征转置为[ 14 , 14 , 768 ]
的并将其展平即可得到[ 196 , 768 ]
的特征。
此时转换完成,其中:
(1)196
即为token
的数量,对应文本输入尺度[batch size, num token , dim_token]
中的num_token
。
(2)768
为token
的向量长度,对应文本输入尺度[batch size, num token , dim_token]
中的dim_token
。
如下图所示。
由于ViT
处理的是分类任务,所以它参考BERT
特地拼接上了一个大小为[ 1 , 768 ]
的Class token
,于是现在token
的大小变成[ 197 , 768 ]
。ViT
中Class token
是一个初始化为0
的可学习参数向量。通常Class token
会被单独拿出来作为ViT
提取出来的图像特征用于下游任务。
另外,ViT
保留了Transformer
中的位置编码(Position Embedding)
,它也是初始化为0
的可学习参数,不过不是拼接而是加入,所以其大小为[ 197 , 768 ]
,与当前token
的大小一致。
此时,所以token
的准备完成,一个批次的图像转换为token后尺度是[batch_size, num_token, dim_token] (num_token=197, dim_token=768)
。