残差连接为何优于恒等映射:从梯度通路到优化解空间的数学解析
深度学习圈子里有个流传挺广的说法把网络加深固然能提升表达能力但盲目加深往往会让训练误差先降后升出现一个让很多人头疼的“退化”现象。ResNet中最关键的动作不过是在模块里加了一个加法x F(x)却彻底改变了深度网络的可训练性。本文想从数学原理出发把“残差映射为何优于传统恒等映射”这件事拆开看重点落在反向传播时的梯度通路、优化目标的解空间以及前向传播时的信息保留不回避公式但也尽量让每个式子都讲得明白。适合正在调深层网络、被退化问题困扰或者想理解为什么Transformer里到处都是残差连接的读者。1. 一切的起点网络越深为什么训练误差反而更高1.1 退化现象与问题场景先看一个典型的实验现象。某个图像分类任务里一个20层左右的网络训练误差能收敛到10%以内而把同样结构加宽到56层之后训练误差反而徘徊在20%上下。注意这不是“模型容量不够”因为深层网络在理论上完全能够模拟浅层网络的行为——只要把多余层的输出强行变成“什么都不做”也就是恒等映射H(x) x就可以了。问题在于理论上有解不代表优化器能找到这个解。正是这一点催生了“传统恒等映射”的想法既然深层网络的难题是多余层不知道该怎么“空转”那能不能让网络自己学会把某些层的组合变成恒等映射直接构建一个带约束的网络去逼近恒等映射听起来是最自然的思路结果也是最难训练的。我在实际复现VGG式网络也踩过同样的坑网络一旦超过30层loss曲线就明显出现平台期怎么调学习率都下不去。后来做了个很直接的实验把两层卷积强行初始化成近似单位变换再加ReLU发现前向输出还算正常反向传播时梯度已经变得非常小。这促使我后来彻底接受了残差这种“明摆着绕远路”的设计。1.2 恒等映射到底难在哪里传统恒等映射的难点可以从一个复合函数的角度去理解。假如一个深层网络由若干层组成每层是f(Wxb)你希望整个复合函数逼近单位映射H(x)x。这要求所有层的参数联合起来让每一层的非线性变换都近乎对消。比如两层网络f(W2 f(W1 x))要等于x不仅要W2与W1的关系精确互补还要让ReLU这样的非线性在激活区间内保持一致。数学上的表述是恒等映射在参数空间中是一个极其“薄”的目标集合。接近这个集合需要所有层的权重协调一致地收敛而SGD类的优化器只会根据局部梯度一步一步走很容易被困在损失曲面的某个糟糕局部区域。实际表现就是训练误差高、梯度提供的信号微弱再怎么减学习率也无济于事。我当时在心里算过一笔账如果每层需要把权重逼近单位矩阵I那么20层网络就是把W1 W2 ... W20整体逼近I这是一个非常高的协同约束。相比之下残差网络把“需要做的事情”从“精确变成单位映射”改成了“学一个从输入到残差的映射并且让残差尽可能为零”明显更符合优化器的工作方式这也是后面要展开说的内容。2. 残差映射与恒等映射的数学分水岭梯度通路2.1 两种结构的形式化对比先把两种结构放在一起对比。设第l层输入为x_l其中F代表若干卷积加非线性组成的子网络。传统网络无残差连接x_{l1} f(W_l x_l)残差网络ResNet基本块x_{l1} F(x_l, W_l) x_l一个是纯粹的非线性复合一个是“输入增量”。乍看之下残差只是多了一条加法支路但实际上这一条支路改变了整个反向传播的乘性结构。F在这里学的是“变化量”而不是“目标值”这就是为什么残差映射的主干可以是两层卷积但它们合起来的任务远没有“拟合恒等映射”那么苛刻。我第一次搭ResNet时也觉得这个改动小到无足轻重直到自己画了一遍反向传播的计算图才意识到加法出现在这里等于给梯度开了一条完全不经过非线性激活的“旁路”。2.2 反向传播时出现的关键差异先写出无残差的传统网络梯度。对x_{l1} f(W_l x_l)逐层反向传播时\frac{\partial L}{\partial x_l} \frac{\partial L}{\partial x_L} \prod_{il}^{L-1} W_i^T \mathrm{diag}(f(z_i))这个式子里梯度从深层传回浅层需要不断乘以权重矩阵的转置以及激活函数的导数。每一层乘上去的因子谱范数通常落在0到1之间也可能大于1。层数一多整个乘积就是这些因子的连乘。假设每个因子的谱范数约为0.8那么20层后0.8^{20} \approx 0.0115也就是浅层收到的梯度只有深层的百分之一量级这已经是“梯度消失”的典型情形了。如果因子都大于1比如1.2那么1.2^{20} ≈ 38.3又直接走向梯度爆炸。纯乘性链就是两个极端之间剧烈摇摆。再看残差网络的反向传播。对x_{l1} F(x_l, W_l) x_l求梯度\frac{\partial L}{\partial x_l} \left( I \frac{\partial F}{\partial x_l} \right)^T \frac{\partial L}{\partial x_{l1}}多层展开后\frac{\partial L}{\partial x_l} \left( \prod_{il}^{L-1} \left( I \frac{\partial F_i}{\partial x_i} \right) \right)^T \frac{\partial L}{\partial x_L}这个形式里每一个因子都带有一个单位阵I。展开整个乘积时其中必然存在一项“纯恒等通路”也就是每个因子都只取I的那一项。对应的物理含义是梯度可以完全不经过任何残差分支直接从深层传到浅层。即使残差分支∂F/∂x在某些层变得很弱甚至为0梯度依然有保底通路。换句话说残差结构把一个纯乘性链改造成了一个“恒等通路若干修正项”的并行结构。这个恒等通路就是残差优于传统恒等映射的第一个数学分水岭。2.3 用“送货”的类比说明我平时跟朋友讲这段时喜欢用一个送货的类比。传统深层网络像是逐站转运的物流线路货物每经过一个站点都有可能被扣留、损坏或调包。梯度信号每跨一层就要经过一次“权重激活”的组合检查传递20站之后剩下的信号已经非常微弱。残差网络则相当于每条运输线路旁边都有一条直达干线。货物从出发地可以直接沿着干线到达终点沿途的分支网络只是补充一些本地信息就算这些补充完全丢失干线上的货还是完整的。训练时深层梯度能够沿着干线直接回到浅层这就是残差连接在梯度更新上最大的实惠。我在实操中的体会是加了残差之后浅层卷积核的梯度统计值明显变大尤其在网络前几个block里这直接改善了浅层特征的可学习性。3. 优化视角为什么“学F0”比“学Hx”容易3.1 固定点分析从优化目标的角度看残差结构降低了解空间的难度。传统恒等映射要求整个深层复合函数逼近H(x)x。这等价于让每一层都处于“单位映射不动点”的紧邻区域并且所有层还得协同一致。寻找这个固定点相当于在参数空间里搜索一条极窄的流形优化器每次更新都要同时照顾几十层参数的配合关系。残差网络的条件放松成了让F(x)0。此时x F(x) x网络自然表现出恒等行为。找到一个让F输出全零的参数组合要比找到一个让所有层都表现为单位映射的参数组合容易得多。因为F是一个子网络它的输出为0意味着可以选择让后续线性层权重退化为0或者让前面的特征完全抵消这种解的存在范围宽广得多。再从初始化的角度看。网络刚被随机初始化时F(x)的输出虽然不为零但幅度通常远小于输入特征本身的幅度。因此x F(x)天然接近一个“弱恒等变换”。传统网络则不同随机初始化后第一层的输出和输入之间没有任何保真关系深层网络很难自发地从“完全随机”过渡到“单位映射”。这也是我看到ResNet最初的实验报告时感到信服的原因它并不要求网络一开始就去学一个高难度的变换而是把“起步点”直接放在了“近似什么都不做”的位置上优化器只要在残差上做小幅修正就行。3.2 目标函数曲率与雅可比矩阵第二个优化层面的解释可以看雅可比矩阵的结构。对于残差块y F(x) x雅可比矩阵为\frac{\partial y}{\partial x} I \frac{\partial F}{\partial x}它天然接近单位矩阵I。这意味着跨层传播时梯度的方向和大小不会因为连乘而迅速偏离原来路径。网络整体映射的Lipschitz常数也更容易控制在合理范围内因为残差分支可以被视作对恒等映射的一个小扰动。传统网络的雅可比矩阵则是纯粹的层间权重乘子不包含恒等成分。为了让多层网络整体稳定每层权重的谱范数需要非常精确地控制在1附近这在随机初始化下是不可能做到的。残差网络相当于提前把这个“谱结构约束”揉进了网络公式里优化器不再需要自己发现“权重应接近单位阵”这件事。我实际观察到的现象是同样一套超参数传统深网络在训练初期loss波动很大而残差网络从第一个epoch开始就相对平稳。这就是雅可比结构带来的稳定性红利。4. 前向视角信息守恒与“高速公路”4.1 信息瓶颈与信号衰减深度网络还有一个总被忽略的前向问题信息经过层层卷积和非线性之后原始输入的特征会逐渐被“抹掉”。比如说浅层检测到的边缘、纹理信息要是没有专门通路可能在十几层之后就所剩无几。传统恒等映射要求网络在每一层都保留全套信息但卷积的局部感受野和ReLU的截断特性决定了信息在传递中必然有损耗。残差连接相当于在每一层旁边修了一条“信息高速公路”。不管残差分支F把特征变换成了什么样子输入x的原始形态始终原样保留在加法节点上。浅层信息可以直接跳到十几层之后与深层特征汇合这正是图像分类里不同尺度的特征能同时被利用的原因。我做过一个对比实验把ResNet中的残差分支全部禁用只保留x的恒等传递网络的前向输出会明显变得“平滑化”分类边界也模糊很多再把残差分支恢复网络又能捕捉到高频细节。这从直觉上验证了“恒等通路保信息底、残差分支补细节”的分工。4.2 与恒等连接的细微差别ResNet的原始论文里讨论过三种shortcut方式恒等连接identity shortcuty F(x) x信息完全保真零填充短连接当维度不匹配时在通道或空间维度上补零投影短连接用1x1卷积改变维度后再相加。后续的大量实验表明恒等连接的效果普遍优于其他两种。我的理解是零填充虽然名称上还是“恒等”但补零操作会破坏特征的分布均衡投影连接引入了额外的线性变换矩阵让那一层不再严格保持信息梯度也开始经过这个矩阵的乘法增加了不稳定因素。很多复现细节都在强调要尽可能让“短接路径”保持干净。就算需要用1x1卷积做维度匹配它也只是一个不得已的妥协并不是残差的精髓。5. 残差思想的普适性从ResNet到几乎所有现代架构5.1 Transformer中的Add Norm如果只看ResNet本身会觉得残差只是计算机视觉的专用技巧但后来Transformer彻底改变了这个印象。Transformer的每个子层都是Output LayerNorm(x Sublayer(x))内部的那个x Sublayer(x)和ResNet中的x F(x)如出一辙。自注意力机制要计算每个token与其他所有token的关系这种全局建模本身就容易导致信息扩散和训练不稳定而残差连接保证了每个token的原始表示始终保留自注意力只需要负责“增量修正”。没有这个加法深层Transformer几乎不可能稳定收敛这一点已经有很多消融实验验证过了。我在训练Transformer类模型时也经历过把残差连接去掉后loss直接飞上天的场面。那种情况下无论学习率调到多小网络都很难学到有效特征这也让我重新认识到残差的普适性它解决的是优化结构问题而不是某个具体任务的问题。5.2 扩散模型与生成模型扩散模型里也有残差思想的影子。许多U-Net架构的生成模型编码器和解码器之间使用跳跃连接本质上是把浅层细节信息直接传递到深层解码阶段避免生成图像丢失结构。更直接的是扩散模型常常把网络设计成去预测噪声ε而采样过程中的去噪操作本质上是在做“原图减去噪声增量”这也是一种残差视角学习一个变化量而不是一次性生成完整图像。变化量的空间比图像本身的空间更容易被网络拟合这和残差映射优于恒等映射的逻辑一致。5.3 为什么说残差是一种“通用优化设计”把视野拉宽一点看残差连接已经成为现代深度学习架构的“基建标配”。无论CNN、Transformer、MLP-Mixer还是状态空间模型只要是深层结构几乎都能看到x F(x)的身影。原因在于残差本质上给网络提供了多条“梯度捷径”和“信息捷径”把深层网络的病态优化问题从结构上消解了一大部分。很多研究表明即使模型宽度很大只要保持残差连接训练的稳定性和最终精度都有显著提升。这也解释了为什么大模型动辄几十上百层却不像早期深层网络那样难以训练。6. 从数学到落地实现残差网络时的几个关键细节6.1 残差分支的尺度设置理论归理论真正落地时残差还有一个需要留心的地方残差分支的初始幅度。刚初始化时如果F(x)的输出幅度太大会直接压过恒等路径导致一开始网络就不具备“弱恒等”的性质。实际训练中很多深层ResNet会在残差分支后面加一个可学习的缩放因子或者手动乘以一个常数比如0.1或0.5。这相当于给残差更新加了一个学习率权重让网络前期更多依赖恒等通路后期再逐步放大残差影响。我实验下来对于超过100层的网络残差分支乘以0.5就能明显减少训练初期的loss震荡如果用到ReZero或FixUp这类策略把缩放因子设成0再慢慢学效果会更稳。注意这个缩放因子不要加到恒等路径上否则会破坏梯度保底通路。6.2 预激活结构Pre-activation与顺序ResNet还有一个工程细节值得展开块内操作的顺序。原始ResNet基本块的结构是conv - BN - ReLU - conv - BN - ReLU - add而后来常用的预激活版本是BN - ReLU - conv - BN - ReLU - conv - add。两种结构在数学上都满足x F(x)但预激活版本把BN和ReLU挪到了卷积之前相当于让恒等路径不再经过激活函数恒等通路变得更“干净”。我在自己的实验里对比过这两种写法。数据集和训练轮数完全相同的情况下预激活版本在深层网络上的收敛速度更快最终准确率也略高一点。尤其在梯度消失敏感的场景预激活结构明显更稳定。6.3 尺寸不匹配时的shortcut选择当网络需要降采样时比如特征图尺寸减半、通道数翻倍残差块的维度就对不上了。这时很多人会纠结用什么shortcut。我的建议排序是优先保证恒等路径不经过复杂变换能投影就不要零填充必须改变维度时用stride2的1x1卷积shortcut它可以同时改变空间尺寸和通道数零填充虽然实现简单但会破坏信息保真度不推荐在深层网络中使用。维度匹配看起来只是工程问题但它直接决定了恒等通路是否真正“恒等”因此也影响着梯度传播的质量。6.4 常见问题速查表现象可能原因排查建议深层网络训练loss不降残差分支初始幅度过大恒等路径被压过给残差分支加0.1或0.5的缩放因子训练初期loss剧烈震荡学习率过高残差分支过强降低学习率增加warmup深层网络出现NaNBN统计不稳定恒等路径受ReLU影响切换为预激活结构检查输入归一化浅层梯度接近0残差连接被投影矩阵干扰检查shortcut是否用了1x1卷积尽量保持纯恒等收敛速度慢残差分支缩放过小逐渐增大缩放因子或用可学习缩放这个速查表是我多次复现深层网络时积累出来的。很多时候问题不是出在数学公式上而是出在“恒等路径被某个看似不起眼的操作污染了”。6.5 学习率与残差结构之间的配合还有一个容易被忽略的点残差网络对学习率的容忍度比传统深层网络高得多。同样是40层网络无残差时需要把学习率压到很低才能勉强训练有残差时用大一个量级的学习率也不会直接发散收敛速度还快得多。背后的逻辑是残差让浅层梯度不再随深度指数衰减因此优化器对浅层参数的更新量可以和深层参数保持在相近量级。以前为了照顾浅层而不得不压低全局学习率现在这个限制被放宽了训练效率自然就上来了。7. 我个人在实际操作中的一点体会整个ResNet的数学原理学习下来我最深的体会是不要神化残差结构它并不是什么复杂的高深设计只是把“乘法链路”改成了“乘法加法链路”给梯度提供了一条保底通路。传统恒等映射要求网络在参数空间里找到一个极其苛刻的解残差映射则把这个任务拆解成“先学会什么都不做再逐步学习修正量”这种渐进式的优化策略在工程上被证明非常有效。如果你现在手头有一个加深后不收敛的网络不要急着堆更多trick先检查结构里有没有残差连接残差连接是否保持干净。很多时候一个x F(x)的改动比调三个月参数更管用。残差思想的影响力也远不止于ResNet本身它几乎渗透到了现代深度学习的所有角落理解它的数学本质对你后面理解Transformer、扩散模型乃至各种新架构都会有直接的帮助。