2000字解读这篇比较ResNet和ViT差异的论文

研究揭示ViT和ResNet在图像识别上的处理差异。两者底层表征相似,但高层表征差别大,ViT更擅长保留局部空间信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

计算机视觉、机器学习,这两个词会让你想到什么?

相信绝大多数人第一反应都是CNN(卷积神经网络),而持续关注这些领域发展的人,则会进一步联想到近几年大火的Transformer,它不仅在自然语言相关任务上表现优秀,在图像领域同样取得了相当不错的效果。

去年10月份Google推出的Vision Transformer (ViT),就在图像识别任务上用更高的学习效率,达到了不亚于ResNet的精度。当一个模型性能达到SOTA之后,很自然地,人们就会想去探究它的原理,并和先前的模型进行比较。今年上半年,普林斯顿大学就从错误一致性的角度比较了ViT与ResNet,最终发现ViT更容易错判形状相似的物体,而ResNet的识别更依赖纹理信息。

最近,Google则对网络本身进行了进一步的探索,试图通过追踪模型学习表征的过程,确认ViT和ResNet在处理图像的原理上是否一致。

论文题目:Do Vision Transformers See Like Convolutional Neural Networks?

论文链接:http://arxiv.org/abs/2108.08810

人工智能深度学习论坛:https://www.deepshare.net/community/list

方法

ResNet与ViT回顾

在开始研究区别之前,我们先快速回顾一下ResNet和ViT分别是谁,长什么样。

首先是 ResNet,深度残差网络,2015年ImageNet挑战赛冠军。通过如下图所示的残差块实现网络层上的跳跃,从而将模型的优化目标从寻找函数的等价映射改为了逼近零,弱化了网络变深对模型性能的负面影响。目前为止,基于ImageNet数据集训练的ResNet50仍然是图像处理任务中使用频率最高的预训练模型之一。

ResNet核心部件
▲ResNet核心部件——残差块

ResNet结构
▲ResNet结构

ViT 则是从NLP领域红的发紫的Transformer改编而来。编码-解码的结构,中间加一个多头注意力机制。ViT主要的改变就是在输入端,将图像进行了分块和降维,从而将图像变成一种类似于词语编码的表达方式,方便了后续处理。经过了这一小步的改动,ViT在JFT-300M(ImageNet的300倍放大版,3亿张图像)上预训练的模型成功超越了ResNet152 [2]。

ViT结构
▲ViT结构

超越ResNet虽然有难度,但也算不上大新闻。ViT能引起讨论热度的主要原因是它跨界了,不仅制霸NLP,如今还可能给CV翻篇。这样的可能性自然是让人坐不住了,如果存在一个方法能作为不同模态不同类型任务的通解,那AI大一统时代说不定也就不远了。

那么,在这一美好愿望成真之前,更需要谨慎地检验: Transformer 处理图像时获取的特征是否和之前主流的 CNN 有所区别?

如果它们虽然处理数据方法有所差异,但决定输出的特征是高度相似的,则意味着目前CV的模型已经接近了人类判断图像时所基于的依据
而如果模型中决定性的特征有所不同,则可以进一步研究哪一种特征对信息的表征效果更好,或者两类模型还能相互借鉴,从而获得新一轮的性能提升。

比较方法——CKA

基于这样的动机,Google用Centered Kernel Alignment (CKA)对ResNet和ViT的一些关键层进行了检验。首先了解一下CKA这种方法。CKA是Google在2019年提出的,用于衡量神经网络中层与层之间相似度的指标

假设想要检测的两层网络分别有和个神经元,取个样本通过模型,则分别可以获取和的表征矩阵。基于点积的相似性,首先可以获得

在这里插入图片描述

此处下标F代表Frobenius范数。根据上式,可以推导出

在这里插入图片描述

然后根据Hilbert-Schmidt Independence Criterion (HSIC)[3]的表达式,将中的列通过核函数对应到上,使得,,可以得到HISC的经验估计值

在这里插入图片描述

此处是中心矩阵,即。归一化之后即为CKA指标

在这里插入图片描述

这个指标的优势在于,它能够确定基于不同随机初始化和不同宽度训练的神经网络的隐藏层之间的对应关系。因此,适合用于寻找ResNet和ViT中是否存在有对应的网络层。

关键结论

利用CKA,研究者发现ResNet和ViT在最接近输入的网络底层(lower layer)时,表征的内容持有较大的相似度;然而,由于两个网络处理表征的方式有很大区别,在层层传递之后,在接近输出的网络上层(higher layer)两者的表征最终区别很大。

ViT和ResNet还有较大的相似度
▲在网络的底层,ViT和ResNet还有较大的相似度

