掌握 ViT(Vision Transformer)模型结构——Transformer 如何征服计算机视觉领域
目录
一、前言
二、ViT 出现之前的视觉模型
(一)CNN统治时代
(二)CNN的优势
(三)CNN的局限性
三、Transformer为什么能用于图像
(一)Transformer的优势
(二)问题来了
四、ViT核心思想
五、ViT整体结构
六、Patch切分原理
(一)为什么要切分
(二)切分过程
(三)结构示意
七、Patch Embedding原理
(一)Patch无法直接输入Transformer
(二)展开过程
(三)线性映射
八、CLS Token原理
(一)什么是CLS Token
(二)作用
(三)分类阶段
九、位置编码原理
(一)为什么需要位置编码
(二)输入结构
十、Transformer Encoder结构
(一)Multi-Head Attention
(二)Feed Forward
(三)LayerNorm
十一、ViT核心工作流程
十二、ViT为什么有效
(一)全局感受野
(二)更强长距离建模能力
(三)结构统一
十三、ViT存在的问题
(一)数据需求巨大
(二)小数据集效果一般
(三)计算量较高
十四、ViT的重要改进模型
(一)DeiT
(二)Swin Transformer
(三)BEiT
(四)MAE
(五)SAM
十五、PyTorch实现ViT核心思想
十六、ViT与CNN对比
(一)CNN
(二)ViT
(三)未来趋势
十七、ViT对计算机视觉发展的意义
十八、总结
在计算机视觉领域,卷积神经网络(CNN)长期占据统治地位。
从经典的:
LeNet
AlexNet
VGG
GoogLeNet
ResNet
EfficientNet
到后来的各种目标检测和图像分割模型。
几乎都建立在 CNN 之上。
然而到了2020年。
Google Research 提出了一篇轰动整个视觉领域的论文:
《An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale》
即:
Vision Transformer简称:
ViT这篇论文首次证明:
Transformer 不仅能够处理自然语言,还能够直接用于图像分类任务。
更令人震惊的是:
在足够大的数据集上训练后。
ViT 的性能甚至超越了当时最先进的 CNN 网络。
从此:
计算机视觉正式进入:
Transformer时代后续诞生的:
DeiT
Swin Transformer
BEiT
MAE
DINO
Segment Anything(SAM)
都建立在 ViT 思想基础之上。
可以说:
理解 ViT,就是理解现代视觉大模型的开始。
二、ViT 出现之前的视觉模型
(一)CNN统治时代
传统图像分类流程:
图片 ↓ 卷积层 ↓ 池化层 ↓ 全连接层 ↓ 分类结果例如:
ResNet结构:
Input ↓ Conv ↓ Residual Block ↓ Pooling ↓ FC ↓ Output(二)CNN的优势
CNN具有:
局部感知能力。
例如:
3×3卷积核:
只关注局部区域。
同时具备:
参数共享特点。
大大减少模型参数量。
(三)CNN的局限性
虽然CNN很成功。
但存在一个问题:
感受野扩展缓慢例如:
图像左上角目标。
与右下角目标。
建立联系需要:
很多层卷积。
因此:
长距离依赖建模能力较弱。
三、Transformer为什么能用于图像
(一)Transformer的优势
Transformer最大的特点:
Self-Attention能够实现:
全局建模即:
任何两个位置都能直接建立联系。
例如:
图像:
猫的耳朵。
与:
尾巴即使距离很远。
Attention也能直接关联。
(二)问题来了
Transformer原本处理:
文本序列例如:
我 喜欢 人工智能而图像是:
二维矩阵例如:
224×224×3如何转换?
这就是ViT最大的创新。
四、ViT核心思想
ViT提出一个大胆想法:
把图片当作一句话处理。
在NLP中:
一句话 = 多个Token例如:
我 喜欢 AIViT认为:
图片 = 多个Patch例如:
224×224图片切成:
16×16小块然后:
每个Patch看作一个Token。
送入Transformer。
五、ViT整体结构
ViT总体流程:
Image ↓ Patch Partition ↓ Patch Embedding ↓ Position Embedding ↓ Transformer Encoder ↓ MLP Head ↓ Classification这是ViT最核心结构。
六、Patch切分原理
(一)为什么要切分
Transformer只能处理:
序列数据因此:
必须将图片转成序列。
(二)切分过程
假设输入:
224×224×3Patch大小:
16×16那么:
224 ÷ 16 = 14得到:
14 × 14 = 196个Patch。
即:
196个Token(三)结构示意
原图 ↓ 切分 ↓ Patch1 Patch2 Patch3 ... Patch196七、Patch Embedding原理
(一)Patch无法直接输入Transformer
因为:
每个Patch:
16×16×3仍然是矩阵。
Transformer需要:
向量输入。
因此:
需要Embedding。
(二)展开过程
一个Patch:
16×16×3展开:
768维向量因为:
16 × 16 × 3 = 768(三)线性映射
然后:
768 ↓ Linear ↓ 768或:
768 ↓ 768/1024得到统一维度。
最终形成:
Patch Embedding八、CLS Token原理
(一)什么是CLS Token
ViT借鉴BERT设计。
增加:
[CLS]分类Token。
(二)作用
用于收集:
整张图片信息结构:
CLS Patch1 Patch2 ... Patch196(三)分类阶段
最终:
仅取:
CLS Token输出。
进行分类。
九、位置编码原理
(一)为什么需要位置编码
Patch经过切分后。
Transformer不知道:
谁在左上 谁在右下因此:
加入:
Position Embedding(二)输入结构
最终输入:
Patch Embedding + Position Embedding形成:
Token Sequence进入Transformer。
十、Transformer Encoder结构
ViT采用:
标准Transformer Encoder结构。
整体流程:
Input ↓ Multi-Head Attention ↓ Add & Norm ↓ MLP ↓ Add & Norm ↓ Output(一)Multi-Head Attention
负责:
全局信息建模(二)Feed Forward
负责:
特征变换(三)LayerNorm
负责:
稳定训练十一、ViT核心工作流程
完整流程:
Image ↓ Patch Split ↓ Patch Embedding ↓ Add Position ↓ Transformer Encoder ↓ CLS Token ↓ MLP Head ↓ Prediction这是ViT最经典结构。
十二、ViT为什么有效
(一)全局感受野
CNN:
局部卷积。
ViT:
全局Attention任意两个Patch:
都能直接通信。
(二)更强长距离建模能力
例如:
猫头。
与:
猫尾巴。
能够直接建立联系。
(三)结构统一
与NLP Transformer保持一致。
方便:
跨模态迁移十三、ViT存在的问题
(一)数据需求巨大
ViT原论文:
训练数据:
JFT-300M约:
3亿张图片远超ImageNet。
(二)小数据集效果一般
数据不足时:
CNN往往更好。
(三)计算量较高
Attention复杂度:
O(N²)Patch越多:
计算越大。
十四、ViT的重要改进模型
(一)DeiT
Facebook提出。
解决:
ViT依赖大数据问题。
(二)Swin Transformer
微软提出。
引入:
Window Attention机制。
大幅降低计算量。
(三)BEiT
借鉴BERT思想。
实现:
视觉预训练(四)MAE
Meta提出。
实现:
自监督学习(五)SAM
Segment Anything。
其核心骨干网络:
仍然基于ViT。
十五、PyTorch实现ViT核心思想
Patch Embedding示例:
import torch import torch.nn as nn class PatchEmbedding(nn.Module): def __init__( self, img_size=224, patch_size=16, in_channels=3, embed_dim=768): super().__init__() self.proj = nn.Conv2d( in_channels, embed_dim, kernel_size=patch_size, stride=patch_size ) def forward(self,x): x = self.proj(x) x = x.flatten(2) x = x.transpose(1,2) return x输出:
(Batch,196,768)即:
196个Patch Token十六、ViT与CNN对比
(一)CNN
特点:
局部感知 参数共享优点:
小数据集表现好(二)ViT
特点:
全局Attention优点:
大规模数据优势明显(三)未来趋势
目前主流视觉模型:
越来越多采用:
CNN + Transformer混合架构。
例如:
ConvNeXt
CoAtNet
EfficientFormer
十七、ViT对计算机视觉发展的意义
ViT最大的贡献:
首次证明:
Transformer 可以替代CNN用于图像理解。
其思想推动了:
Swin Transformer
DINO
CLIP
SAM
GPT-4V
等现代视觉大模型的发展。
可以说:
ViT 是视觉领域从 CNN 时代迈向 Transformer 时代的重要转折点。
十八、总结
Vision Transformer(ViT)是计算机视觉领域最具影响力的模型之一,它成功将 NLP 中的 Transformer 引入图像处理任务,并开启了视觉 Transformer 时代。
本文重点掌握了:
1、ViT提出背景;
2、CNN存在的局限;
3、ViT核心思想;
4、Patch切分机制;
5、Patch Embedding原理;
6、CLS Token作用;
7、Position Embedding原理;
8、Transformer Encoder结构;
9、ViT优势与不足;
10、ViT后续改进模型。
可以将 ViT 理解为:
“把图像切成一个个视觉单词(Patch),然后利用 Transformer 像处理自然语言一样处理图像。”
正是这一思想,让 Transformer 成功突破 NLP 领域边界,进入计算机视觉领域,并最终催生出今天的视觉大模型和多模态大模型生态。对于深度学习开发者而言,ViT 是学习现代视觉 AI 技术必须掌握的重要基础模型。
