机器人所采用的大模型均为多模态大模型,输入至少为视觉图像及末端笛卡尔坐标系位姿,因此 ViT 算是基础模型之一
在计算机视觉领域,Vision Transformer (ViT) 是由谷歌团队于2020年提出的一个革命性研究成果,它成功挑战了自2012年AlexNet提出以来,卷积神经网络(CNN)在视觉任务中的主导地位
ViT 的核心创新在于将 Transformer 模型直接应用于图像处理任务,彻底打破了传统计算机视觉中依赖卷积神经网络的惯例
ViT的引入对计算机视觉与自然语言处理的融合起到了催化作用。越来越多的多模态任务开始采用Transformer架构作为共同的模型框架。例如,CLIP(Contrastive Language-Image Pretraining)和 Stable Diffusion 等模型,都在其设计中采用了预训练的ViT模型作为图像特征提取的核心组件
目录
3.1 Google Research ViT GitHub
3.4 Visual Transformers (vit) by Meta
3.5 DPT (Dense Prediction Transformer)
1 将 Transformer 应用于计算机视觉任务的挑战
Transformer 架构可以看之前的笔记文章,其中最关键的 注意力机制(Attention Mechanism)的核心操作是计算输入元素之间的注意力分数
在计算机视觉中,应用 Transformer 面临着几个挑战,主要包括:
1.1 注意力层的计算复杂度
Transformer 中的注意力层计算的是输入元素之间的相似度,并根据这些相似度计算加权平均。具体来说,注意力层需要计算一个注意力矩阵,矩阵中的每个元素表示两个输入元素之间的注意力分数
注意力分数的计算复杂度为 ,其中 n 是输入序列的长度。这个计算复杂度对于较长的输入序列来说是非常高的
在计算机视觉任务中,输入的图像分辨率通常很高,例如常见的224×224像素的图像,如果将每个像素作为一个元素,那么输入序列的长度就为224 × 224 = 50176,这已经非常庞大,注意力矩阵的计算量极其巨大
对于更大的图像(例如目标检测任务中的416×416像素,甚至视频分类中的800×800像素),计算复杂度将成倍增加,导致直接应用 Transformer 的计算成本难以接受。因此,如何有效地将注意力机制应用于高维图像是将 Transformer 引入计算机视觉的关键问题
1.2 如何将二维图像转化为一维序列
Transformer 最适合处理序列数据,而图像是二维数据。为了将图像输入到 Transformer 中,需要先将图像从二维结构转换为一维序列。最直观的做法是将图像的每个像素视为输入序列的元素,然后将图像拉平成一个长向量
然而,直接将一个高分辨率图像(例如224×224像素)拉直成一个长度为50176的向量,显然计算开销巨大,无法在当前计算资源下高效处理
因此,ViT等模型采用了图像块(patch)的方式,将图像切分成多个较小的块(如16×16像素),然后将每个图像块当作一个元素输入到 Transformer 中。这样既能减小计算量,也能保持图像的空间结构信息。
1.3 如何与自注意力机制结合
如何将注意力机制应用于图像计算就是将 Transformer 应用于计算机视觉领域的重点。最简单的方式就是直接将 CNN 与自注意力机制结合,首先用 CNN 提取特征图(Feature Map),然后将特征图的每个位置视为序列的一个元素,接着应用自注意力机制
自注意力机制的计算过程可以总结为三个步骤,更详细的可以查看之前的笔记文章:
-
相似度计算:对于输入的每个元素(通常是特征图中的某个位置),使用点积、拼接或感知机等方式计算它与其他元素的相似度,得到一个注意力权重
-
标准化:通过softmax函数对计算出的注意力权重进行标准化,使得所有权重的和为1,从而得到规范化的注意力分数
-
加权平均:将注意力分数与对应的value(值向量)进行加权求和,得到最终的输出特征
这种自注意力机制的优势在于其全局性。通过查询(Query)和赋值(Value)操作,它可以捕获特征图中的全局空间信息,适用于处理需要全局上下文理解的任务。
结合原因与思路:
传统的 CNN 只能处理局部信息,因为卷积操作本质上是局部感受野的操作,模型只能关注到卷积核周围的局部区域,无法有效地融合远距离的特征。而自注意力机制能够通过加权融合的方式,处理全局信息,因此在需要全局上下文理解的任务中,表现优于传统 CNN
举个例子:在图像的某个位置(如图像中的一个球体)和图像的其他位置(如另一个球体)之间,存在空间上的远距离关系。自注意力机制能够通过计算注意力权重,将远处的信息加权融合到当前位置的特征表示中,从而提高模型对全局上下文的理解能力
2 基本架构与核心思想
ViT 的架构可以简要总结为以下几个主要步骤:
图像分块 -> 扁平化和线性变换 -> 添加位置编码 -> Transformer 编码器 -> 图像分类
通过这几个步骤,成功将 Transformer 模型应用于图像分类任务,简单介绍一下:
2.1 图像分块
ViT 首先将输入的图像切分为多个固定大小的图像块(patch)。例如,对于一张224x224的图像,若每个块的大小为16x16,那么图像将被切割成14x14=196个块。每个块可以视为一个“词”或者说是一个序列的元素
2.2 扁平化和线性变换
每个图像块被扁平化为一维向量,并通过一个线性投影(即一个全连接层)映射到一个固定维度的向量空间。这些变换后的向量将作为输入送入 Transformer 模型
2.3 添加位置编码
由于 Transformer 模型本身不具备感知输入顺序的能力,因此 ViT 为每个图像块添加了位置编码(Positional Encoding),以保留块在原图中的空间位置信息。位置编码通常采用类似于 NLP 任务中使用的编码方式
2.4 Transformer 编码器
经过位置编码处理后,图像块的向量进入标准的 Transformer 编码器架构中。Transformer 编码器主要由自注意力机制和前馈神经网络组成,通过多层堆叠的自注意力层来捕捉图像块之间的长程依赖关系
2.5 图像分类
Transformer 输出的特征向量经过一个池化层(通常是取平均或最大池化)后,送入一个全连接层进行最终的分类
3 ViT 相关开源项目
3.1 Google Research ViT GitHub
Google Research发布了ViT的原始实现,包括详细的代码和预训练模型,帮助研究人员和开发者能够快速复现ViT的实验。
- GitHub链接:ViT by Google Research
3.2 Hugging Face Transformers
Hugging Face 提供了一个强大的 Transformer 库,其中包括 ViT 模型的实现。该库支持与多个预训练模型进行交互,包括 ViT,并且集成了许多其他计算机视觉任务(如图像分类、目标检测等)
- GitHub链接:Hugging Face Transformers
- ViT模型页面:ViT Model on Hugging Face
3.3 Keras-ViT
如果使用 Keras 和 TensorFlow 架构,Keras-ViT 是一个 ViT 的开源实现,可以在 Keras 框架中使用 ViT 模型
- GitHub链接:Keras-ViT
3.4 Visual Transformers (vit) by Meta
Meta AI(前 Facebook AI)也发布了自己的 ViT 实现,该项目提供了一个基于 Transformer 的计算机视觉框架,适用于多种任务
- GitHub链接:Meta ViT
3.5 DPT (Dense Prediction Transformer)
DPT 是一个针对 Dense Prediction 任务(如深度估计和语义分割)优化的 ViT 版本,适合需要高精度视觉理解的应用
- GitHub链接:DPT - Dense Prediction Transformer
3.6 CLIP by OpenAI
虽然 CLIP 是一个多模态模型,但它使用了基于 ViT 的图像编码器。OpenAI 开源了 CLIP 模型的代码,并提供了相关的预训练模型,可以用于图像-文本匹配等任务
- GitHub链接:CLIP by OpenAI