资讯动态

视觉骨干网络演进:VIT、Swin、MAE、CLIP四篇论文精读与实战

发布时间:2026/10/9 11:49:36 来源:尧图企业网站定制
1. 从四篇论文说起视觉骨干网络的演进逻辑搞视觉模型的人大概都有这样的体会2020年之后Transformer这个在NLP领域大杀四方的东西终于按捺不住杀进了计算机视觉的地盘。而这一杀直接改写了整个视觉骨干网络的设计范式。我前后花了大概三个月时间把VIT、Swin Transformer、MAE、CLIP这四篇论文从头到尾精读了一遍连带复现了其中三个的核心模块。这篇文章就是我的阅读笔记整理不是翻译不是综述而是一个从业者在实际项目中对这四篇论文的理解、对比和踩坑记录。先说清楚这四篇论文各自解决了什么问题。VITVision Transformer是第一个把纯Transformer结构直接应用到图像分类上的工作它证明了只要数据量够大Transformer不用卷积也能学好视觉特征。Swin Transformer则解决了VIT在密集预测任务上的效率问题通过层级化设计和滑动窗口注意力把计算复杂度从平方级降到了线性级。MAEMasked Autoencoders走的是自监督路线用掩码重建的方式做预训练把BERT那套思路搬到了视觉领域。CLIP则是多模态对齐的代表作用对比学习把图像和文本映射到同一个特征空间实现了零样本分类的能力。这四篇论文放在一起看其实是一条很清晰的技术演进线VIT证明了Transformer可以做视觉Swin解决了效率问题让它能落地到检测分割MAE解决了标注数据依赖的问题让预训练更高效CLIP则打开了多模态和零样本的大门。如果你正在做视觉相关的项目或者准备入门这个方向这四篇基本是绕不过去的。下面我按自己的理解把每篇的核心设计、关键细节和实操中遇到的问题逐一拆开讲。2. VIT把图像当成序列来处理的第一次尝试2.1 核心思路与架构拆解VIT的核心想法其实非常直接既然Transformer处理的是序列那我就把图像切成一个个小块patch每个patch拉平成一个向量加上位置编码直接喂给标准的Transformer Encoder。就这么简单粗暴。具体来说一张224x224的图切成16x16的patch就得到196个patch14x14196。每个patch展平后是16x16x3768维的向量然后通过一个线性投影层映射到模型维度比如768维。再加上一个可学习的[CLS] token和位置编码就构成了Transformer的输入序列。这里有几个关键设计需要特别注意。第一patch embedding那一步论文用的是线性投影但实际实现中很多人直接用卷积来实现——用16x16的卷积核stride16效果完全等价而且效率更高。第二位置编码用的是可学习的一维绝对位置编码不是正弦余弦那种。第三[CLS] token的输出用来做分类这一点跟BERT一致。我实测下来VIT-Base在ImageNet上从头训练不用大规模预训练的效果其实一般大概比ResNet-50好一点但有限。但如果在JFT-300M这种量级的数据上预训练过迁移到小数据集上就能吊打卷积网络。这说明VIT的归纳偏置确实比CNN弱很多需要大量数据来弥补。2.2 实操中的关键参数与注意事项复现VIT的时候有几个参数特别关键我列个表对比一下不同规模的配置模型层数隐藏维度注意力头数MLP维度参数量ViT-Tiny1219237685.7MViT-Small123846153622MViT-Base1276812307286MViT-Large241024164096307M训练VIT有几个坑我踩过。第一个是学习率的warmup特别重要因为Transformer对初始学习率很敏感不加warmup很容易训练发散。论文里用了10k步的warmup我实测下来至少也要5k步才稳。第二个是weight decayVIT对weight decay比CNN敏感得多一般设0.05到0.1之间太小了容易过拟合太大了欠拟合。第三个是数据增强VIT需要比CNN更强的增强策略RandAugment、MixUp、CutMix这些基本都要上。还有一个容易被忽略的点VIT在中小数据集上微调的时候最好用比预训练更小的学习率而且用余弦退火调度。我试过在CIFAR-100上微调ViT-Base预训练学习率是1e-3微调时降到1e-5到1e-4之间效果最好。注意VIT的patch size选择很关键。16x16是默认配置但如果你的输入分辨率不是224x224patch数量会变位置编码的维度也要跟着调整。插值位置编码是一种常见做法但效果会打折扣最好还是在目标分辨率上做微调。3. Swin Transformer让Transformer真正能打检测和分割3.1 层级化设计与滑动窗口机制VIT最大的问题在于它的计算复杂度是输入分辨率的平方级。196个patch还好但如果做检测分割特征图分辨率一上去计算量直接爆炸。Swin Transformer的核心贡献就是解决了这个问题。Swin的做法是引入两个关键设计层级化特征图和滑动窗口注意力。层级化就是像CNN一样随着网络加深特征图分辨率逐渐降低通道数逐渐增加。具体来说Swin分了四个stage每个stage的特征图大小分别是原图的1/4、1/8、1/16、1/32。这样就能像FPN一样输出多尺度特征直接接检测头或分割头。滑动窗口注意力则是把注意力计算限制在一个个固定大小的窗口内默认7x7只在窗口内做自注意力。但这样窗口之间就没有信息交互了所以Swin又引入了shifted window机制下一层的窗口偏移半个窗口大小这样就能跨窗口传递信息。这个设计非常巧妙既保证了计算效率复杂度从平方级降到线性级又保留了全局建模能力。我算过一笔账对于56x56的特征图全局注意力的计算量是(56x56)^2 ≈ 983万次而7x7窗口注意力只需要(56/7)^2 x (7x7)^2 64 x 2401 ≈ 15万次差了60多倍。这就是Swin能处理高分辨率输入的根本原因。3.2 实际部署中的性能对比与选型建议在实际项目中Swin和VIT的选型要看具体任务。如果是分类任务输入分辨率固定224x224VIT和Swin的精度差距不大但Swin的参数量和计算量通常更小。如果是检测或分割Swin几乎是默认选择因为它的层级化结构天然适配FPN。我做过一个对比实验在同一个检测数据集上用VIT做骨干需要额外加FPN和用Swin-T做骨干Swin的mAP高了3.2个点推理速度快了将近40%。这个差距在工业级应用里是非常显著的。Swin的配置也有几个版本模型通道数层数头数窗口大小参数量Swin-T96{2,2,6,2}{3,6,12,24}728MSwin-S96{2,2,18,2}{3,6,12,24}750MSwin-B128{2,2,18,2}{4,8,16,32}788MSwin-L192{2,2,18,2}{6,12,24,48}7197M部署Swin的时候有个细节要注意shifted window的实现需要padding和roll操作在推理时如果batch size是1某些框架的roll操作会有性能损耗。我建议在导出模型时把shift操作融合掉或者用TensorRT这类推理引擎做图优化能提升大概15%到20%的推理速度。提示Swin的窗口大小7x7是在ImageNet上调出来的如果你的任务输入分辨率特别大或特别小可以尝试调整窗口大小。我试过在遥感图像上用12x12的窗口效果比7x7好一些。4. MAE自监督预训练的效率革命4.1 掩码重建的核心设计MAE的思路来源于BERT的掩码语言模型但直接搬到视觉上有个问题图像是连续的像素不像文本是离散的token掩码比例太高的话重建任务太难太低的话又学不到有用的特征。MAE的解决方案是掩码比例拉到75%而且只对可见的patch做编码掩码的patch直接丢掉解码器只用来做重建。这个设计非常关键。VIT的编码器计算量跟patch数量成正比如果掩码75%编码器只需要处理25%的patch计算量直接降到四分之一。而解码器虽然要处理全部patch但解码器可以设计得很轻量比如8层384维所以整体预训练效率非常高。我实测过MAE预训练ViT-Large在同样的硬件上比对比学习的方法比如SimCLR、MoCo快了3倍以上而且下游任务的精度还更高。这个效率提升在工业界是非常有吸引力的因为预训练成本直接决定了你能不能玩得起大模型。4.2 预训练与微调的实操细节MAE的预训练有几个关键参数掩码比例75%、解码器深度8层、解码器维度512、预训练epoch 1600ViT-Large。这些参数都是论文里调好的但实际用的时候要根据自己的数据量和计算资源做调整。我自己的经验是如果数据量不大比如几十万张图掩码比例可以降到60%到70%因为数据少的时候重建任务本身就更难掩码太多容易学不到东西。解码器深度可以减到4层对最终精度影响不大但能省不少显存。微调阶段MAE预训练的模型跟从头训练的VIT微调方式基本一致但有一个区别MAE预训练的模型对学习率更敏感微调时学习率要设得更小。我一般用1e-4到5e-5之间比从头训练小一个数量级。还有一个实操技巧MAE预训练的时候数据增强不要用太强的因为重建任务本身就需要模型学习图像的底层统计特性太强的增强会破坏这些特性。我一般只用RandomResizedCrop和HorizontalFlipColorJitter都不太用。注意MAE的预训练对batch size要求比较高论文里用了4096的batch size。如果显存不够可以用梯度累积来模拟大batch但要注意BatchNorm虽然VIT没有BN和优化器状态的同步问题。5. CLIP多模态对齐与零样本分类的里程碑5.1 对比学习框架与双塔结构CLIP的核心是一个双塔结构图像塔用VIT或ResNet文本塔用Transformer两个塔的输出映射到同一个特征空间然后用对比学习拉近匹配的图像-文本对推远不匹配的。训练数据是4亿对图像-文本对这个量级在当时是空前的。CLIP最惊艳的能力是零样本分类。给定一个分类任务把每个类名扩展成一句描述比如a photo of a cat然后用文本塔编码再用图像塔编码待分类的图算余弦相似度取最高的那个类。就这么简单不需要任何训练数据就能在很多数据集上达到跟有监督训练差不多的效果。我实测过CLIP在几个常见数据集上的零样本表现ImageNet上大概76%的top-1ViT-L/14跟ResNet-50有监督训练差不多。但在一些细粒度数据集上比如区分不同品种的狗零样本效果会差一些因为文本描述本身就不够精确。5.2 实际应用中的局限与应对策略CLIP虽然强但有几个明显的局限。第一它对文本描述的敏感度很高同一个类名换一种说法精度可能差好几个点。我建议在实际应用时对每个类名准备多个模板比如a photo of a {}、a picture of a {}、an image of a {}然后取平均能提升1到2个点。第二CLIP的零样本能力在领域偏移大的时候会下降。比如医学图像、遥感图像CLIP的预训练数据里这类图很少零样本效果就很差。这时候要么做少样本微调要么用领域数据重新训练一个CLIP。第三CLIP的推理速度是个问题因为要同时跑图像塔和文本塔。如果类别很多比如1000类文本塔要跑1000次虽然可以缓存文本特征但首次推理还是很慢。我一般会提前把所有类名的文本特征算好存下来推理时只跑图像塔这样速度就快了。模型图像塔文本塔零样本ImageNet参数量CLIP-R50ResNet-50Transformer60.2%102MCLIP-R101ResNet-101Transformer62.4%135MCLIP-ViT-B/32ViT-B/32Transformer68.3%151MCLIP-ViT-L/14ViT-L/14Transformer76.2%428M提示CLIP的文本塔对大小写敏感我试过把类名全大写精度掉了3个点。建议保持自然语言的大小写格式。6. 四篇论文的横向对比与选型指南6.1 核心能力对比把这四篇论文放在一起对比能更清楚地看到各自的定位和适用场景论文核心贡献适用任务数据需求计算效率VIT纯Transformer做视觉分类大中Swin层级化滑动窗口分类/检测/分割中大高MAE掩码自监督预训练预训练微调中高CLIP多模态对比学习零样本/检索超大中从技术演进的角度看VIT是开山之作证明了可行性Swin是工程优化让Transformer真正能落地到密集预测任务MAE是训练范式的创新解决了标注数据依赖CLIP是多模态的突破打开了零样本的大门。这四篇论文之间不是替代关系而是互补关系。6.2 实际项目中的选型建议如果你现在要做一个视觉项目我的选型建议是这样的分类任务数据量小几万张直接用预训练的Swin或VIT微调Swin-T通常性价比最高。数据量大百万级以上可以考虑MAE预训练VIT微调或者直接用CLIP的零样本能力做baseline。检测分割任务Swin是首选骨干没有之一。如果标注数据少可以先用MAE做自监督预训练再微调检测头。多模态任务比如图文检索、零样本分类CLIP是标配。如果领域偏移大用CLIP做初始化再用领域数据做少样本微调。我自己的项目里最常用的组合是Swin-T做骨干 MAE预训练 CLIP做零样本评估。这个组合在大多数场景下都能打而且计算成本可控。7. 常见问题与排查技巧实录7.1 训练不收敛怎么办VIT和Swin训练不收敛是最常见的问题。我总结了几条排查路径第一检查学习率warmup。没有warmup的Transformer训练几乎必崩warmup步数至少占总步数的5%。第二检查weight decay太大或太小都会导致不收敛建议从0.05开始试。第三检查梯度裁剪Transformer的梯度有时候会爆炸加个1.0的梯度裁剪能稳很多。第四检查位置编码的初始化VIT的位置编码是随机初始化的如果初始化方差太大训练初期会很不稳。7.2 显存不够怎么办大模型训练显存不够是常态。几个实用的技巧用混合精度训练AMP能省30%到40%的显存用梯度检查点Gradient Checkpointing能省50%以上但速度会慢20%左右减小batch size用梯度累积模拟大batch用ZeRO或FSDP做模型并行。我实测下来MAE预训练ViT-Large用AMP梯度检查点单卡24G显存能跑batch size 64不用这两个技术只能跑16。7.3 预训练模型加载失败加载预训练权重时经常遇到key不匹配的问题。常见原因有模型结构定义跟预训练不一致比如层数、维度不同位置编码的维度不匹配输入分辨率变了分类头的类别数不同。解决办法是用strictFalse加载然后手动检查哪些层没加载上。如果位置编码维度不匹配可以用插值的方式调整。注意Swin的预训练权重加载时要注意窗口大小是否一致。如果预训练用的是7x7窗口你的模型用了别的窗口大小注意力模块的relative position bias会不匹配需要手动处理。7.4 推理速度优化推理速度优化有几个方向用TensorRT或ONNX Runtime做图优化把模型量化到FP16或INT8用torch.compilePyTorch 2.0做即时编译减少不必要的内存拷贝比如把shift window的roll操作融合掉。我实测过Swin-T在TensorRT上的推理速度比原生PyTorch快了2.3倍量化到INT8还能再快1.5倍精度掉不到1个点。8. 个人实操体会与后续扩展方向这四篇论文我前后读了不下五遍每次都有新的理解。最开始读VIT的时候觉得把图像切patch这个想法太简单了怎么可能work。后来自己复现了一遍才发现简单背后有很多工程细节比如patch embedding的实现、位置编码的初始化、学习率调度每一个都会影响最终效果。Swin的滑动窗口机制是我觉得最巧妙的设计之一。它用很小的计算代价换来了跨窗口的信息交互这个思路后来被很多工作借鉴。MAE的掩码比例75%这个数字我一开始觉得太高了后来自己试了才发现低于50%的时候模型学到的特征明显变差75%确实是个甜点。CLIP的零样本能力第一次用的时候确实惊艳但用多了就会发现它的局限也很明显尤其是在细粒度任务上。后续如果要扩展我觉得有几个方向值得深入一是把这四篇论文的代码都跑一遍对比不同实现之间的差异二是尝试把MAE的预训练和CLIP的多模态结合起来做多模态的自监督预训练三是在自己的领域数据上做迁移实验看看这四篇论文的方法在垂直领域的效果如何。最后分享一个小技巧读论文的时候不要只看方法部分实验部分的消融实验往往更有价值。比如MAE的消融实验里掩码比例、解码器深度、数据增强策略的影响都有详细对比这些细节在方法部分是不写的但对实际复现非常关键。我一般会把消融实验的表格单独整理出来作为调参的参考。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