两个在底层表征上有相似之处的网络,居然长着长着发展到了两个方向。因为ResNet在处理输入时,需要经过更多层才能获得类似于ViT底层的表征,由此引发了一个合理的猜想:两个网络在整合全局信息的能力上存在差异。

为了验证这个想法,研究者先是对ViT的不同层中,注意力集中区域的距离进行的计算,他们发现,**ViT无论是低层还是高层,都是局部和全局信息混杂的,相比之下,ResNet更为严格地遵守从局部特征提炼全局特征的处理过程。**这是导致两个网络中表征的差异逐层增加的一大关键因素。

在这里插入图片描述
▲ResNet的有效感受域有一个明确地从局部“生长”到全局的过程,而ViT只是在感知局部和全局信息的权重上发生调整

另一方面,这种差异的原因还可能来自ViT从底层到高层的相似度比ResNet高的这一现象。研究者认为,是ViT中的跳跃连接结构 (skip connection)保护了底层到高层的表征传递,如下图所示,如果撤掉特定块区上的这种连接结构,对应的表征信息就会立刻“失传”。

在这里插入图片描述

由于上述在处理信息过程上的差异,最终,ViT的高层表征能够更精细地保留局部空间信息。尤其是到了最后分类的关键时刻,ResNet还进行了一次全局的平均池化,进一步显著地减少了高层中局部信息的精细度。

在这里插入图片描述
▲ViT的高层保留的局部空间信息更多

通过全方位的比较,包括将隐藏层揪出来细细观察。最终,研究者下定结论:虽然它们在性能上不相上下,但以ResNet为代表的CNN与ViT在处理信息的工艺原理上大相径庭。

最后的话

其实文章的结论没有特别出人意料的地方,毕竟ResNet和ViT的模型结构摆在那里,前期对两个网络分别的原理分析论文也不少了,Google这次的工作其实是把大家直觉性经验性的结论用可复现的实验规范地落在了纸上,并且努力夸夸ViT,好吸引更多研究者采用。

引起白鹡鸰注意的是,在整个验证过程中,ViT模型是Google的,JFT-300M数据集是Google的,CKA度量指标也是Google的,这一整套完整的测评走下来,再一次让人不得不感叹Google的科研实力果然引领潮流。

不仅如此,论文的写作也确实又一次展现了业内标杆的风度,作为一篇原理解释型的文章,它没有将一大坨公式怼到读者脸上,而是通过一系列的自问自答,合理引导读者思路历程,清晰地说明了实验的动机和每个步骤的意义,并用图像佐证观点。

这简直是泥石流中的一股清流,让近期饱受各类奇葩论文的白鹡鸰流下了感动的泪水,并觉得很有写作上的借鉴价值。

本篇文章就到这里啦!学姐会持续找到大佬们的好想法好文章https://www.deepshare.net/community/list,来给大家的!大家可以直接点击名片关注学姐!不要错过干货好文!

### 比较ResNetViT深度学习模型 #### 架构差异 ResNet通过引入残差连接解决了深层网络中的梯度消失问题,使得可以训练非常深的神经网络。这种架构允许信息绕过某些层直接传递给后续层[^1]。 相比之下,Vision Transformer (ViT) 基于自注意力机制构建,该机制能够捕捉图像全局依赖关系而不受限于局部感受野大小。ViT将输入图片分割成固定尺寸的小块序列,并将其映射到高维向量空间,在此之后应用标准Transformer编码器来处理这些特征向量[^2]。 #### 训练方式 对于ResNet而言,通常采用卷积操作提取局部特征并逐步聚合形成高层语义表示;而ViT则更侧重于利用大规模预训练数据集(如ImageNet),并通过迁移学习方法应用于特定视觉任务上。此外,由于ViT结构特点决定了其计算复杂度较高,因此往往需要更多资源来进行有效训练[^3]。 #### 应用场景适应性 ResNet因其强大的泛化能力相对较低的硬件需求,在许多实际应用场景中表现出色,特别是在实时性效率至关重要的场合下。然而随着多模态大模型的发展趋势以及对高质量视觉理解的需求增加,基于Transformer架构设计而成的ViT逐渐展现出独特优势——尤其是在涉及长距离依赖建模的任务里,比如视频识别等时空域内的挑战性课题。 ```python import torch.nn as nn class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super(ResidualBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) def forward(self, x): residual = x out = self.conv1(x) out += residual return self.relu(out) class VisionTransformer(nn.Module): def __init__(self, image_size, patch_size, num_classes, dim, depth, heads, mlp_dim, channels=3): super(VisionTransformer, self).__init__() # Implementation details omitted for brevity def forward(self, img): patches = self.patch_embedding(img) tokens = self.transformer(patches) cls_token = tokens[:, 0] logits = self.mlp_head(cls_token) return logits ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值