动手学深度学习|ResNet 的梯度计算超详细讲解:为什么残差连接能让反向传播更顺畅?

张开发
2026/4/21 2:15:55 15 分钟阅读

分享文章

动手学深度学习|ResNet 的梯度计算超详细讲解:为什么残差连接能让反向传播更顺畅?
前一篇主要讲了ResNet 是什么残差连接长什么样为什么能训练更深网络而这一篇就专门回答一个更深入的问题ResNet 到底为什么更容易反向传播梯度是怎么传的前言在上一篇文章中我们已经知道ResNet 的核心是残差连接Residual Connection即y F(x) x这个结构看起来很简单就是把输入 (x) 直接加到卷积分支输出 (F(x)) 上。但是ResNet 真正厉害的地方不只是“前向传播多了一条路”而是它对反向传播也产生了巨大影响。很多同学第一次学 ResNet 时都会有这样一个疑问为什么普通深层网络越深越难训练为什么加了一条 shortcut 之后网络 suddenly 就好训了ResNet 的梯度到底是怎么算的残差连接为什么能缓解梯度消失这篇文章我们就专门把ResNet 的梯度传播机制讲清楚。一、先回忆普通神经网络为什么会出现梯度问题这就带来了一个问题1. 如果每层导数都小于 1那连乘很多次后就会越来越小最后接近 0。这就是梯度消失。2. 如果每层导数都大于 1那连乘很多次后就会越来越大最后数值爆炸。这就是梯度爆炸。所以深层网络训练难一个根本原因就是梯度在层与层之间传递时很容易因为连乘而衰减或爆炸。二、ResNet 的前向传播公式是什么三、ResNet 的梯度为什么特别关键因为 ResNet 之所以能训练很深本质上靠的就是梯度除了经过复杂卷积分支还可以沿着 shortcut 直接往前传。普通网络的梯度传播只有一条主路。而 ResNet 的梯度传播有两部分来源一部分来自残差分支 (F(x))一部分来自恒等映射 (x)这就让梯度传播多了一条“直通车道”。四、ResNet 的梯度怎么推导五、这个公式到底说明了什么1. 即使残差分支梯度很小梯度也不会完全消失2. 梯度传播不再完全依赖复杂卷积变换普通网络中梯度必须穿过每一层复杂变换风险很大。ResNet 中梯度除了过残差分支还能直接通过 shortcut。这就相当于普通网络只能走弯弯绕绕的小路ResNet旁边多了一条高速路所以反向传播自然更顺。六、把多个残差块连起来看会发生什么七、多个残差块反向传播时为什么更稳定八、为什么说 ResNet 缓解了梯度消失而不是彻底消灭这个说法要严谨一点。很多教材会说ResNet 解决了梯度消失问题。更准确地讲其实是ResNet 显著缓解了梯度消失使深层网络更容易优化。因为残差分支本身依然可能出现梯度衰减BN、ReLU、权重初始化等因素仍然会影响训练只是 shortcut 提供了额外的梯度通路减少了梯度“全断”的风险所以不要理解成 ResNet 一出场梯度问题就彻底不存在了。更准确的表述是ResNet 让梯度传播变得更顺畅、更稳健。九、从“函数学习”角度看为什么残差更容易学十、用一句最直白的话理解 ResNet 的梯度优势如果你想把这一节讲给别人听可以直接说普通网络反向传播时梯度必须一层一层硬传而 ResNet 里梯度可以顺着 shortcut 直接往前走所以深层网络更容易训练。这句话非常够用了。十一、PyTorch 代码里残差梯度体现在哪我们之前写过一个残差块import torch from torch import nn import torch.nn.functional as F class Residual(nn.Module): def __init__(self, in_channels, out_channels, use_1x1convFalse, strides1): super().__init__() self.conv1 nn.Conv2d(in_channels, out_channels, kernel_size3, padding1, stridestrides) self.conv2 nn.Conv2d(out_channels, out_channels, kernel_size3, padding1) self.bn1 nn.BatchNorm2d(out_channels) self.bn2 nn.BatchNorm2d(out_channels) if use_1x1conv: self.conv3 nn.Conv2d(in_channels, out_channels, kernel_size1, stridestrides) else: self.conv3 None def forward(self, x): y F.relu(self.bn1(self.conv1(x))) y self.bn2(self.conv2(y)) if self.conv3: x self.conv3(x) y x return F.relu(y)这里最关键的一行还是y x十二、为什么 shortcut 最好是恒等映射十三、ResNet 梯度传播和普通网络的本质区别我们做个对比就非常清楚了。普通网络输出大致是[y f(x)]反向传播十四、学习 ResNet 梯度这一节最该抓住什么十五、总结ResNet 的梯度传播机制最核心的本质就是梯度不必完全依赖复杂卷积分支而可以通过 shortcut 直接往前传。因此残差连接带来了三大好处1. 梯度传播更顺畅减少深层网络中的梯度消失风险。2. 信息传递更稳定前层特征不会轻易被后面层完全“洗掉”。3. 优化更容易网络只需要学习“修正量”而不是从头学习完整映射。所以 ResNet 真正强大的地方不只是“多了一条连接”而是这条连接同时优化了前向信息流和反向梯度流。十六、结尾很多时候一个模型真正伟大的地方不在于公式多复杂而在于它是否抓住了训练中的关键瓶颈。ResNet 就是这样。它通过一个看起来很简单的式子y F(x) x彻底改变了深层网络的训练方式。也正因为如此残差连接直到今天仍然是深度学习里最重要的基础思想之一。

更多文章