Transformer开启了大语言模型时代,Vision Transformer则是打破了自然语言处理(NLP)和计算机视觉(CV)在技术差异上的壁垒,在一些图像识别任务的测试对比中表现出与CNN相媲美甚至更好的效果,证明了用于处理序列的Transformer技术架构在CV领域的有效性。
本文将尽力用最简洁语言表述一张图片从输入ViT模型到模型输出其类别的全过程,旨在让读者更轻松地在脑海中轻松建立一个对于ViT的清晰和完整的认识,而技术细节部分在我们对整体有了一个清晰的认识后,可以在网络上搜寻到大量资料进行探究,所以本文不涉及对技术细节的讲解。
ViT借鉴了Transformer的encoder部分。其整体结构的一个例子(没有带红字标注的原图来自于网络):
把图片变成序列
一个句子有多个词(token)组成,一个词在句子中位置的改变可能会导致语义的改变。那么把一张图片类比成一个句子,把图片切割成一个个小块(patch),每个图块就可以类比为一个词,每个图块位置改变也可能改变图片所表达的含义,这是看把图片变成序列的一个合理角度。
实现上,我们可以将每个图块展平成向量,然后经过一个线性层把向量映射到目标长度,比如768,这就得到了一个个token。
或者不用线性层映射,我们直接用和图块相同大小的卷积核,步长和图块边长相等,卷积核个数为768的这样的卷积层来对原图做卷积,结果的特征图的每个位置展平也能得到长度为768的一个个token。这部分很简单。
添加一个用于分类的token
这个token放在上面得到的token的最前面,长度也是768。相当于一个句子前面人为添加了一个词,这个token是模型参数,不是固定的数值。最终对图片进行分类利用的就是这个token,不需要其他token,因为在做注意力机制时,每个token互相都包含了其他token的信息,所以我们用这个模型参数token来获取整张图片所有图块token的信息。
加入位置编码信息
这里的位置编码和那个分类token一样,也是模型参数,而不是像之前系列讲解的Transformer位置编码那样采用固定的函数。 这是因为前者处理的句子长度是不一定的,而这里ViT处理的图片分割成多少块就得到多少个token,这个数量是固定的,所以可以采用参数来表示位置编码。
位置编码矩阵形状和上面得到的token词向量矩阵一样(包含那个用于分类的token),对应位相加即可。
开始模型推理
类似于Transformer的encoder部分,如文章开头的图片显示,在Transformer的encoder里加了MLP Block这样一个结构,这个结构比较简单,显示在图片最右侧;还添加了像Dropout这样的操作。整体是对encoder的改造,结构上比较简单。我们可以调整线性层的参数量和整个Block的堆叠次数来设置模型大小。
将分类token送入到分类器进行分类
经过04所述的结构,那个我们人为加入的用于分类的token就包含了图像中所有token的信息,那么很简单地,那个分类token,也就是token矩阵里面的第一个元素我们取出来,送到分类器中(多个全连接层,最后一层的神经元个数就是图片类别数) ,于是就可以得到图片类别。
至此,ViT的图片分类流程就结束了,希望能帮助读者更轻松地理解ViT。
关注公众号,及时接收最新消息。