图像识别领域长期以卷积神经网络作为默认骨干,但在视觉Transformer出现后,选型问题变得复杂。ViT不再使用卷积核扫描图像,而是将图片切分为固定大小的图像块,再把每个块映射为向量送入Transformer编码器。两者真正拉开差距的并非网络深度或参数量,而是归纳偏置:模型对数据分布的先验假设。CNN的卷积操作天然强调局部邻域、权重共享和平移等变性,而ViT的自注意力层在初始状态下对所有空间位置一视同仁。这个差异直接决定了它们在数据效率和任务适应上的不同表现。

这一差异还会影响数据增强、优化器和模型部署的选择。理解它不是停留在概念层面,而是可以直接指导训练流程与结构改造。
归纳偏置从何而来:局部卷积与全局注意力
卷积神经网络的强先验来自两个设计:局部连接和权重共享。一个3x3卷积核每次只处理输入特征图上的一个小邻域,同一组权重在整张图上滑动。这样做不仅大幅降低参数量,还隐含了一个重要假设:图像中的局部邻域足以描述初级特征,例如边缘、角点和纹理。多层卷积堆叠后,高层特征逐渐获得更大的感受野,但仍然是先局部后全局的信息聚合方式。
Vision Transformer走的是另一条路。输入图像被切分成16x16像素左右的patch,每个patch展平后经过线性映射成为token。在自注意力层中,每个token都会与其他所有token计算相似度,因此第一层就具备全局感受野。这种设计没有局部优先的概念,只能依靠位置编码补充空间信息。位置编码通常不是平移等变的,因此模型必须从数据中学习不同位置关系的重要性。全局计算给ViT带来了更高的表达能力,但也让它在小数据下更难约束搜索空间。
import torch
import torch.nn as nn
# 卷积层:输出像素仅依赖3x3邻域
conv = nn.Conv2d(3, 64, kernel_size=3, padding=1)
# 自注意力:每个patch与所有patch计算相似度
class SelfAttention(nn.Module):
def __init__(self, dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.qkv = nn.Linear(dim, dim * 3)
self.proj = nn.Linear(dim, dim)
def forward(self, x):
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads)
qkv = qkv.permute(2, 0, 3, 1, 4)
q, k, v = qkv[0], qkv[1], qkv[2]
attn = (q @ k.transpose(-2, -1)) * (C // self.num_heads) ** -0.5
attn = attn.softmax(dim=-1)
x = (attn @ v).transpose(1, 2).reshape(B, N, C)
return self.proj(x)
上面的代码只是简化示意,但它能说明核心差异:卷积层从开始就限定邻域范围,自注意力层则一次性计算所有patch之间的关系。CNN通过池化和步长卷积逐步扩大感受野,ViT在每层都保持全局依赖。这个差异在小样本场景会被放大,因为全局注意力需要更多样本来判断哪些远距离关系是真实语义,哪些只是噪声。
数据效率差异与训练机理
在ImageNet这样约120万张图像的规模上,ViT从头训练通常不如同参数量的CNN,这一结论在原始ViT论文中有明确体现。一个ViT-Base模型约有86M参数,但在ImageNet上直接训练准确率低于ResNet。只有当使用JFT-300M或ImageNet-21K这类大规模数据集预训练后,ViT才明显反超。原因可以归结为方差与偏差的权衡:CNN的局部先验带来更低模型方差,样本不足时也能稳定收敛;ViT缺乏先验,模型方差高,容易过拟合训练集中的偶然模式。
数据增强策略的差异也体现了这一点。CNN通常使用随机翻转、随机裁剪和颜色扰动就能获得不错效果。ViT则普遍需要更强的数据增强,例如RandAugment、MixUp和CutMix,有时还会配合随机深度DropPath。强增强人为制造了更多外观、遮挡和组合变化,相当于扩大了有效数据量。对于自监督预训练,MAE通过随机遮蔽大量图像块让ViT学习重建,引导模型关注局部结构,本质上是给自注意力补上了类似卷积的局部先验。
另一个常被忽略的因素是优化器。CNN常用SGD配合动量,调参直观;ViT对AdamW更敏感,权重衰减设置、学习率预热和层缩放都会显著影响最终精度。这些训练细节叠加起来,使得相同数据量下CNN更容易得到一个可用的基线,而ViT需要更精细的调参才能释放潜力。
重新注入局部先验:混合架构与蒸馏
为了在中等数据规模上获得ViT的表达能力,同时保留CNN的局部先验,研究者提出了多种改进方案。Swin Transformer通过将注意力限制在局部窗口内,并引入窗口平移实现跨窗口信息交互,使模型既具备局部归纳偏置又能逐步扩大感受野。ConvNeXt则反其道而行之,从ResNet出发借鉴Transformer的训练策略和结构细节,在保持卷积局部性的同时提升精度。CvT在ViT前几层使用卷积投影生成token,让浅层特征保留更多空间结构。
知识蒸馏是另一个实用方向。DeiT证明,用CNN教师模型蒸馏ViT,可以在ImageNet上取得有竞争力的结果,而不需要外部大数据集。教师模型输出的软标签为ViT提供了关于局部纹理和形状的额外监督,相当于把CNN的归纳偏置以知识形式迁移给Transformer。工程中如果没有海量数据,可以选择DeiT、Swin或ConvNeXt,而不是直接训练原始ViT。
从架构设计角度看,纯粹的卷积或纯粹的自注意力都不是唯一解。现代高性能模型通常在浅层放置卷积或局部注意力,在深层使用全局注意力。这种混合策略兼顾了数据效率和全局建模能力,也是当前视觉骨干网络的主流趋势。
工程选型:从数据规模到部署条件
实际项目中是否选择ViT,首先要评估可用训练样本量。如果数据量在十万以内,ResNet、EfficientNet等CNN通常更稳妥,训练成本低且容易调优。如果数据量达到百万级,并且任务涉及细粒度分类、复杂场景理解或需要与文本等多模态对齐,ViT系列更值得尝试。对于目标检测和分割,Swin、ViT-Adapter等结构已经显示出强大能力,但它们对预训练权重和算力要求更高。
| 维度 | CNN | ViT |
|---|---|---|
| 小数据表现 | 更稳定 | 容易过拟合 |
| 大模型预训练 | 成熟 | 上限更高 |
| 全局依赖 | 需要深堆叠 | 单层即可 |
| 高分辨率成本 | 可控 | 随patch数增长快 |
输入分辨率也是一个关键变量。ViT的计算复杂度随patch数量呈平方增长,高分辨率图片会迅速增加显存和延迟。CNN可以通过空洞卷积或特征金字塔控制高分辨率分支的成本。移动端和实时场景中,轻量CNN仍是首选;在有GPU集群且追求精度的离线任务中,全局注意力的收益更容易体现。
调参时可以从几个标志性经验入手:小数据选CNN,不要盲目堆ViT;使用ViT时优先加载大规模预训练权重;数据增强至少包含MixUp或CutMix;优化器用AdamW并设置合适权重衰减;必要时引入知识蒸馏。通过这些方式,可以缩小ViT与CNN在小数据上的差距,同时保留全局建模能力。

