-卷积时代)
所有的深度学习计算机视觉判别模型无论目标检测、图像分割还是视频动作识别等任务其架构都可以抽象为以下三部分1)Backbone(骨干网络):负责对输入进行特征提取任务是精准提取出当前输入具有的特征、有别于其它输入的特征、服务于最终任务的有效特征类似于传统计算机视觉方法中的SIFT、HOG等特征提取方法只不过SIFT等方法是通过人工设计的而Backbone是利用深度学习模型自动从数据中学习的2)Neck:负责对Backbone提取到的特征进行融合、增强等处理任务是过滤和最终任务无关的特征、增强有效的特征3)Head:根据具体任务类型如目标检测、关键点检测、图像分类等将融合后的特征映射为任务所需的最终输出比如分类概率(图像分类)、坐标框(目标框)等这篇文章会详细梳理从1998年到至今为止比较典型、工业落地较多的Backbone网络整体分为“卷积时代”和“Transformer时代”进行介绍文章会很长。一 卷积时代(1998~2022)第一个问题什么是卷积首先要明确卷积并不是计算机视觉单独提出来的一种操作在计算机视觉领域使用之前卷积操作就已经在信号处理等领域广泛使用了。简单理解“卷积”操作可以将卷积看做是一个搜索过程其用工具在指定对象中搜索我们感兴趣的东西“工具”在卷积操作中称为卷积核“对象”可以是一段波形信号、一幅图片等。卷积通过在数据上滑动卷积核寻找我们感兴趣的东西因为卷积核尺寸大小固定所以我们会说卷积操作具有“局部归纳偏置”它只会在某个局部区域范围内进行操作缺少全局视野但是这种特点对于本身就具有局部相关性的数据比如图像、声音反倒是一种性能增强因为图像中的物体肯定是集中在某个局部区域范围内的不会弥散到整张图像所以用卷积操作处理图像才会获得较好的效果。第二个问题为什么卷积操作能够通过卷积核找到我们感兴趣的东西传统卷积操作中的卷积核是由人工精心设计的它根据我们要找的东西的特点去反向构建对应的卷积核。拿图像处理中的边缘检测为例一幅图像可以看作是由某个函数生成的每个(x,y)处的像素值就对应这个函数的函数值f(x,y)那么在这种观点下图像的导数可以通过差分来定义边缘是图像中灰度突变的像素集合边缘检测的目的是通过某种方法找到这个像素集合并将这些像素进行有序连接形成边缘。这个过程很明显就是一个搜索找东西的过程我们可以定义一个卷积核让这个卷积核和原图像的像素值进行卷积操作从而得到那些灰度突变的像素集合这样就找到了图像的边缘。这个卷积核应该如何去定义其实可以通过公式推导出来其中卷积核的中心处是(x,y)对应公式中的-4f(x,y)所以对应位置处填-4上面的(x-1,y)对应公式中的f(x-1,y)所以对应位置处填1其它位置的数字同理利用这个卷积核对图像进行卷积就得到了图像的二阶导数拉普拉斯结果而这个结果也对应着图像像素突变幅度较大的边缘这样我们就提取到了图像的边缘信息。如果每个卷积核都像上面这样设计、计算会很麻烦深度学习卷积神经网络要做的事就是让网络自己从训练数据中学习出卷积核中的具体数值这篇文章关注于计算机视觉Backbone卷积更详细的介绍就不展开了可以看深度学习基础-3 卷积神经网络卷积时代的Backbone都是基于这种卷积操作从输入中提取有效特征因为将卷积过程看做是特征提取的过程所以在深度学习中也称卷积运算得到的结果为“特征图(Feature map)”。卷积时代的Backbone是以“ResNet ”作为分割节点的在ResNet之前大家在探索如何将卷积操作结合到深度学习中、如何构建更加有效的卷积神经网络结构当时发现的一个事实是更深层的卷积神经网络结构特征提取会更加准确但是如果盲目增大网络的层数效果反而会下降。ResNet通过残差连接解决了这个问题从而使训练更深层、更大规模的卷积神经网络成为可能。ResNet之后大家对ResNet进行了不同层面的改进优化比如更加准确、更加轻量等。进入2020年随着Transformer架构正式进入计算机视觉领域其表现出来的通用性、泛化性远超基于卷积架构的Backbone大家的目光开始聚集于Transformer架构的Backbone甚至出现了抛弃卷积操作的呼声ConvNeXt在卷积操作的基础上融入Transformer的优点以卷积结构达到了比肩Transformer架构的性能作为卷积结构Backbone的最后一舞但是历史的发展无法阻挡Backbone还是转向到了以Transformer架构为主的时代。1.1 早期探索ResNet之前(1998~2015)1998-LeNet《Gradient-Based Learning Applied to Document Recognition》Yann LeCun在1998年提出LeNet用于解决手写体图片识别问题是深度学习计算机视觉的开端Yann LeCun也因为对深度学习的贡献获得了图灵奖。LeNet网络结构如下输入图片-卷积-池化-卷积-池化-全连接层分类最终得到输入图片中包含的手写字符类别。LeNet确立了延续至今的卷积神经网络结构设计准则1)利用卷积层对输入图像进行卷积操作得到特征图(feature map)2)利用非线性激活函数对特征图进行激活增强网络的非线性特征提取能力3)利用池化层对特征图进行特征池化剔除冗余特征、保留有效特征通过重复堆叠这些“卷积池化”结构从输入图像中进行特征提取。2012-AlexNet《ImageNet Classification with Deep Convolutional Neural Networks》LeNet指出了深度学习计算机视觉这条道路可行AlexNet以当时的计算条件证明了这条道路是未来最优。AlexNet在当年的ILSVRC-2012计算机视觉比赛中获得了冠军相关指标远超第二名传统计算机视觉方法10%~20%证明了大规模图像训练数据深度学习卷积神经网络的可行性网络整体结构如下整体还是采用卷积池化的架构但是受限于当时的GPU计算资源条件必须切分网络在两个GPU上进行训练所以图中会出现平行的两部分其实这些是一个整体AlexNet做出了以下改进其中ReLU激活函数、局部相应归一化、重叠池化是为了让AlexNet特征提取更加准确数据增强和Dropout是为了缓解AlexNet参数量过大出现过拟合的风险。值得一提的是论文的三个作者都是后来人工智能方向的大牛感兴趣的可以自己搜索相关信息。2015-VGG《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION》VGG验证了加深卷积神经网络的层数会获得更好的特征提取效果最终结果会更加准确。为了加深卷积神经网络层数的同时不增加网络的参数量VGG做了以下改进①使用3*3的小卷积核替代以往常使用的7*7、11*11大尺寸卷积核VGG作者通过实验发现通过堆叠两个3*3卷积核可以得到5*5卷积核的感受野堆叠三个就可以获得7*7卷积核的感受野也就是2个3*3卷积核的效果等价于1个7*7卷积核的效果这种替换在大幅减少计算量的同时还没有损失原有卷积层的效果论文通过大量实验验证了这种小尺寸卷积核替换是可行的②统一使用2*2尺寸的池化层③通过改变不同网络层的尺寸大小提出了多个版本的VGG模型具体如下以往的卷积神经网络一般是遵循固定的结构VGG指出了另外一条卷积神经网络设计路线可以结合具体任务自行设计卷积层、池化层的结构、网络的深度强调了卷积神经网络设计中的“自主性”。2015-GoogLeNet《Going deeper with convolutions》VGG验证了加深卷积神经网络的可行性GoogLeNet验证了加宽卷积神经网络的可行性。以往卷积神经网络的卷积层都是单一、固定尺寸的卷积核GoogLeNet提出了一种Inception结构替换以往卷积神经网络中的卷积层Inception结构包含多个并行的、不同尺寸大小的卷积核用于提取输入中不同尺度大小的特征为了避免多卷积核输出的结果过大导致最终整体卷积神经网络参数量过大使用1*1卷积进行输出通道数压缩在增加网络深度、宽度的同时不增加网络的参数规模。为了避免整体卷积神经网络过深导致过拟合GoogLeNet在网络的中间层外接了辅助分类器增加梯度回传路径保证低层网络的训练稳定同时用平均池化层替代了以往卷积神经网络常使用的全连接层在减少参数量的同时提升了网络的准确率总的来说GoogLeNet做出了以下改进1)Inception结构替换以往固定尺寸大小的卷积层可同时提取不同尺度大小的特征提升特征提取的准确性2)辅助分类器为避免网络过深低层网络得不到充分训练在中间网络层插入辅助分类器增加梯度回传路径保证低层网络得到训练3)平均池化层代替全连接层整体网络结构全部采取卷积操作移除对全连接层的依赖减少参数量让卷积神经网络结构更纯粹2015-BN《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》BN(批归一化)是一种网络正则化方法用于避免过深的神经网络出现过拟合的问题是辅助Backbone的一个集成组件作为一个独立网络层插入到Backbone中现代的卷积神经网络一般都会默认插入BN层其重要性不言而喻一道经典的面试题就是“请解释BN的原理和作用一般用于什么场景它和LN(层归一化)有什么区别与联系”可以自行搜索答案。BN的提出源自于这样一个问题在神经网络训练过程中由于前一网络层参数的更新后面网络层输入的分布会不断变化这使得神经网络的每一层都需要不断适应新的数据分布从而极大减慢了训练速度与稳定性并且会使模型极易陷入饱和区(尤其是使用Sigmoid等激活函数时)。BN 的核心思想是在训练时将归一化操作作为模型架构的一部分对每一层的输入进行归一化让它们的分布稳定在均值为0、方差为1的状态保证输入数据分布的稳定性同时通过可学习参数对归一化后的输入进行线性变换恢复模型的表达能力具体过程如下整体BN网络层的训练、推理伪代码如下训练完成后因为推理时没有 “批量” 的概念无法再计算当前批次的均值和方差因此需要将训练时的 BN 层转换为固定的线性变换合并到网络中1.2 卷积时代巅峰ResNet(2015)《Deep Residual Learning for Image Recognition》更深的卷积神经网络具备更高的准确率但是如果一直增加网络深度模型不仅难以训练还会出现一种反直觉的现象随着网络层数变深训练准确率会达到饱和然后迅速退化这种退化不是由过拟合引起的(过拟合通常表现为训练集表现好而测试集表现差)而是更深层的网络反而产生了更高的训练误差虽然有BN、Dropout这些正则化方法但还是没有从根源上解决这个问题。针对这个问题何恺明等人提出了ResNet网络从根源上解决了无法训练更深层卷积神经网络的问题。ResNet是卷积时代的巅峰之作获得了2016年CVPR最佳论文奖目前论文被引量超25万所提出的残差连接思想已经渗透到人工智能各个领域深度学习网络结构的设计之中无论是计算机视觉还是目前的语言大模型都有残差连接的影子。从字面意义来理解“残差连接”为什么更深层的网络训练会退化、不稳定反过来想怎么才能让深层网络训练稳定如果我们新添加的网络层是恒等映射那么你随便添加多少层网络肯定不会退化因为1*自身还是自身如何将这种想法体现在网络结构设计上呢就是残差连接可以通过网络层旁侧的恒等映射路径直接进行前向传递这也是上图中右侧“identity”的意义。从梯度的角度来理解“残差连接”残差连接相当于在网络中人为构建了梯度回传的“高速通路”让不同网络层可以充分得到监督信号进行自身迭代从而避免了退化的问题。1.3 全方位进化ResNet之后(2016~2022)2017-Wide-ResNet-宽度进化《Wide Residual Networks》ResNet虽然能够扩展到数千层并持续提升性能但是这种盲目增加网络深度的方式存在以下问题1)特征复用递减每提升极小比例的准确率几乎需要将网络层数翻倍导致网络极深。在训练极深的残差网络时梯度很容易直接通过恒等映射进行传播而不经过残差块导致只有少数残差块学到了有用的特征表示很多残差块对最终任务目标的贡献极小也就是大部分网络层都是“冗余”的资源浪费2)训练极其缓慢极深且极窄的网络结构由于大量的串行计算训练效率低下耗时极长Wide-ResNet证明了ResNet的主要威力在于残差块而不是极端的深度通过适当加宽残差块可以用极少的网络层数达到上千层ResNet的效果在大幅提升精度的同时缩短训练时间。2017-DenseNet-连接进化《Densely Connected Convolutional Networks》DenseNet拓展了残差网络“高速梯度通道”的思想为了确保网络层之间的最大信息流动其将所有网络层彼此进行直连也就是在L层的网络中传统卷积神经网络有L个连接但是DenseNet有L*(L1)/2个连接。与ResNet直接进行残差分支输出和短路分支输出求和进行特征输出的方式不同DenseNet通过特征拼接的方式进行特征输出第L个模块会以之前所有模块的特征输出作为输入然后将这些特征进行通道缩减、卷积、拼接作为当前层的特征输出通道缩减通过1*1卷积实现目的是避免整体网络参数量过大。因为不同网络层输出的特征维度不同无法直接进行拼接处理所以在DenseNet中不同DenseBlock之间会插入维度变换层进行特征维度变换保证维度统一具体是使用平均池化层进行实现的。DenseNet通过拼接不同网络层的特征输出达到特征复用的效果但只需要很少的卷积核整体上DenseNet只使用ResNet一半的参数量就可以达到相同的效果但是DenseNet的特征拼接操作会占用大量显存。模型轻量化2016 SqueezeNet《SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND 0.5MB MODEL SIZE》SqueezeNet提出Fire模块对以往的卷积层进行压缩替换。2017~2018 MobileNet系列《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》《MobileNetV2: Inverted Residuals and Linear Bottlenecks》以往的卷积神经网络虽然准确率很高但是无法真正落地到资源受限的设备上往往都是理论上能达到最优但是无法工程落地。MobileNet的目标是设计嵌入式、移动式设备上真正可用的卷积神经网络。MobileNet的设计思想是采取矩阵分解的方法将以往的3*3卷积操作分解为逐通道深度卷积逐空间位置的1*1卷积也就是现在常说的深度可分离卷积MobileNet V2发现V1版本存在以下问题1)ReLU激活函数会使MobileNet大部分输出特征都是0降低了模型的性能2)输入特征通道数较少时深度可分离卷积准确性较差针对以上问题MobileNet V2提出“带有线性瓶颈的倒残差结构”替换以往的卷积层。ReLU6激活函数定义为ymin(max(0,x),6)也就是强制将ReLU的取值范围缩减到[0,6]增强网络在低精度条件下的稳定性同时MobileNet V2在瓶颈结构第二个1*1卷积之后不使用激活函数降低ReLu激活造成的损失。2017~2018 ShuffleNet系列《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》《ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design》相比于MobileNetShuffleNet对1*1卷积也进行了分组进一步提升网络计算速度同时为了增强分组之间的信息交互引入了混洗(Shuffle)操作ShuffleNet V2通过实验归纳了以下高效卷积神经网络设计准则基于以上准则设计了ShuffleNet V22020-EfficientNet-NAS引入到这个时间点卷积神经网络的设计准则业界已经逐渐探索完成主要有以下几种方式但是纯手工的方式进行网络设计不好调节各个设计点EfficientNet利用神经网络架构搜索(NAS)方法自动寻找最优的卷积神经网络结构。2022-ConvNeXt-卷积结构最后一舞到了2022年Transformer基本上已经证明了自己在计算机视觉任务上的潜力相比于卷积架构更具备通用性、泛化性大家也更多聚焦于Transformer架构的Backbone结构甚至呼吁放弃卷积。ConvNeXt详细对比、分析了为什么卷积架构不如Transforme架构并以ResNet为基础借鉴Transformer架构的优点重新设计ResNet达到了比肩Transformer架构Backbone的性能。ViT Patch Embedding模仿利用类似MobileNet的深度可分离卷积模仿Transformer的注意力机制Patch Merge模仿1.4 卷积时代Backbone小结1998年LeNet确定了深度学习卷积神经网络的架构模式“卷积层池化层”通过不断堆叠这些网络层从输入图片中进行特征提取。当时是支持向量机(SVM)的浪潮深度学习并没有受到太多重视随着数据量的积累以及加速训练硬件GPU的出现2012年AlexNet凭借卷积神经网络获得了计算机视觉大赛的冠军效果远超第二名传统计算机视觉方法近10%~20%证明了卷积神经网络才是计算机视觉的未来。2015年VGG、GoogLeNet、BN方法的提出将人们的注意力带到如何设计卷积层、池化层、网络结构上想通过这种精心设计挖掘卷积神经网络的全部潜力最终人们达成了共识更深的卷积神经网络具有更高的准确率但是当盲目增加卷积神经网络层数时会出现训练失败的问题。2016年ResNet的提出将训练更深层卷积神经网络变成了现实之后在“更深、更快、更准”目标的指引下出现了对ResNet进一步的优化网络。Wide-ResNet首先证明了更宽的网络残差连接足以媲美笨重的深层网络DenseNet将残差连接的“高速梯度通道”思想发挥到了机制SqueezeNet、MobileNet、ShuffleNet在人们追求更深、参数量更大网络的时候目光转向到卷积神经网络的轻量化借助卷积分解、通道混洗等操作使卷积神经网络更快、更轻能真正部署到嵌入式、移动式设备上。到此时人们已经积累了大量卷积神经网络设计准则EfficientNet借助NAS技术根据这些设计准则利用NAS自动构建出最优的卷积神经网络结构。2021年Transformer正式进入计算机视觉领域表现出了卷积架构不具有的通用性、泛化性在人们普遍怀疑卷积架构未来的时候ConvNeXt通过对比、融合Transfromer架构特点到ResNet中凭借卷积架构达到了比肩Transformer架构的性能但是历史的发展不可阻挡自2020年之后Backbone转向到了以Transformer为核心的路线上。