一文读懂视觉 Transformer 的演进之路:从 CNN 进化到 VIT

0 阅读7分钟

引言

计算机视觉的核心,就是从图像里提取边缘、纹理、形状这些关键信息,而它的发展,自始至终都围绕着“怎么更高效地学习图像特征”这件事。

早期像Sobel算子、Canny边缘检测这些方法,都得靠人工设计规则,面对复杂的真实场景根本扛不住;后来人们引入了SVM、k近邻这类机器学习算法,但还是得人工做特征工程;传统的人工神经网络(ANN)碰到高清图像时,光是输入神经元就有几百万个,这会让权重参数暴涨,训练起来的成本高到根本承受不起。

就在这样的背景下,卷积神经网络(CNN)应运而生,而且在计算机视觉领域占据主导地位十多年。后来Transformer在自然语言处理(NLP)领域大获成功,能捕捉全局特征的视觉Transformer(ViT)也慢慢成了研究热点。这篇文章就拆解一下CNN和ViT的核心架构,对比两者的关键差异,再结合实战案例,帮你彻底搞懂ViT到底是怎么工作的。

一、CNN:统治十年的视觉架构

CNN能成为计算机视觉领域的“顶流”,核心原因就是它能自动学习图像特征,而且处理高清图像时计算效率很高。它的经典架构,能拆成6个核心层:

1.1 CNN核心架构解析

图片输入层:直接接收原始图像数据,是以多维数组的形式存在的(比如64×64×3的图像,就对应64宽、64高、3个色彩通道)。卷积层:这是CNN的核心部分。我们可以把卷积核理解成一个个过滤器,它会在图像上滑动,对图像的局部区域做卷积操作,这样就能捕捉到边缘、纹理这些基础特征。不过卷积操作的输出是线性的,还得靠激活函数加入非线性因素。激活层(ReLU):用的是修正线性单元(ReLU),公式是f(x) = max(0, x),简单说就是把卷积层输出的负值都变成0,这样能减少无效激活,让网络运行更高效。池化层:主要是对激活后的特征图进行降维,最常用的就是2×2窗口的最大池化(Max Pooling)。这么做既能降低计算的复杂度,又能把关键特征保留下来。全连接层:和传统的ANN一样,把前一层所有的神经元都和后一层的神经元连起来,把提取到的所有特征整合到一起,为最后做分类做好准备。输出层:输出图像的分类结果,训练的时候会通过损失函数计算预测的误差,再不断优化模型的精度。整个过程充分利用了图像的空间结构,通过“分层学习特征”自动提取有用的信息,但CNN也有自己绕不开的短板。

1.2 CNN的“先天局限”:难抓全局特征

图片CNN的卷积核只能关注到像素的局部区域,而且权重共享机制让同一个卷积核作用在整张图像上——这两个特点虽然能提高模型的泛化能力,却限制了它捕捉全局特征的能力。简单说就是,CNN擅长学习局部关联的特征(比如相邻像素组成的边缘),但如果碰到需要跨区域关联的全局模式(比如图像里“车头”和“车轮”的整体关系),它的学习效率就会大打折扣。这种“归纳偏置”在普通的视觉任务里是优势,但在需要关注全局关系的场景下,反而会拖低性能。

二、ViT:借势NLP的视觉新范式

ViT的核心思路很简单,就是把NLP里Transformer的核心逻辑搬到图像领域——先把图像拆成一个个类似“单词”的补丁(Patch),再通过自注意力机制捕捉全局特征。咱们以224×224像素的图像为例,看看ViT是怎么处理的:

2.1 ViT核心架构拆解

图片补丁嵌入(Patch Embedding):先把224×224的图像切成若干个16×16的等大补丁,每个补丁就相当于NLP里的“单词令牌(Token)”。接着把每个补丁展平成一维向量,再通过线性投影层,把这个向量转换成固定长度的D维嵌入向量(比如16×16×3的补丁,最后会转换成D维向量)。位置编码(Positional Encoding):Transformer本身没法感知补丁在图像里的位置,所以得给每个补丁加上位置嵌入信息。要是少了这一步,模型会把所有补丁当成杂乱无章的集合,根本没法还原图像的空间结构。Transformer编码器:把带有位置编码的补丁嵌入序列输入Transformer编码器,通过自注意力机制,让每个补丁都能和其他所有补丁建立关联这也是ViT和CNN最核心的区别:ViT从一开始就能捕捉全局特征,而不是局限在局部。分类令牌(CLS Token):在补丁序列的最前面,加一个可学习的CLS令牌,训练的时候,它会通过自注意力把所有补丁的信息聚合起来。最后模型会根据CLS令牌的向量表示,通过全连接层完成分类。

三、CNN vs ViT:核心差异一次看清

虽然CNN和ViT都用来做图像分类,但从输入处理到特征学习,两者有着本质上的区别:图片

四、实战演示:用ViT做汽车零部件分类

我们用PyTorch的TorchVision库,借助预训练的ViT-B/16模型,来完成汽车零部件分类任务——这个数据集里包含40类汽车零部件,整个核心流程很简单,具体如下:数据预处理:先对输入的图像做标准化、调整尺寸这些操作,目的就是让图像符合ViT模型的输入要求;图片模型加载与适配:把预训练好的ViT-B/16模型加载进来,然后微调一下分类层,让它能适配我们这40类的分类任务就行;训练与验证:我们用交叉熵损失函数(CrossEntropyLoss)作为优化目标,实际训练的时候,模型不仅准确率高,泛化能力也很不错;图片图片预测验证:把新的图像输入到训练好的模型里,它能直接输出概率最高的前5类汽车零部件预测结果。图片通过这个实战能明显看出ViT的核心优势:它靠自注意力机制,能捕捉到图像各个补丁之间的关联,就算是复杂的图像分类任务,也能高效完成。

五、ViT的优势与短板

优势

全局特征捕捉能力强:自注意力机制能让模型直接学习图像各个区域之间的长距离关联,特别适合需要全局上下文信息的任务;迁移性好:预训练好的ViT模型,不用做太多复杂操作,简单微调一下,就能适配不同的图像分类数据集;灵活性高:它的弱归纳偏置,能让模型学习到更复杂的模式,尤其是在大数据集下,性能优势会特别明显。

短板

计算成本高:Transformer架构的计算复杂度比CNN高很多,不管是训练模型还是进行推理,都需要性能更强的GPU资源;数据依赖大:如果数据集比较小,ViT的性能还不如那些优化得很成熟的CNN——毕竟CNN的强归纳偏置,更适合小数据场景。

六、总结:选CNN还是ViT?

其实CNN和ViT并不是非此即彼的选择,不用非要二选一:如果你的任务数据量小、计算资源有限,或者重点是提取局部特征(比如简单的目标检测、边缘识别),那CNN还是更高效、更稳定的选择;如果你的任务需要捕捉全局特征,而且数据量充足、也有足够的计算资源,那ViT就能发挥出更强的性能。从CNN到ViT,计算机视觉的发展本质上就是打破局部限制,去拥抱全局特征。这两种架构各有各的适配场景,只要搞懂它们的核心差异,就能根据自己的实际需求,选到最适合的模型——这也是掌握现代计算机视觉的关键所在。