Vision Transformer (ViT)详解:从图像到序列的视觉革命
引言
2020年,Google发布的《An Image is Worth 16x16 Words》论文彻底打破了CNN在计算机视觉领域的垄断格局。Vision Transformer (ViT)首次成功将NLP界的“万能模型”Transformer迁移到图像分类,并在大规模数据集上实现了对ResNet等经典CNN的性能反超。
ViT的核心创新只有一句话,但意义深远:
像处理自然语言句子一样处理图像——把图像切割成“视觉词汇”的序列,用自注意力机制直接捕捉全局依赖。
1. ViT的诞生:CNN的“天花板”与破局
1.1 为什么CNN不够用了?
尽管ResNet、EfficientNet等CNN把局部建模做到了极致,但它们天生带着两个难以突破的归纳偏置:
1.2 ViT的破局思路
ViT直接把CNN的“局部优先”推倒重来,用Transformer的全局优先范式重新定义视觉建模:
- ✅ 全局感知一步到位:第一层自注意力就能让图像左上角的像素“看见”右下角的像素
- ✅ 注意力权重动态生成:根据输入图像内容,自动调整不同区域的重要性
- ✅ 可扩展性极强:模型越大、数据越多,性能提升越明显( scaling law 在视觉领域的完美验证)
2. 极简架构拆解:ViT到底做了哪几件事?
ViT的主体几乎完全照搬了NLP Transformer的编码器,唯一的改动是把“文本序列”换成了“视觉序列”。核心流程可以用4个步骤概括:
关键组件速览
- Patch Embedding(图像转序列的核心):用卷积或展平+线性层,把图像块转成固定维度的向量
- CLS Token:学习一个“全局汇总向量”,最终用它做分类(借鉴BERT)
- 可学习位置编码:把图像块的“位置信息”注入向量(因为Transformer本身是“位置无关”的)
- Transformer编码器:多头自注意力 + MLP + 残差连接 + 层归一化
3. PyTorch极简实现:从零搭ViT-B/16
我们来实现ViT最经典的变体 ViT-B/16(Base版,16×16的块大小),代码清晰易懂,还加了注释。
3.1 第一步:把图像切成“视觉词汇”
3.2 第二步:搭Transformer编码器块
3.3 第三步:组装完整ViT模型
4. 避坑指南:用好ViT的3个关键
4.1 超参数选择
4.2 什么时候用ViT,什么时候用CNN?
5. 总结
Vision Transformer用“序列建模”的统一范式,为计算机视觉打开了新的大门。尽管它有“数据 hungry”、“计算量大”的缺点,但在大规模预训练+下游微调的模式下,已经成为图像分类、目标检测、分割等任务的主流选择。
如果想进一步学习ViT的变体,推荐按这个顺序:
- DeiT:解决ViT在小数据集上的训练问题
- Swin Transformer:引入层次化结构,适配检测/分割任务
- MAE:自监督预训练的代表作,大幅降低ViT的数据需求
相关教程
🔗 扩展阅读

