从LeNet到ResNet:深层次网络训练难题与残差连接如何破局

发布时间:2026/10/15 22:50:17
从LeNet到ResNet:深层次网络训练难题与残差连接如何破局 如果你在2012年之前问一个做计算机视觉的人卷积神经网络能干什么十有八九得到的回答是“识别手写数字”。这话听起来像句玩笑但确实是那个年代的真实共识——CNN从LeNet时代就在MNIST上刷到了接近99%的正确率可这个“优等生”在之后十几年里始终没登上更大的舞台。直到2012年AlexNet在ImageNet竞赛上一口气把top-5错误率砍到15.3%神经网络才真正从论文里的边缘角色变成视觉系统的主心骨。这篇文章我想沿着“手写数字→ImageNet冠军”这条线把CNN架构20年里最关键的那几次升级拆开讲最后落到一个几乎每个训练过深度网络的人都困惑过的问题为什么网络越深反而越难训1. 从MNIST到ILSVRCCNN等了14年才等来的舞台1.1 LeNet-5一个被提前“剧透”的答案1998年Yann LeCun和他的合作者发表了LeNet-5这是第一套真正意义上完整的CNN工程系统。它做什么呢就是识别手写数字。模型本身的规模放在今天看小得可爱输入32x32的灰度图第一个卷积层用6个5x5卷积核第二个卷积层用16个5x5卷积核中间穿插两个步长为2的最大池化当时叫降采样最后接两层全连接和一个softmax输出层。整个网络的参数大概6万个而现在的ResNet-50光一层卷积可能就比它多。就这么个小东西在MNIST上把错误率压到了0.8%左右放到银行支票识别这类任务里已经接近能用的水平。LeNet-5的厉害之处不在于某个花哨技巧而是它确立了一个此后二十年没变过的基础范式局部感受野、权值共享、下采样。局部感受野意味着每个神经元只看输入的一小块区域这符合图像“相邻像素相关性强、远处像素相关性弱”的客观规律。权值共享意味着同一个卷积核在整张图上滑动相当于同一个特征检测器复用在全图上识别同一个物体无论出现在左上角还是右下角用的是同一套参数。下采样则让特征图逐步变小高层能够看到更大的空间范围。我当时第一次跑LeNet是在CPU上几分钟就见收敛和今天随便一个模型就要等八块GPU跑一天的体验完全不一样。但回过头看LeNet在MNIST上越成功反而越让CNN陷入一种尴尬它在“小壮举”上表现太好以至于大家觉得它只能在手写数字这种小规模任务上玩一碰真实世界的上千类图像就抓瞎。1.2 为什么迟迟没爆发缺数据、缺算力、缺“一个说服别人的场合”LeNet之后CNN其实沉寂了十几年。不是没人试而是阻力太大。第一是数据问题当时最大的带标注图像集也就几万张而CNN是典型的“喂多少数据出多少活”的模型数据不够优势发挥不出来。第二是算力问题一个稍微带点深度的卷积网络要在2005年的GPU上训练几天几夜做研究的人用不起。第三是竞争问题在中小规模数据集上SIFT特征加SVM的分类管线和CNN精度差不多但训练快、理论工具成熟、对硬件要求低。换你是当年的研究者你也未必愿意押注CNN。真正改变局面的其实是三件事一起发生。一是大数据集ImageNet在2010年前后发布包含1000类、大约120万张自然图像二是GPU通用计算开始普及一块消费级显卡就能跑出过去工作站都跑不动的矩阵运算三是AlexNet的诞生它像一个信号弹把所有条件一次点燃了。2012年ImageNet大规模视觉识别挑战赛里AlexNet以top-5错误率15.3%拿到冠军第二名是26.2%。这是一个超过10个百分点的断层式领先。此前几乎所有参赛队伍都用手工设计的特征加线性分类器谁也没想到一个端到端学习的卷积网络能碾压一切。AlexNet的配置今天看也很朴素5个卷积层加3个全连接层、ReLU激活、Dropout、数据增强、两块GTX 580训练了五六天。它之所以能赢最直接的原因是GPU训练带来的规模化红利——网络可以更大、数据可以更多、训练可以更久。AlexNet之后CNN这条路线才真正进入大众视野。于是问题立刻变得具体既然AlexNet证明了“更大的网更强”那能不能一直加深VGG和GoogLeNet在2014年分别给出了自己的答案。2. 深度的蜜糖与砒霜VGG和GoogLeNet都栽过的坑2.1 VGG全3x3卷积堆出来的“深即正义”VGG来自牛津大学视觉几何组它在2014年ILSVRC上提出的VGG-16、VGG-19把AlexNet的5层卷积变成了16到19层。它的核心手法非常“呆”也非常有效完全抛弃大卷积核全部用3x3的卷积核反复堆叠。为什么只用3x3这背后有明确的感受野逻辑。两个连续的3x3卷积等价于一个5x5卷积的感受野三个连续的3x3卷积等价于一个7x7卷积的感受野。感受野相同的情况下3x3堆叠有两大好处第一参数更少三层3x3共27个参数而一个7x7卷积是49个参数第二多出来两层非线性激活函数让网络对非线性模式的拟合能力更强。VGG用这种朴素到近乎固执的方式证明了深度本身是有效的网络越深能表达的映射就越复杂精度确实在涨。但VGG的问题也很快暴露。整个VGG-16全连接层参数占了约1.38亿总参数里的很大一部分训练和推理都贵得惊人。更关键的是VGG在十几层的时候就出现了明显的训练困难网络在验证集上表现不稳定学习率稍大就发散稍小就收敛极慢。当时大家的第一反应是“数据不够网络过拟合”但后面ResNet的退化实验证明事情没有那么简单。VGG的训练困难实际上是深层网络优化难题最早的公开预告。2.2 GoogLeNet用模块化设计绕开深度的雷区同一年的ImageNet冠军是GoogLeNet它走的是另一条路。GoogLeNet的深度其实也很可观22层左右但它的核心创新在于Inception模块一个模块里并行放1x1卷积、3x3卷积、5x5卷积和一个3x3最大池化然后把所有分支的输出在通道维上拼接起来。这个设计思路是什么是假设并不存在一个“最优卷积核尺寸”不同尺度的特征对识别不同目标都有用与其由人拍脑袋决定用几乘几不如让网络在每个模块里自己融合多尺度信息。它比VGG更聪明的地方还在于1x1卷积的降维作用——先用1x1卷积把通道数压缩再进3x3和5x5卷积计算量大幅下降。最终GoogLeNet在只有VGG约1/10参数量的情况下拿到了更好的结果。但GoogLeNet同样受困于深度问题。22层结构的梯度回传已经非常吃力作者不得不加了一个今天我们看来很“土”的技巧在中间层插入辅助分类器把梯度从中间直接引回去。这个设计本质上就是承认了“太深了后面的层很难把有效信号传到前面”。所以你会发现在ResNet出现之前大家已经用各种奇技淫巧和深度博弈了很久VGG堆层数导致训练不稳GoogLeNet插辅助分类器强行回传梯度这些都是同一个问题的不同侧面——深度带来的能力增益和深度带来的优化难度像是一笔怎么算都算不清楚的账。3. 越深越难训的三个物理原因梯度消失、退化与初始化困局3.1 梯度消失反向传播里的“指数衰减”先看最经典的解释梯度消失。反向传播算法要求逐层回传损失函数对参数的导数这里用到一个链式法则假设网络有L层输入经过每一层得到最终输出损失对第一层参数的梯度等于从输出层到第一层一路连乘的各层局部导数之积。这里的“连乘”就是问题所在。以最常用的Sigmoid激活函数为例它的导数形式是σ(z) σ(z) * (1 - σ(z))这个导数最大值只有0.25。也就是说即使每一层的输入都恰好落在sigmoid导数最大的区域梯度经过一层就要乘一个不超过0.25的系数。10层之后是0.25的10次方大约是9.5e-7梯度从数学角度看已经接近归零。而网络总是从最后一层开始回传梯度靠近输入的前几层本来就承担着“提取基础特征”的任务梯度一旦消失它们什么都学不到。我最早训练一个多层sigmoid网络时发现最前面几层的权重几乎不动当时以为是初始化没设置好把方差调大、调小都没用。后来用脚本把所有层梯度的范数打印出来才发现梯度从后往前是几何级数衰减后一层梯度可能是前一层的一百倍甚至一千倍。这就是梯度消失最直观的体验。ReLU在2011年前后被引入CNN它的正区间导数恒为1这确实解决了sigmoid的饱和问题。但大家很快发现光有ReLU也不够——如果输入落在ReLU的负区间导数为0这又造成了“神经元死亡”。更深层的网络还面临权重初始化方差不匹配引发的梯度爆炸或梯度消失。AlexNet用ReLU确实是关键一步但它只是缓解不是根治。3.2 退化问题不是过拟合是“深网络找不到解”2015年ResNet论文里何恺明团队做了一个非常直接的实验训练一个20层的普通网络和一个56层的普通网络在同样的数据和迭代轮数下56层的训练误差竟然比20层还高。这个结果很反直觉因为过拟合只会让训练误差更低不会更高。56层网络不可能是“表达能力不够”它明明包含了20层网络的所有函数空间理论上至少应该和20层一样好。原因只有一个在网络如此深的情况下优化器没能找到一个哪怕不优于浅层网络的解。也就是说问题不在模型的表达空间而在训练过程本身。深层网络的损失曲面更加复杂随机初始化后各个层的输入分布差异巨大梯度信号在前面几层已经不可靠整个优化过程很容易陷入一个糟糕的局部最优或者长期无法收敛的区域。这也是我后来训练网络时的一个核心经验看到_loss不降、train loss也不降_首先要怀疑的不是模型容量不够而是优化过程出了问题。如果训练集上的loss都压不下去别急着加数据、加正则先去看看梯度流是否正常、中间层激活是否已经崩掉、学习率和初始化是否匹配。3.3 初始化困局一场和方差赛跑的猫鼠游戏在残差连接大规模铺开之前初始化几乎是深度网络训练最重要的开关。Xavier初始化在2010年被提出思路是让每一层输出方差和输入方差保持一致做法是按照fan_in的平方根反比缩放权重方差。这个方案在tanh网络里效果显著但在ReLU网络里还是不够原因在于ReLU会把一半的负输入变成0实际传到下一层的方差减半。2015年何恺明团队紧接着提出He初始化针对ReLU的这种情况把方差尺度放大一倍。这两种初始化方案看似只是几个系数变化背后却是深层网络能否训练起来的生死线。它说明一个底层规律深层网络的反向传播本质上是一次“方差传递”如果每一层都把信号的方差放大或缩小一点几十层下来就是天文数字级别的放大或缩小反映到梯度上就是爆炸或消失。BatchNorm在2015年的出现才第一次把这个问题压住了。它把每一层的激活值在batch维度上做一次归一化强行拉回均值为0、方差为1的分布让梯度流不再受前面所有层参数漂移的累积影响。但有意思的是BatchNorm解决的是“稳定中间激活分布”的问题仍然没有解决“深层函数难以优化”的退化问题。真正从架构层面给梯度开出一条高速公路的是ResNet。4. 残差连接凭什么能救场ResNet的电梯模型与梯度回传逻辑4.1 残差块的核心设计把变成(t)ResNet的出发点非常朴素既然深层网络很难优化出好解那我们就改变待优化的目标函数。传统的一个卷积层堆叠目标是学习一个从输入x到输出H(x)的映射ResNet的残差块把公式改成y F(x, W) x这里F是卷积加非线性的组合x通过一条“恒等映射”直接加到输出上。于是网络不再直接学习H(x)而是学习F(x) H(x) - x也就是“我到底要在输入的基础上增加多少变化”。这个改动看起来轻飘飘但数学上极其深刻。先说优化难度。很多实际问题里理想的映射很可能接近恒等映射比如一个很深的网络里某些层最合理的行为就是“什么都不做把信息原样传到后面”。如果让网络直接学恒等映射它需要把权重全部学成0这在高维空间里是件极其困难的事但如果学的是残差那只需要把F学成0——ReLU加一个很平滑的激活区域天然容易输出接近0的小数值。一个容易学一个几乎学不动差别就在这里。再说梯度回传。对残差块求输出对输入的偏导得到∂y/∂x 1 ∂F/∂x注意这里的“1”意味着无论F的梯度多么微弱恒等路径上都有一条永远畅通的梯度回路。反向传播的时候信息可以从最后一层直接穿透几十上百个残差块回到第一层中间不需要依赖任何一层卷积参数的配合。我曾经在一个50层网络里做过测试把某几层的卷积权重冻结只训练残差块里的BatchNorm参数网络竟然还能正常收敛。这在没有残差连接的网络里是不可想象的。4.2 152层的实绩深度第一次变成纯粹的“能力加成”2015年的ImageNet竞赛ResNet用152层拿下了冠军top-5错误率降到3.57%。注意这个数字已经低于人类水平估算值约5%。同时它还通过在不同的残差块组合上做实验反复确认34层的ResNet确实显著优于18层的ResNet而普通非残差的34层网络表现还不如18层。换句话说残差连接让“加深”这件事第一次变成稳赚不赔的买卖。如果给这个架构演进找类比我会说它像给一栋几十层的楼装上电梯。在没有残差连接的年代梯度信号必须一层层爬楼梯爬几层就气喘吁吁十几层之后基本腿软残差连接相当于在楼梯旁边加了一部直达电梯梯度可以从顶层直接滑到底层每一层要做的只是在原有信息基础上做点微小调整。ResNet之后几乎所有视觉网络都把残差作为标配。DenseNet把恒等映射思想更进一步每一层的输入是前面所有层输出的拼接信息流动的路由更多了ResNeXt在残差块内部引入分组卷积同时扩大宽度和基数pre-activation ResNet把BatchNorm和ReLU挪到卷积之前让恒等路径上连激活函数都没有梯度通路更干净。这些都是对“梯度畅通性”的持续优化本质上和ResNet解决的是同一个问题。5. 架构演进留给今天的作业深度训练的经验清单5.1 复现和改结构之前先确认baseline能跑通每次我拿到一个新任务第一件事不是设计什么“魔改网络”而是先用经典结构的默认配置跑通训练流程。CNN训练数据和训练技巧最丰富的那个年代留下了一个潜规则默认配置往往就是最容易复现的配置。VGG和ResNet论文里的数据增强策略、学习率衰减曲线、batch size都是经过大量调参磨出来的先沿着它们走能把“结构问题”和“训练过程问题”分开看。如果连一个标准ResNet都训不上去那问题大概率在数据管线、学习率或者优化器设置上这时候就别往模型上乱加东西了。我从那段时间踩坑学到的最实用的一招是训练的前几百步打印每一层梯度的L2范数。如果某个位置梯度范数小于其他层一到两个数量级那大概率有梯度消失风险如果出现NaN或指数级波动则要考虑学习率和初始化。5.2 在“越深越好”和“越深越难训”之间找平衡今天训练深层网络理论上的标配已经非常明确残差连接加归一化层加合理的初始化。但实操中还是经常翻车我列几个踩过的点都是这些架构技巧在真实训练里的“边界条件”。残差连接的pytorch实现要注意激活函数的位置。原版ResNet里是先卷积再ReLU再恒等加和pre-activation版本则把ReLU放在卷积之前。小改动看着无所谓但会影响恒等路径的“纯净度”进而影响极端深层时的训练速度。碰到梯度爆炸不要急着砍网络先检查BatchNorm是不是在低batch size下统计量崩了或者考虑换成GroupNorm。很多“深了不稳定”其实是统计量估算不稳定而不是深度本身的问题。使用大batch size训练时同一张卡内用SyncBN会让收敛曲线稳定很多但单卡训练时别开SyncBN否则等于没做还白白多花通信开销。5.3 把CNN的经验迁移到Transformer架构上站在今天往回看Transformer之所以能把网络堆到几十层上百层其实大量经验都是从CNN这座“矿山”里挖出来的。Transformer每个block里那条残差连接就是ResNet恒等映射的直系后代LayerNorm替代BatchNorm解决的同样是深层网络中激活分布漂移的问题预训练加微调为什么比从头训练大模型容易本质上和ResNet“先学一个容易的残差目标”是同一个思路——直接学完整映射太难那就先学简单的部分再逐步逼近最终目标。这个启发后来给我帮了大忙。训练一个稍深的Transformer相关模型时loss卡在某个平台下不去我会下意识先查norm层和残差连接是否放在正确位置效果往往比盲目调学习率好得多。CNN那20年最珍贵的东西不是几套网络结构而是一整套“如何和深度和平共处”的工程方法论。5.4 一点私人的习惯性建议我个人现在训练任何带深度的网络都会把下面几件事当成例行公事默认用带残差的结构默认在非线性之前加归一化默认attention和全连接层用偏置卷积层通常不用偏置但要配合理初始化学习率先用warmup等loss进入平稳区再切cosine decay每隔几百步看一眼梯度和激活值的分布而不是只盯loss曲线。这套习惯可以说全部来自ResNet年代的经验复盘——深度不是免费的午餐但它也不是什么玄学只要梯度流保持健康、目标足够合理“越深越强”这件事是可以被稳稳拿下的。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询